diff --git a/.luacheckrc b/.luacheckrc index be8e4bbf..2be56e80 100644 --- a/.luacheckrc +++ b/.luacheckrc @@ -20,5 +20,8 @@ read_globals = { -- Overwrites minetest.handle_node_drops 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. files["mods/default/legacy.lua"].global = false diff --git a/game_api.txt b/game_api.txt index 52c64f4c..3f311336 100644 --- a/game_api.txt +++ b/game_api.txt @@ -93,16 +93,21 @@ For example, is used to show all tools. Name is used in the sfinv page name, title is the human readable title. -`is_enabled_for` is used to check whether a player is in creative mode: - - creative.is_enabled_for(name) - -Override this to allow per-player game modes. +Creative provides `creative.is_enabled_for(name)`, which is identical in +functionality to the engine's `minetest.creative_is_enabled(name)`. +Its use is deprecated and it should also not be overriden. 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 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 ---------- @@ -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. * Key: The name of the player. * 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)` * Registers new chest - * `name` Name for chest + * `name` Name for chest e.g. "default:chest" * `def` See [#Chest Definition] ### Chest Definition @@ -424,7 +429,7 @@ Give Initial Stuff 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)` * 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. * 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 { @@ -467,7 +478,7 @@ The player API can register player models and update the player's appearence -- = {x = , y = }, foo = {x = 0, y = 19}, bar = {x = 20, y = 39}, - -- ... + -- ... }, collisionbox = {-0.3, 0.0, -0.3, 0.3, 1.7, 0.3}, -- In nodes from feet position stepheight = 0.6, -- In nodes diff --git a/mods/beds/beds.lua b/mods/beds/beds.lua index 276c05e5..dc044a35 100644 --- a/mods/beds/beds.lua +++ b/mods/beds/beds.lua @@ -79,10 +79,10 @@ beds.register_bed("beds:bed", { } }, nodebox = { - bottom = {-0.5, -0.5, -0.5, 0.5, 0.06, 0.5}, - top = {-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.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 = { {"wool:white", "wool:white", "wool:white"}, {"group:wood", "group:wood", "group:wood"} diff --git a/mods/beds/functions.lua b/mods/beds/functions.lua index 0b79bfb5..019c123a 100644 --- a/mods/beds/functions.lua +++ b/mods/beds/functions.lua @@ -74,10 +74,10 @@ local function lay_down(player, pos, bed_pos, state, skip) -- physics, eye_offset, etc 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) - default.player_attached[name] = false + player_api.player_attached[name] = false player:set_physics_override(1, 1, 1) hud_flags.wielditem = true - default.player_set_animation(player, "stand" , 30) + player_api.set_animation(player, "stand" , 30) -- lay down else @@ -90,12 +90,18 @@ local function lay_down(player, pos, bed_pos, state, skip) local yaw, param2 = get_look_yaw(bed_pos) player:set_look_horizontal(yaw) 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_pos(p) - default.player_attached[name] = true + player_api.player_attached[name] = true hud_flags.wielditem = false - default.player_set_animation(player, "lay" , 0) + player_api.set_animation(player, "lay" , 0) end player:hud_set_flags(hud_flags) diff --git a/mods/beds/locale/beds.id.tr b/mods/beds/locale/beds.id.tr new file mode 100644 index 00000000..401a1622 --- /dev/null +++ b/mods/beds/locale/beds.id.tr @@ -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 diff --git a/mods/beds/locale/beds.zh_TW.tr b/mods/beds/locale/beds.zh_TW.tr new file mode 100644 index 00000000..4e7d6875 --- /dev/null +++ b/mods/beds/locale/beds.zh_TW.tr @@ -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.=你只能在晚上睡覺。 + diff --git a/mods/beds/locale/template.txt b/mods/beds/locale/template.txt index 518fdbff..9dd9c5cd 100644 --- a/mods/beds/locale/template.txt +++ b/mods/beds/locale/template.txt @@ -1,8 +1,8 @@ # textdomain: beds -Fancy Bed= -Simple Bed= Leave Bed= Good morning.= @1 of @2 players are in bed= Force night skip= You can only sleep at night.= +Fancy Bed= +Simple Bed= diff --git a/mods/binoculars/locale/binoculars.id.tr b/mods/binoculars/locale/binoculars.id.tr new file mode 100644 index 00000000..b1eb6d51 --- /dev/null +++ b/mods/binoculars/locale/binoculars.id.tr @@ -0,0 +1,3 @@ +# textdomain: binoculars +Binoculars=Binokular +Use with 'Zoom' key=Pakai dengan tombol 'Zum' diff --git a/mods/binoculars/locale/binoculars.zh_TW.tr b/mods/binoculars/locale/binoculars.zh_TW.tr new file mode 100644 index 00000000..bbe3b390 --- /dev/null +++ b/mods/binoculars/locale/binoculars.zh_TW.tr @@ -0,0 +1,3 @@ +# textdomain: binoculars +Binoculars=望遠鏡 +Use with 'Zoom' key=與“縮放”鍵一起使用 diff --git a/mods/boats/locale/boats.id.tr b/mods/boats/locale/boats.id.tr new file mode 100644 index 00000000..cf37f476 --- /dev/null +++ b/mods/boats/locale/boats.id.tr @@ -0,0 +1,4 @@ +# textdomain: boats +Boat cruise mode on=Mode perahu jelajah nyala +Boat cruise mode off=Mode perahu jelajah mati +Boat=Perahu diff --git a/mods/boats/locale/boats.zh_CN.tr b/mods/boats/locale/boats.zh_CN.tr index 5fee7767..254f2dfc 100644 --- a/mods/boats/locale/boats.zh_CN.tr +++ b/mods/boats/locale/boats.zh_CN.tr @@ -1,4 +1,4 @@ # textdomain: boats -Boat cruise mode on=船巡航模式开 -Boat cruise mode off=船巡航模式关 +Boat cruise mode on=巡航模式开启 +Boat cruise mode off=巡航模式关闭 Boat=船 diff --git a/mods/boats/locale/boats.zh_TW.tr b/mods/boats/locale/boats.zh_TW.tr new file mode 100644 index 00000000..97b34711 --- /dev/null +++ b/mods/boats/locale/boats.zh_TW.tr @@ -0,0 +1,4 @@ +# textdomain: boats +Boat cruise mode on=巡航模式開啟 +Boat cruise mode off=巡航模式關閉 +Boat=船 diff --git a/mods/bones/locale/bones.id.tr b/mods/bones/locale/bones.id.tr new file mode 100644 index 00000000..3c81accf --- /dev/null +++ b/mods/bones/locale/bones.id.tr @@ -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 diff --git a/mods/bones/locale/bones.zh_TW.tr b/mods/bones/locale/bones.zh_TW.tr new file mode 100644 index 00000000..1a94d2f1 --- /dev/null +++ b/mods/bones/locale/bones.zh_TW.tr @@ -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的骨骸 diff --git a/mods/bucket/init.lua b/mods/bucket/init.lua index 2cf431ca..ebdf2e74 100644 --- a/mods/bucket/init.lua +++ b/mods/bucket/init.lua @@ -225,3 +225,16 @@ minetest.register_craft({ 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 diff --git a/mods/bucket/locale/bucket.id.tr b/mods/bucket/locale/bucket.id.tr new file mode 100644 index 00000000..56625638 --- /dev/null +++ b/mods/bucket/locale/bucket.id.tr @@ -0,0 +1,5 @@ +# textdomain: bucket +Empty Bucket=Ember Kosong +Water Bucket=Ember Air +River Water Bucket=Ember Air Sungai +Lava Bucket=Ember Lava diff --git a/mods/bucket/locale/bucket.zh_CN.tr b/mods/bucket/locale/bucket.zh_CN.tr index 24660e4d..fda5bfcd 100644 --- a/mods/bucket/locale/bucket.zh_CN.tr +++ b/mods/bucket/locale/bucket.zh_CN.tr @@ -2,4 +2,4 @@ Empty Bucket=空桶 Water Bucket=水桶 River Water Bucket=河水桶 -Lava Bucket=熔岩桶 +Lava Bucket=岩浆桶 diff --git a/mods/bucket/locale/bucket.zh_TW.tr b/mods/bucket/locale/bucket.zh_TW.tr new file mode 100644 index 00000000..965d6575 --- /dev/null +++ b/mods/bucket/locale/bucket.zh_TW.tr @@ -0,0 +1,5 @@ +# textdomain: bucket +Empty Bucket=空桶 +Water Bucket=水桶 +River Water Bucket=河水桶 +Lava Bucket=岩漿桶 diff --git a/mods/bucket/mod.conf b/mods/bucket/mod.conf index 1c60a099..fef46873 100644 --- a/mods/bucket/mod.conf +++ b/mods/bucket/mod.conf @@ -1,3 +1,4 @@ name = bucket description = Minetest Game mod: bucket depends = default +optional_depends = dungeon_loot diff --git a/mods/butterflies/locale/butterflies.id.tr b/mods/butterflies/locale/butterflies.id.tr new file mode 100644 index 00000000..d4429a6c --- /dev/null +++ b/mods/butterflies/locale/butterflies.id.tr @@ -0,0 +1,4 @@ +# textdomain: butterflies +White Butterfly=Kupu-Kupu Putih +Red Butterfly=Kupu-Kupu Merah +Violet Butterfly=Kupu-Kupu Ungu diff --git a/mods/butterflies/locale/butterflies.zh_TW.tr b/mods/butterflies/locale/butterflies.zh_TW.tr new file mode 100644 index 00000000..8d927c18 --- /dev/null +++ b/mods/butterflies/locale/butterflies.zh_TW.tr @@ -0,0 +1,4 @@ +# textdomain: butterflies +White Butterfly=白蝴蝶 +Red Butterfly=紅蝴蝶 +Violet Butterfly=紫蝴蝶 diff --git a/mods/carts/cart_entity.lua b/mods/carts/cart_entity.lua index 3c131a66..4ff87d26 100644 --- a/mods/carts/cart_entity.lua +++ b/mods/carts/cart_entity.lua @@ -67,6 +67,7 @@ end function cart_entity:on_detach_child(child) if child and child:get_player_name() == self.driver then self.driver = nil + carts:manage_attachment(child, nil) end end @@ -327,11 +328,10 @@ local function rail_on_step(self, dtime) if self.punched then -- Collect dropped items for _, obj_ in pairs(minetest.get_objects_inside_radius(pos, 1)) do - if not obj_:is_player() and - obj_:get_luaentity() and - not obj_:get_luaentity().physical_state and - obj_:get_luaentity().name == "__builtin:item" then - + local ent = obj_:get_luaentity() + -- Careful here: physical_state and disable_physics are item-internal APIs + if ent and ent.name == "__builtin:item" and ent.physical_state then + ent:disable_physics() 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_ end @@ -389,8 +389,8 @@ minetest.register_entity("carts:cart", cart_entity) minetest.register_craftitem("carts:cart", { 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"), - wield_image = "carts_cart_side.png", + inventory_image = minetest.inventorycube("carts_cart_top.png", "carts_cart_front.png", "carts_cart_side.png"), + wield_image = "carts_cart_front.png", on_place = function(itemstack, placer, pointed_thing) local under = pointed_thing.under local node = minetest.get_node(under) @@ -414,7 +414,7 @@ minetest.register_craftitem("carts:cart", { end 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 and creative.is_enabled_for(placer:get_player_name())) then diff --git a/mods/carts/init.lua b/mods/carts/init.lua index a5aa9cb5..69d59d9f 100644 --- a/mods/carts/init.lua +++ b/mods/carts/init.lua @@ -19,3 +19,10 @@ carts.path_distance_max = 3 dofile(carts.modpath.."/functions.lua") dofile(carts.modpath.."/rails.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 diff --git a/mods/carts/locale/carts.id.tr b/mods/carts/locale/carts.id.tr new file mode 100644 index 00000000..17edc807 --- /dev/null +++ b/mods/carts/locale/carts.id.tr @@ -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) diff --git a/mods/carts/locale/carts.zh_CN.tr b/mods/carts/locale/carts.zh_CN.tr index 06c0cdd7..953cdefc 100644 --- a/mods/carts/locale/carts.zh_CN.tr +++ b/mods/carts/locale/carts.zh_CN.tr @@ -1,6 +1,6 @@ # textdomain: carts Cart=矿车 (Sneak+Click to pick up)=(潜行+单击以捡起) -Rail=铁路 -Powered Rail=动力铁路 -Brake Rail=制动铁路 +Rail=铁轨 +Powered Rail=动力铁轨 +Brake Rail=制动铁轨 diff --git a/mods/carts/locale/carts.zh_TW.tr b/mods/carts/locale/carts.zh_TW.tr new file mode 100644 index 00000000..f6300d4a --- /dev/null +++ b/mods/carts/locale/carts.zh_TW.tr @@ -0,0 +1,6 @@ +# textdomain: carts +Cart=礦車 +(Sneak+Click to pick up)=(潛行+單擊以撿起) +Rail=鐵軌 +Powered Rail=動力鐵軌 +Brake Rail=制動鐵軌 diff --git a/mods/carts/locale/template.txt b/mods/carts/locale/template.txt index a67d95fd..d7fd9f45 100644 --- a/mods/carts/locale/template.txt +++ b/mods/carts/locale/template.txt @@ -1,6 +1,6 @@ # textdomain: carts -Cart= -(Sneak+Click to pick up)= Rail= Powered Rail= Brake Rail= +Cart= +(Sneak+Click to pick up)= diff --git a/mods/carts/mod.conf b/mods/carts/mod.conf index 20357e3e..0eab35c3 100644 --- a/mods/carts/mod.conf +++ b/mods/carts/mod.conf @@ -1,3 +1,4 @@ name = carts description = Carts (formerly boost_cart) depends = default, player_api +optional_depends = dungeon_loot diff --git a/mods/carts/models/carts_cart.b3d b/mods/carts/models/carts_cart.b3d index 4e7eba36..b8b7c3a1 100644 Binary files a/mods/carts/models/carts_cart.b3d and b/mods/carts/models/carts_cart.b3d differ diff --git a/mods/carts/models/carts_cart.blend b/mods/carts/models/carts_cart.blend index 7d2515eb..3446fb15 100644 Binary files a/mods/carts/models/carts_cart.blend and b/mods/carts/models/carts_cart.blend differ diff --git a/mods/carts/textures/carts_cart.png b/mods/carts/textures/carts_cart.png index 965347c0..29e21def 100644 Binary files a/mods/carts/textures/carts_cart.png and b/mods/carts/textures/carts_cart.png differ diff --git a/mods/carts/textures/carts_rail_crossing_brk.png b/mods/carts/textures/carts_rail_crossing_brk.png index 0bf455ef..14d4e1a9 100644 Binary files a/mods/carts/textures/carts_rail_crossing_brk.png and b/mods/carts/textures/carts_rail_crossing_brk.png differ diff --git a/mods/carts/textures/carts_rail_curved_brk.png b/mods/carts/textures/carts_rail_curved_brk.png index ca407236..c5affd80 100644 Binary files a/mods/carts/textures/carts_rail_curved_brk.png and b/mods/carts/textures/carts_rail_curved_brk.png differ diff --git a/mods/carts/textures/carts_rail_straight_brk.png b/mods/carts/textures/carts_rail_straight_brk.png index 0c690529..7853ac89 100644 Binary files a/mods/carts/textures/carts_rail_straight_brk.png and b/mods/carts/textures/carts_rail_straight_brk.png differ diff --git a/mods/carts/textures/carts_rail_t_junction_brk.png b/mods/carts/textures/carts_rail_t_junction_brk.png index 6b4f6faa..8e3f6201 100644 Binary files a/mods/carts/textures/carts_rail_t_junction_brk.png and b/mods/carts/textures/carts_rail_t_junction_brk.png differ diff --git a/mods/creative/init.lua b/mods/creative/init.lua index a1d57c88..31af37c0 100644 --- a/mods/creative/init.lua +++ b/mods/creative/init.lua @@ -27,16 +27,25 @@ minetest.register_privilege("creative", { 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) - return creative_mode_cache or - minetest.check_player_privs(name, {creative = true}) + return minetest.is_creative_enabled(name) end 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 -- 'maxlevel' and node 'level'. Digtime is divided by the larger of -- leveldiff and 1. diff --git a/mods/creative/inventory.lua b/mods/creative/inventory.lua index 5b36f533..e22cfc17 100644 --- a/mods/creative/inventory.lua +++ b/mods/creative/inventory.lua @@ -25,7 +25,9 @@ function creative.init_creative_inventory(player) player_inventory[player_name] = { size = 0, 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, { @@ -59,6 +61,7 @@ function creative.init_creative_inventory(player) return player_inventory[player_name] end +local NO_MATCH = 999 local function match(s, filter) if filter == "" then return 0 @@ -66,7 +69,15 @@ local function match(s, filter) if s:lower():find(filter, 1, true) then return #s - #filter 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 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)) 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 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 order = {} for name, def in pairs(items) do - local m = match(def.description, inv.filter) or match(def.name, inv.filter) - if m then + local m = match(description(def), inv.filter) + 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 - -- 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 end end @@ -119,8 +149,7 @@ function creative.register_tab(name, title, items) local player_name = player:get_player_name() creative.update_creative_inventory(player_name, items) local inv = player_inventory[player_name] - local start_i = inv.start_i or 0 - local pagenum = math.floor(start_i / (4*8) + 1) + local pagenum = math.floor(inv.start_i / (4*8) + 1) local pagemax = math.ceil(inv.size / (4*8)) local esc = minetest.formspec_escape 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[0.3,4.2;2.8,1.2;creative_filter;;" .. esc(inv.filter) .. "]" .. "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) end, on_enter = function(self, player, context) @@ -161,13 +190,11 @@ function creative.register_tab(name, title, items) if fields.creative_clear then inv.start_i = 0 inv.filter = "" - creative.update_creative_inventory(player_name, items) sfinv.set_player_inventory_formspec(player, context) elseif fields.creative_search or fields.key_enter_field == "creative_filter" then inv.start_i = 0 inv.filter = fields.creative_filter:lower() - creative.update_creative_inventory(player_name, items) sfinv.set_player_inventory_formspec(player, context) elseif not fields.quit then local start_i = inv.start_i or 0 @@ -194,10 +221,30 @@ function creative.register_tab(name, title, items) }) 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("nodes", S("Nodes"), minetest.registered_nodes) -creative.register_tab("tools", S("Tools"), minetest.registered_tools) -creative.register_tab("craftitems", S("Items"), minetest.registered_craftitems) +creative.register_tab("nodes", S("Nodes"), registered_nodes) +creative.register_tab("tools", S("Tools"), registered_tools) +creative.register_tab("craftitems", S("Items"), registered_craftitems) local old_homepage_name = sfinv.get_homepage_name function sfinv.get_homepage_name(player) diff --git a/mods/creative/locale/creative.id.tr b/mods/creative/locale/creative.id.tr new file mode 100644 index 00000000..eaf34051 --- /dev/null +++ b/mods/creative/locale/creative.id.tr @@ -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 diff --git a/mods/creative/locale/creative.zh_TW.tr b/mods/creative/locale/creative.zh_TW.tr new file mode 100644 index 00000000..c5746d40 --- /dev/null +++ b/mods/creative/locale/creative.zh_TW.tr @@ -0,0 +1,10 @@ +# textdomain: creative +Allow player to use creative inventory=允許玩家使用創造模式物品欄 +Search=搜索 +Reset=重置 +Previous page=上一頁 +Next page=下一頁 +All=所有 +Nodes=節點 +Tools=工具 +Items=物品 diff --git a/mods/creative/locale/template.txt b/mods/creative/locale/template.txt index 3e79730c..356102da 100644 --- a/mods/creative/locale/template.txt +++ b/mods/creative/locale/template.txt @@ -1,5 +1,4 @@ # textdomain: creative -Allow player to use creative inventory= Search= Reset= Previous page= @@ -8,3 +7,4 @@ All= Nodes= Tools= Items= +Allow player to use creative inventory= diff --git a/mods/default/README.txt b/mods/default/README.txt index e822663f..a2eaebd9 100644 --- a/mods/default/README.txt +++ b/mods/default/README.txt @@ -151,7 +151,6 @@ BlockMen (CC BY-SA 3.0): default_chest_top.png default_mineral_mese.png default_meselamp.png - bubble.png gui_formbg.png gui_furnace_arrow_bg.png gui_furnace_arrow_fg.png @@ -196,9 +195,6 @@ Gambit (CC BY-SA 3.0): asl97 (CC BY-SA 3.0): default_ice.png -KevDoy (CC BY-SA 3.0): - heart.png - Pithydon (CC BY-SA 3.0) default_coral_brown.png default_coral_orange.png @@ -253,6 +249,11 @@ Topywo (CC BY-SA 3.0) Extex101 (CC BY-SA 3.0) 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 @@ -357,6 +358,10 @@ Angel_Perez_Grandi (CC BY 3.0): https://freesound.org/people/Angel_Perez_Grandi/sounds/49190/ default_ice_dug.ogg +iankath (CC0 1.0) +https://freesound.org/people/iankath/sounds/173991/ + default_furnace_active.ogg + Models ------ diff --git a/mods/default/chests.lua b/mods/default/chests.lua index b401d916..f4462ae7 100644 --- a/mods/default/chests.lua +++ b/mods/default/chests.lua @@ -44,9 +44,10 @@ function default.chest.chest_lid_close(pn) end 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 }) - 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 default.chest.open_chests = {} @@ -75,7 +76,8 @@ minetest.register_on_leaveplayer(function(player) 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) def.drawtype = "mesh" def.visual = "mesh" @@ -128,10 +130,10 @@ function default.chest.register_chest(name, d) end 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 minetest.swap_node(pos, - { name = "default:" .. name .. "_open", + { name = name .. "_open", param2 = node.param2 }) end minetest.after(0.2, minetest.show_formspec, @@ -199,10 +201,10 @@ function default.chest.register_chest(name, d) end def.on_rightclick = function(pos, node, clicker) 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 minetest.swap_node(pos, { - name = "default:" .. name .. "_open", + name = name .. "_open", param2 = node.param2 }) end minetest.after(0.2, minetest.show_formspec, @@ -214,7 +216,7 @@ function default.chest.register_chest(name, d) def.on_blast = function(pos) local drops = {} default.get_inventory_drops(pos, "main", drops) - drops[#drops+1] = "default:" .. name + drops[#drops+1] = name minetest.remove_node(pos) return drops end @@ -247,7 +249,7 @@ function default.chest.register_chest(name, d) def_opened.tiles[i].backface_culling = true end end - def_opened.drop = "default:" .. name + def_opened.drop = name def_opened.groups.not_in_creative_inventory = 1 def_opened.selection_box = { type = "fixed", @@ -264,29 +266,31 @@ function default.chest.register_chest(name, d) def_closed.tiles[5] = def.tiles[3] -- drawtype to make them match the mesh def_closed.tiles[3] = def.tiles[3].."^[transformFX" - minetest.register_node("default:" .. name, def_closed) - minetest.register_node("default:" .. name .. "_open", def_opened) + minetest.register_node(prefixed_name, def_closed) + minetest.register_node(prefixed_name .. "_open", def_opened) -- convert old chests to this new variant - minetest.register_lbm({ - label = "update chests to opening chests", - name = "default:upgrade_" .. name .. "_v2", - nodenames = {"default:" .. name}, - action = function(pos, node) - local meta = minetest.get_meta(pos) - meta:set_string("formspec", nil) - local inv = meta:get_inventory() - local list = inv:get_list("default:chest") - if list then - inv:set_size("main", 8*4) - inv:set_list("main", list) - inv:set_list("default:chest", nil) + if name == "default:chest" or name == "default:chest_locked" then + minetest.register_lbm({ + label = "update chests to opening chests", + name = "default:upgrade_" .. name:sub(9,-1) .. "_v2", + nodenames = {name}, + action = function(pos, node) + local meta = minetest.get_meta(pos) + meta:set_string("formspec", nil) + local inv = meta:get_inventory() + local list = inv:get_list("default:chest") + if list then + inv:set_size("main", 8*4) + inv:set_list("main", list) + inv:set_list("default:chest", nil) + end end - end - }) + }) + end end -default.chest.register_chest("chest", { +default.chest.register_chest("default:chest", { description = S("Chest"), tiles = { "default_chest_top.png", @@ -302,7 +306,7 @@ default.chest.register_chest("chest", { 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"), tiles = { "default_chest_top.png", diff --git a/mods/default/crafting.lua b/mods/default/crafting.lua index bc436fc5..ecbe9d12 100644 --- a/mods/default/crafting.lua +++ b/mods/default/crafting.lua @@ -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({ output = "default:obsidian", recipe = { diff --git a/mods/default/functions.lua b/mods/default/functions.lua index 5794afd7..41a943b1 100644 --- a/mods/default/functions.lua +++ b/mods/default/functions.lua @@ -155,7 +155,7 @@ default.cool_lava = function(pos, node) minetest.set_node(pos, {name = "default:stone"}) end 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 if minetest.settings:get_bool("enable_lavacooling") ~= false then @@ -224,7 +224,12 @@ end function default.grow_papyrus(pos, node) pos.y = pos.y - 1 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 end if not minetest.find_node_near(pos, 3, {"group:water"}) then @@ -261,7 +266,17 @@ minetest.register_abm({ minetest.register_abm({ label = "Grow 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, chance = 71, action = function(...) @@ -420,6 +435,51 @@ function default.register_fence_rail(name, def) minetest.register_node(name, def) 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 @@ -447,6 +507,9 @@ local function leafdecay_after_destruct(pos, oldnode, def) end end +local movement_gravity = tonumber( + minetest.settings:get("movement_gravity")) or 9.81 + local function leafdecay_on_timer(pos, def) if minetest.find_node_near(pos, def.radius, def.trunks) then return false @@ -473,6 +536,21 @@ local function leafdecay_on_timer(pos, def) minetest.remove_node(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 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({ @@ -506,6 +584,7 @@ minetest.register_abm({ neighbors = { "air", "group:grass", + "group:dry_grass", "default:snow", }, interval = 6, @@ -534,6 +613,8 @@ minetest.register_abm({ minetest.set_node(pos, {name = "default:dirt_with_snow"}) elseif minetest.get_item_group(name, "grass") ~= 0 then 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 }) diff --git a/mods/default/furnace.lua b/mods/default/furnace.lua index 3c4ac9c8..b63a8695 100644 --- a/mods/default/furnace.lua +++ b/mods/default/furnace.lua @@ -113,6 +113,9 @@ local function furnace_node_timer(pos, elapsed) local srclist, fuellist 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 fuel @@ -154,6 +157,9 @@ local function furnace_node_timer(pos, elapsed) else dst_full = true end + -- Play cooling sound + minetest.sound_play("default_cool_lava", + {pos = pos, max_hear_distance = 16, gain = 0.1}, true) else -- Item could not be cooked: probably missing fuel update = true @@ -237,6 +243,12 @@ local function furnace_node_timer(pos, elapsed) swap_node(pos, "default:furnace_active") -- make sure timer restarts automatically 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 if fuellist and not fuellist[1]:is_empty() then fuel_state = S("@1%", 0) @@ -245,6 +257,7 @@ local function furnace_node_timer(pos, elapsed) swap_node(pos, "default:furnace") -- stop timer on the inactive furnace minetest.get_node_timer(pos):stop() + meta:set_int("timer_elapsed", 0) end diff --git a/mods/default/item_entity.lua b/mods/default/item_entity.lua index 2a61f08e..d9bf7b19 100644 --- a/mods/default/item_entity.lua +++ b/mods/default/item_entity.lua @@ -15,12 +15,12 @@ local item = { burn_up = function(self) -- disappear in a smoke puff - self.object:remove() local p = self.object:get_pos() + self.object:remove() minetest.sound_play("default_item_smoke", { pos = p, max_hear_distance = 8, - }) + }, true) minetest.add_particlespawner({ amount = 3, time = 0.1, @@ -39,16 +39,20 @@ local item = { }) end, - on_step = function(self, dtime) - builtin_item.on_step(self, dtime) + on_step = function(self, dtime, ...) + builtin_item.on_step(self, dtime, ...) if self.flammable then - -- flammable, check for igniters + -- flammable, check for igniters every 10 s self.ignite_timer = (self.ignite_timer or 0) + dtime if self.ignite_timer > 10 then 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 return end diff --git a/mods/default/license.txt b/mods/default/license.txt index fecb1eb8..3c95c1b4 100644 --- a/mods/default/license.txt +++ b/mods/default/license.txt @@ -51,6 +51,7 @@ Copyright (C) 2010-2018: Mossmanikin random-geek Extex101 + An0n3m0us You are free to: Share — copy and redistribute the material in any medium or format. diff --git a/mods/default/locale/default.de.tr b/mods/default/locale/default.de.tr index c842b85c..9a3b8bdb 100644 --- a/mods/default/locale/default.de.tr +++ b/mods/default/locale/default.de.tr @@ -62,12 +62,12 @@ Obsidian Block=Obsidianblock Dirt=Erde Dirt with Grass=Erde mit Gras 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 Rainforest Litter=Erde mit Regenwaldboden Dirt with Coniferous Litter=Erde mit Nadelwaldboden -Dry Dirt=Trockene Erde -Dry Dirt with Dry Grass=Trockene Erde mit trockenem Gras +Savanna Dirt=Savannenerde +Savanna Dirt with Savanna Grass=Savannenerde mit Savannengras Permafrost=Permafrost Permafrost with Stones=Permafrost mit Steinen Permafrost with Moss=Permafrost mit Moos @@ -124,7 +124,7 @@ Papyrus=Papyrus Dry Shrub=Trockener Busch Jungle Grass=Dschungelgras Grass=Gras -Dry Grass=Trockenes Gras +Savanna Grass=Savannengras Fern=Farn Marram Grass=Dünengras Bush Stem=Buschstamm diff --git a/mods/default/locale/default.id.tr b/mods/default/locale/default.id.tr new file mode 100644 index 00000000..7a0406c1 --- /dev/null +++ b/mods/default/locale/default.id.tr @@ -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 diff --git a/mods/default/locale/default.zh_CN.tr b/mods/default/locale/default.zh_CN.tr index 9fb4be95..ddd94713 100644 --- a/mods/default/locale/default.zh_CN.tr +++ b/mods/default/locale/default.zh_CN.tr @@ -1,8 +1,8 @@ # textdomain: default -Locked Chest=锁着的箱子 -Locked Chest (owned by @1)=锁着的箱子(由@1拥有) -You do not own this chest.=您不拥有该箱子。 -a locked chest=一个锁着的箱子 +Locked Chest=已上锁的箱子 +Locked Chest (owned by @1)=已上锁的箱子(属于@1所有) +You do not own this chest.=这个箱子不属于你所有。 +a locked chest=一个已上锁的箱子 Chest=箱子 Stick=棒 Paper=纸 @@ -11,20 +11,20 @@ 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=金矿 +Coal Lump=煤块 +Iron Lump=铁块 +Copper Lump=铜块 +Tin Lump=锡块 +Mese Crystal=黄石晶体 +Gold Lump=金块 Diamond=钻石 -Clay Lump=粘土矿 +Clay Lump=粘土块 Steel Ingot=铁锭 Copper Ingot=铜锭 Tin Ingot=锡锭 Bronze Ingot=青铜锭 Gold Ingot=金锭 -Mese Crystal Fragment=黄石水晶碎片 +Mese Crystal Fragment=黄石晶体碎片 Clay Brick=粘土砖 Obsidian Shard=黑曜石碎片 Flint=燧石 @@ -34,50 +34,50 @@ Furnace is empty=熔炉是空的 @1%=@1% Empty=空 Not cookable=不可烹饪 -Furnace active=熔炉活跃 -Furnace inactive=熔炉非活跃 +Furnace active=熔炉正在运转 +Furnace inactive=熔炉未使用 (Item: @1; Fuel: @2)=(项目:@1;燃料:@2) Furnace=熔炉 Stone=石 Cobblestone=鹅卵石 Stone Brick=石砖 -Stone Block=石块 -Mossy Cobblestone=生苔的鹅卵石 +Stone Block=石方块 +Mossy Cobblestone=苔藓覆盖的鹅卵石 Desert Stone=沙漠石 Desert Cobblestone=沙漠鹅卵石 Desert Stone Brick=沙漠鹅卵石砖 -Desert Stone Block=沙漠鹅卵石块 +Desert Stone Block=沙漠鹅卵石方块 Sandstone=砂岩 Sandstone Brick=砂岩砖 -Sandstone Block=砂岩块 +Sandstone Block=砂岩方块 Desert Sandstone=沙漠砂岩 Desert Sandstone Brick=沙漠砂岩砖 -Desert Sandstone Block=沙漠砂岩块 +Desert Sandstone Block=沙漠砂岩方块 Silver Sandstone=银砂岩 Silver Sandstone Brick=银砂岩砖 -Silver Sandstone Block=银砂岩块 +Silver Sandstone Block=银砂岩方块 Obsidian=黑曜石 Obsidian Brick=黑曜石砖 -Obsidian Block=黑曜石块 +Obsidian Block=黑曜石方块 Dirt=土 Dirt with Grass=带草的土 Dirt with Grass and Footsteps=带草的土及脚印 -Dirt with Dry Grass=土和干草 -Dirt with Snow=土和雪 +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 Stones=带石头的多年冻土 Permafrost with Moss=生苔的多年冻土 Sand=沙 Desert Sand=沙漠沙 Silver Sand=银沙 -Gravel=砾石 +Gravel=沙砾 Clay=粘土 Snow=雪 -Snow Block=雪块 +Snow Block=雪方块 Ice=冰 Cave Ice=洞穴冰 Apple Tree=苹果树 @@ -103,26 +103,26 @@ Aspen Tree=白杨树 Aspen Wood Planks=白杨树木板 Aspen Tree Leaves=白杨树叶 Aspen Tree Sapling=白杨树树苗 -Coal Ore=煤矿石 -Coal Block=煤块 +Coal Ore=煤炭矿石 +Coal Block=煤炭方块 Iron Ore=铁矿石 -Steel Block=钢块 +Steel Block=钢方块 Copper Ore=铜矿石 -Copper Block=铜块 +Copper Block=铜方块 Tin Ore=锡矿石 -Tin Block=锡块 -Bronze Block=青铜块 +Tin Block=锡方块 +Bronze Block=青铜方块 Mese Ore=黄石矿石 -Mese Block=黄石块 +Mese Block=黄石方块 Gold Ore=金矿石 -Gold Block=金块 +Gold Block=金方块 Diamond Ore=钻石矿石 -Diamond Block=钻石块 +Diamond Block=钻石方块 Cactus=仙人掌 Large Cactus Seedling=大仙人掌苗 Papyrus=莎草纸 Dry Shrub=干灌木 -Jungle Grass=莦 +Jungle Grass=丛林草 Grass=草 Dry Grass=干草 Fern=蕨 @@ -148,20 +148,20 @@ Orange Coral=橙珊瑚 Coral Skeleton=珊瑚骨架 Water Source=水方块 Flowing Water=流动的水 -River Water Source=河流水方块 -Flowing River Water=流动的河流水 -Lava Source=融岩方块 -Flowing Lava=流动的融岩 +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=相思木围栏 +Wooden Ladder=木梯子 +Steel Ladder=铁梯子 +Apple Wood Fence=苹果木栅栏 +Acacia Wood Fence=相思木栅栏 Jungle Wood Fence=丛林木栅栏 Pine Wood Fence=松木栅栏 Aspen Wood Fence=白杨木栅栏 @@ -172,7 +172,7 @@ Pine Wood Fence Rail=松木栏杆 Aspen Wood Fence Rail=白杨木栏杆 Glass=玻璃 Obsidian Glass=黑曜石玻璃 -Brick Block=砖块 +Brick Block=砖方块 Mese Lamp=黄石灯 Mese Post Light=黄石柱灯 Cloud=云 diff --git a/mods/default/locale/default.zh_TW.tr b/mods/default/locale/default.zh_TW.tr new file mode 100644 index 00000000..6b06b8a8 --- /dev/null +++ b/mods/default/locale/default.zh_TW.tr @@ -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" diff --git a/mods/default/locale/template.txt b/mods/default/locale/template.txt index c8e616cd..dd554d45 100644 --- a/mods/default/locale/template.txt +++ b/mods/default/locale/template.txt @@ -1,43 +1,4 @@ # 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= Cobblestone= Stone Brick= @@ -62,12 +23,12 @@ Obsidian Block= Dirt= Dirt with Grass= Dirt with Grass and Footsteps= -Dirt with Dry Grass= +Dirt with Savanna Grass= Dirt with Snow= Dirt with Rainforest Litter= Dirt with Coniferous Litter= -Dry Dirt= -Dry Dirt with Dry Grass= +Savanna Dirt= +Savanna Dirt with Savanna Grass= Permafrost= Permafrost with Stones= Permafrost with Moss= @@ -124,7 +85,7 @@ Papyrus= Dry Shrub= Jungle Grass= Grass= -Dry Grass= +Savanna Grass= Fern= Marram Grass= Bush Stem= @@ -176,6 +137,8 @@ Brick Block= Mese Lamp= Mese Post Light= Cloud= +@1 will intersect protection on growth.= +Torch= Wooden Pickaxe= Stone Pickaxe= Bronze Pickaxe= @@ -201,11 +164,48 @@ Steel Sword= Mese Sword= Diamond Sword= Key= -Torch= -@1 will intersect protection on growth.= +Furnace is empty= +100% (output full)= +@1%= +Not cookable= +Empty= +Furnace active= +Furnace inactive= +(Item: @1; Fuel: @2)= +Furnace= Title:= Contents:= Save= by @1= Page @1 of @2= "@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= diff --git a/mods/default/mapgen.lua b/mods/default/mapgen.lua index afca9f8e..8c161d1e 100644 --- a/mods/default/mapgen.lua +++ b/mods/default/mapgen.lua @@ -2143,8 +2143,10 @@ function default.register_decorations() -- Papyrus + -- Dirt version for rainforest swamp + minetest.register_decoration({ - name = "default:papyrus", + name = "default:papyrus_on_dirt", deco_type = "schematic", place_on = {"default:dirt"}, sidelen = 16, @@ -2156,10 +2158,32 @@ function default.register_decorations() octaves = 3, persist = 0.7 }, - biomes = {"savanna_shore", "rainforest_swamp"}, + biomes = {"rainforest_swamp"}, y_max = 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 diff --git a/mods/default/nodes.lua b/mods/default/nodes.lua index b12c9b59..7a9899d6 100644 --- a/mods/default/nodes.lua +++ b/mods/default/nodes.lua @@ -221,6 +221,10 @@ default:brick default:meselamp 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 ---- @@ -458,12 +462,12 @@ minetest.register_node("default:dirt_with_grass_footsteps", { }) 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", "default_dirt.png", {name = "default_dirt.png^default_dry_grass_side.png", tileable_vertical = false}}, - groups = {crumbly = 3, soil = 1}, + groups = {crumbly = 3, soil = 1, spreading_dirt_type = 1}, drop = "default:dirt", sounds = default.node_sound_dirt_defaults({ 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", { - description = S("Dry Dirt"), + description = S("Savanna Dirt"), tiles = {"default_dry_dirt.png"}, groups = {crumbly = 3, soil = 1}, sounds = default.node_sound_dirt_defaults(), }) 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", {name = "default_dry_dirt.png^default_dry_grass_side.png", tileable_vertical = false}}, @@ -621,7 +625,7 @@ minetest.register_node("default:snow", { collision_box = { type = "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}, @@ -1497,7 +1501,7 @@ end minetest.register_node("default:dry_grass_1", { - description = S("Dry Grass"), + description = S("Savanna Grass"), drawtype = "plantlike", waving = 1, tiles = {"default_dry_grass_1.png"}, @@ -1526,7 +1530,7 @@ minetest.register_node("default:dry_grass_1", { for i = 2, 5 do minetest.register_node("default:dry_grass_" .. i, { - description = S("Dry Grass"), + description = S("Savanna Grass"), drawtype = "plantlike", waving = 1, tiles = {"default_dry_grass_" .. i .. ".png"}, @@ -2234,7 +2238,7 @@ minetest.register_node("default:water_flowing", { type = "vertical_frames", aspect_w = 16, aspect_h = 16, - length = 0.8, + length = 0.5, }, }, { @@ -2244,7 +2248,7 @@ minetest.register_node("default:water_flowing", { type = "vertical_frames", aspect_w = 16, aspect_h = 16, - length = 0.8, + length = 0.5, }, }, }, @@ -2330,7 +2334,7 @@ minetest.register_node("default:river_water_flowing", { type = "vertical_frames", aspect_w = 16, aspect_h = 16, - length = 0.8, + length = 0.5, }, }, { @@ -2340,7 +2344,7 @@ minetest.register_node("default:river_water_flowing", { type = "vertical_frames", aspect_w = 16, aspect_h = 16, - length = 0.8, + length = 0.5, }, }, }, @@ -2579,12 +2583,10 @@ local function register_sign(material, desc, def) sounds = def.sounds, on_construct = function(pos) - --local n = minetest.get_node(pos) local meta = minetest.get_meta(pos) meta:set_string("formspec", "field[text;;${text}]") end, 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() if minetest.is_protected(pos, player_name) then 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")) return end - minetest.log("action", (player_name or "") .. " wrote \"" .. - text .. "\" to sign at " .. minetest.pos_to_string(pos)) + minetest.log("action", player_name .. " wrote \"" .. text .. + "\" to the sign at " .. minetest.pos_to_string(pos)) local meta = minetest.get_meta(pos) meta:set_string("text", text) @@ -2816,7 +2818,10 @@ minetest.register_node("default:brick", { description = S("Brick Block"), paramtype2 = "facedir", place_param2 = 0, - tiles = {"default_brick.png"}, + tiles = { + "default_brick.png^[transformFX", + "default_brick.png", + }, is_ground_content = false, groups = {cracky = 3}, sounds = default.node_sound_stone_defaults(), @@ -2835,25 +2840,34 @@ minetest.register_node("default:meselamp", { light_source = default.LIGHT_MAX, }) -minetest.register_node("default:mese_post_light", { - description = S("Mese Post Light"), - tiles = {"default_mese_post_light_top.png", "default_mese_post_light_top.png", - "default_mese_post_light_side_dark.png", "default_mese_post_light_side_dark.png", - "default_mese_post_light_side.png", "default_mese_post_light_side.png"}, - wield_image = "default_mese_post_light_side.png", - drawtype = "nodebox", - node_box = { - type = "fixed", - fixed = { - {-2 / 16, -8 / 16, -2 / 16, 2 / 16, 8 / 16, 2 / 16}, - }, - }, - paramtype = "light", - 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(), +default.register_mesepost("default:mese_post_light", { + description = S("Apple Wood Mese Post Light"), + texture = "default_fence_wood.png", + material = "default:wood", +}) + +default.register_mesepost("default:mese_post_light_acacia", { + description = S("Acacia Wood Mese Post Light"), + texture = "default_fence_acacia_wood.png", + material = "default:acacia_wood", +}) + +default.register_mesepost("default:mese_post_light_junglewood", { + description = S("Jungle Wood Mese Post Light"), + texture = "default_fence_junglewood.png", + material = "default:junglewood", +}) + +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", }) -- diff --git a/mods/default/schematics/papyrus.mts b/mods/default/schematics/papyrus_on_dirt.mts similarity index 100% rename from mods/default/schematics/papyrus.mts rename to mods/default/schematics/papyrus_on_dirt.mts diff --git a/mods/default/schematics/papyrus_on_dry_dirt.mts b/mods/default/schematics/papyrus_on_dry_dirt.mts new file mode 100644 index 00000000..36265802 Binary files /dev/null and b/mods/default/schematics/papyrus_on_dry_dirt.mts differ diff --git a/mods/default/sounds/default_furnace_active.ogg b/mods/default/sounds/default_furnace_active.ogg new file mode 100644 index 00000000..536edc24 Binary files /dev/null and b/mods/default/sounds/default_furnace_active.ogg differ diff --git a/mods/default/textures/bubble.png b/mods/default/textures/bubble.png index 100fe15f..30170d29 100644 Binary files a/mods/default/textures/bubble.png and b/mods/default/textures/bubble.png differ diff --git a/mods/default/textures/default_dry_shrub.png b/mods/default/textures/default_dry_shrub.png index e8a7f277..82c9cc58 100644 Binary files a/mods/default/textures/default_dry_shrub.png and b/mods/default/textures/default_dry_shrub.png differ diff --git a/mods/default/textures/default_mese_post_light_side.png b/mods/default/textures/default_mese_post_light_side.png index c23b551a..a94e8b1b 100644 Binary files a/mods/default/textures/default_mese_post_light_side.png and b/mods/default/textures/default_mese_post_light_side.png differ diff --git a/mods/default/textures/default_mese_post_light_side_dark.png b/mods/default/textures/default_mese_post_light_side_dark.png index c4fc7cea..90983145 100644 Binary files a/mods/default/textures/default_mese_post_light_side_dark.png and b/mods/default/textures/default_mese_post_light_side_dark.png differ diff --git a/mods/default/textures/default_mese_post_light_top.png b/mods/default/textures/default_mese_post_light_top.png deleted file mode 100644 index 365c1a78..00000000 Binary files a/mods/default/textures/default_mese_post_light_top.png and /dev/null differ diff --git a/mods/default/textures/heart.png b/mods/default/textures/heart.png index 6d4e2289..4412cab5 100644 Binary files a/mods/default/textures/heart.png and b/mods/default/textures/heart.png differ diff --git a/mods/default/torch.lua b/mods/default/torch.lua index 85035a5e..c06dee8f 100644 --- a/mods/default/torch.lua +++ b/mods/default/torch.lua @@ -11,7 +11,8 @@ local function on_flood(pos, oldnode, newnode) nodedef.groups.igniter and nodedef.groups.igniter > 0) then minetest.sound_play( "default_cool_lava", - {pos = pos, max_hear_distance = 16, gain = 0.1} + {pos = pos, max_hear_distance = 16, gain = 0.1}, + true ) end -- Remove the torch node @@ -70,6 +71,7 @@ minetest.register_node("default:torch", { end, floodable = true, on_flood = on_flood, + on_rotate = false }) minetest.register_node("default:torch_wall", { @@ -93,6 +95,7 @@ minetest.register_node("default:torch_wall", { sounds = default.node_sound_wood_defaults(), floodable = true, on_flood = on_flood, + on_rotate = false }) minetest.register_node("default:torch_ceiling", { @@ -116,6 +119,7 @@ minetest.register_node("default:torch_ceiling", { sounds = default.node_sound_wood_defaults(), floodable = true, on_flood = on_flood, + on_rotate = false }) minetest.register_lbm({ diff --git a/mods/default/trees.lua b/mods/default/trees.lua index ad3e3f4c..a850644c 100644 --- a/mods/default/trees.lua +++ b/mods/default/trees.lua @@ -16,9 +16,7 @@ function default.can_grow(pos) if not node_under then return false end - local name_under = node_under.name - local is_soil = minetest.get_item_group(name_under, "soil") - if is_soil == 0 then + if minetest.get_item_group(node_under.name, "soil") == 0 then return false end local light_level = minetest.get_node_light(pos) diff --git a/mods/doors/init.lua b/mods/doors/init.lua index 85af0ef8..2048a643 100644 --- a/mods/doors/init.lua +++ b/mods/doors/init.lua @@ -78,9 +78,7 @@ end -- nodes from being placed in the top half of the door. minetest.register_node("doors:hidden", { description = S("Hidden Door Segment"), - -- can't use airlike otherwise falling nodes will turn to entities - -- and will be forever stuck until door is removed. - drawtype = "nodebox", + drawtype = "airlike", paramtype = "light", paramtype2 = "facedir", sunlight_propagates = true, @@ -93,13 +91,7 @@ minetest.register_node("doors:hidden", { drop = "", groups = {not_in_creative_inventory = 1}, on_blast = function() end, - tiles = {"doors_blank.png"}, - -- 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 + -- 1px block inside door hinge near node top collision_box = { type = "fixed", fixed = {-15/32, 13/32, -15/32, -13/32, 1/2, -13/32}, @@ -115,10 +107,10 @@ local transform = { {v = "_a", param2 = 2}, }, { - {v = "_b", param2 = 1}, - {v = "_b", param2 = 2}, - {v = "_b", param2 = 3}, - {v = "_b", param2 = 0}, + {v = "_c", param2 = 1}, + {v = "_c", param2 = 2}, + {v = "_c", param2 = 3}, + {v = "_c", param2 = 0}, }, { {v = "_b", param2 = 1}, @@ -127,10 +119,10 @@ local transform = { {v = "_b", param2 = 0}, }, { - {v = "_a", param2 = 3}, - {v = "_a", param2 = 0}, - {v = "_a", param2 = 1}, - {v = "_a", param2 = 2}, + {v = "_d", param2 = 3}, + {v = "_d", param2 = 0}, + {v = "_d", param2 = 1}, + {v = "_d", param2 = 2}, }, } @@ -176,10 +168,10 @@ function doors.door_toggle(pos, node, clicker) if state % 2 == 0 then 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 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 minetest.swap_node(pos, { @@ -340,7 +332,7 @@ function doors.register(name, def) itemstack:take_item() 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), placer, node, itemstack, pointed_thing) @@ -449,15 +441,23 @@ function doors.register(name, def) def.mesh = "door_b.obj" 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 .. "_b"] = true + doors.registered_doors[name .. "_c"] = true + doors.registered_doors[name .. "_d"] = true end doors.register("door_wood", { tiles = {{ name = "doors_door_wood.png", backface_culling = true }}, description = S("Wooden Door"), 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 = { {"group:wood", "group:wood"}, {"group:wood", "group:wood"}, @@ -470,7 +470,7 @@ doors.register("door_steel", { description = S("Steel Door"), inventory_image = "doors_item_steel.png", protected = true, - groups = {cracky = 1, level = 2}, + groups = {node = 1, cracky = 1, level = 2}, sounds = default.node_sound_metal_defaults(), sound_open = "doors_steel_door_open", sound_close = "doors_steel_door_close", @@ -485,7 +485,7 @@ doors.register("door_glass", { tiles = {"doors_door_glass.png"}, description = S("Glass Door"), 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(), sound_open = "doors_glass_door_open", sound_close = "doors_glass_door_close", @@ -500,7 +500,7 @@ doors.register("door_obsidian_glass", { tiles = {"doors_door_obsidian_glass.png"}, description = S("Obsidian Glass Door"), inventory_image = "doors_item_obsidian_glass.png", - groups = {cracky=3}, + groups = {node = 1, cracky=3}, sounds = default.node_sound_glass_defaults(), sound_open = "doors_glass_door_open", 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 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, string.len(node.name) - 5), param1 = node.param1, param2 = node.param2}) else 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", param1 = node.param1, param2 = node.param2}) end @@ -744,7 +744,7 @@ function doors.register_fencegate(name, def) local node_def = minetest.registered_nodes[node.name] minetest.swap_node(pos, {name = node_def.gate, param2 = node.param2}) minetest.sound_play(node_def.sound, {pos = pos, gain = 0.3, - max_hear_distance = 8}) + max_hear_distance = 8}, true) return itemstack end, selection_box = { diff --git a/mods/doors/locale/doors.id.tr b/mods/doors/locale/doors.id.tr new file mode 100644 index 00000000..3b749049 --- /dev/null +++ b/mods/doors/locale/doors.id.tr @@ -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 diff --git a/mods/doors/locale/doors.it.tr b/mods/doors/locale/doors.it.tr index 4737ee21..4a9599d6 100644 --- a/mods/doors/locale/doors.it.tr +++ b/mods/doors/locale/doors.it.tr @@ -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. a locked door=una porta chiusa a chiave Wooden Door=Porta di legno -Steel Door=Porta d'acciacio +Steel Door=Porta d'acciaio Glass Door=Porta di vetro Obsidian Glass Door=Porta di vetro d'ossidiana Owned by @1=Di proprietà di @1 @@ -16,4 +16,4 @@ Apple Wood Fence Gate=Cancello della recinzione di legno di melo Acacia Wood Fence Gate=Cancello della recinzione di legno d'acacia Jungle Wood Fence Gate=Cancello della recinzione di legno della giungla Pine Wood Fence Gate=Cancello della recinzione di legno di pino -Aspen Wood Fence Gate=Cancello della recinzione di legno di pioppo \ No newline at end of file +Aspen Wood Fence Gate=Cancello della recinzione di legno di pioppo diff --git a/mods/doors/locale/doors.zh_CN.tr b/mods/doors/locale/doors.zh_CN.tr index 75e68732..52945588 100644 --- a/mods/doors/locale/doors.zh_CN.tr +++ b/mods/doors/locale/doors.zh_CN.tr @@ -1,14 +1,14 @@ # textdomain: doors Hidden Door Segment=隐藏门段 Owned by @1=由@1拥有 -You do not own this locked door.=您不拥有此锁着的门。 -a locked door=一扇锁着的门 +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=一扇上锁的活板门 +You do not own this trapdoor.=这个活板门不属于你所有。 +a locked trapdoor=一扇已上锁的活板门 Wooden Trapdoor=木活板门 Steel Trapdoor=铁活板门 Apple Wood Fence Gate=用苹果树做的木栅栏门 diff --git a/mods/doors/locale/doors.zh_TW.tr b/mods/doors/locale/doors.zh_TW.tr new file mode 100644 index 00000000..47959eec --- /dev/null +++ b/mods/doors/locale/doors.zh_TW.tr @@ -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=白楊木柵欄門 diff --git a/mods/doors/models/door_a.obj b/mods/doors/models/door_a.obj index bd5127b5..7948f2f3 100644 --- a/mods/doors/models/door_a.obj +++ b/mods/doors/models/door_a.obj @@ -1,7 +1,7 @@ # Blender v2.76 (sub 0) OBJ File: 'door_a.blend' # www.blender.org mtllib door_a.mtl -o Cube_Cube.001 +o door_a v 0.499000 -0.499000 -0.499000 v 0.499000 1.499000 -0.499000 v 0.499000 -0.499000 -0.375000 diff --git a/mods/doors/models/door_a2.obj b/mods/doors/models/door_a2.obj new file mode 100644 index 00000000..3bedc202 --- /dev/null +++ b/mods/doors/models/door_a2.obj @@ -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 diff --git a/mods/doors/models/door_b.obj b/mods/doors/models/door_b.obj index c5607b87..87f1729c 100644 --- a/mods/doors/models/door_b.obj +++ b/mods/doors/models/door_b.obj @@ -1,40 +1,50 @@ -# Blender v2.76 (sub 0) OBJ File: 'door_b.blend' +# Blender v2.79 (sub 0) OBJ File: '' # www.blender.org mtllib door_b.mtl -o Cube_Cube.001 -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 +o door_b 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.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 0.000000 -vt 0.894737 0.000000 -vt 0.894737 1.000000 vt 0.421053 1.000000 vt 0.421053 0.000000 -vt 0.947368 0.000000 -vt 0.947368 1.000000 +vt 0.842105 0.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 0.000000 -vt 1.000000 0.000000 +vt 0.421053 0.000000 vt 1.000000 0.500000 vt 0.947368 0.500000 +vt 0.947368 1.000000 vt 1.000000 1.000000 -vn -1.000000 0.000000 0.000000 -vn 0.000000 0.000000 1.000000 -vn 1.000000 0.000000 0.000000 -vn 0.000000 0.000000 -1.000000 -vn 0.000000 -1.000000 0.000000 -vn 0.000000 1.000000 0.000000 -usemtl None -s off -f 2/1/1 1/2/1 3/3/1 4/4/1 -f 4/5/2 3/6/2 7/2/2 8/1/2 -f 8/4/3 7/3/3 5/7/3 6/8/3 -f 6/9/4 5/10/4 1/6/4 2/5/4 -f 1/11/5 5/12/5 7/13/5 3/7/5 -f 6/8/6 2/13/6 4/12/6 8/14/6 +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.007 +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 diff --git a/mods/doors/models/door_b2.obj b/mods/doors/models/door_b2.obj new file mode 100644 index 00000000..35632a5e --- /dev/null +++ b/mods/doors/models/door_b2.obj @@ -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 diff --git a/mods/doors/textures/doors_blank.png b/mods/doors/textures/doors_blank.png deleted file mode 100644 index 1914264c..00000000 Binary files a/mods/doors/textures/doors_blank.png and /dev/null differ diff --git a/mods/dungeon_loot/loot.lua b/mods/dungeon_loot/loot.lua index 7eb08cd8..a5a40973 100644 --- a/mods/dungeon_loot/loot.lua +++ b/mods/dungeon_loot/loot.lua @@ -1,26 +1,13 @@ -dungeon_loot.registered_loot = { - -- buckets - {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"}}, +-- Loot from the `default` mod is registered here, +-- with the rest being registered in the respective mods +dungeon_loot.registered_loot = { -- various items {name = "default:stick", chance = 0.6, count = {3, 6}}, {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 - {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 = "farming:seed_cotton", chance = 0.4, count = {1, 4}, - types = {"normal"}}, {name = "default:cactus", chance = 0.4, count = {1, 4}, types = {"sandstone", "desert"}}, diff --git a/mods/dungeon_loot/mapgen.lua b/mods/dungeon_loot/mapgen.lua index 624e9a85..b2c80fa8 100644 --- a/mods/dungeon_loot/mapgen.lua +++ b/mods/dungeon_loot/mapgen.lua @@ -89,20 +89,20 @@ local function populate_chest(pos, rand, dungeontype) amount = rand:next(loot.count[1], loot.count[2]) end - if itemdef then - if itemdef.tool_capabilities then - for n = 1, amount do - local wear = rand:next(0.20 * 65535, 0.75 * 65535) -- 20% to 75% wear - table.insert(items, ItemStack({name = loot.name, wear = wear})) - end - elseif itemdef.stack_max == 1 then - -- not stackable, add separately - for n = 1, amount do - table.insert(items, loot.name) - end - else - table.insert(items, ItemStack({name = loot.name, count = amount})) + if not itemdef then + minetest.log("warning", "Registered loot item " .. loot.name .. " does not exist") + elseif itemdef.tool_capabilities then + for n = 1, amount do + local wear = rand:next(0.20 * 65535, 0.75 * 65535) -- 20% to 75% wear + table.insert(items, ItemStack({name = loot.name, wear = wear})) end + elseif itemdef.stack_max == 1 then + -- not stackable, add separately + for n = 1, amount do + table.insert(items, loot.name) + end + else + table.insert(items, ItemStack({name = loot.name, count = amount})) end end end diff --git a/mods/dye/locale/dye.id.tr b/mods/dye/locale/dye.id.tr new file mode 100644 index 00000000..1614345a --- /dev/null +++ b/mods/dye/locale/dye.id.tr @@ -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 diff --git a/mods/dye/locale/dye.zh_CN.tr b/mods/dye/locale/dye.zh_CN.tr index 076df8f4..8dcf3117 100644 --- a/mods/dye/locale/dye.zh_CN.tr +++ b/mods/dye/locale/dye.zh_CN.tr @@ -2,8 +2,8 @@ White Dye=白染料 Grey Dye=灰染料 Dark Grey Dye=暗灰染料 -Black Dye=染料 -Violet Dye=染料 +Black Dye=黑染料 +Violet Dye=紫染料 Blue Dye=蓝染料 Cyan Dye=青染料 Dark Green Dye=暗绿染料 @@ -13,4 +13,4 @@ Brown Dye=棕染料 Orange Dye=橙染料 Red Dye=红染料 Magenta Dye=品红染料 -Pink Dye=淡红染料 +Pink Dye=粉红染料 diff --git a/mods/dye/locale/dye.zh_TW.tr b/mods/dye/locale/dye.zh_TW.tr new file mode 100644 index 00000000..cc60a219 --- /dev/null +++ b/mods/dye/locale/dye.zh_TW.tr @@ -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=粉紅染料 diff --git a/mods/env_sounds/README.txt b/mods/env_sounds/README.txt index 42835d21..3b3d2755 100644 --- a/mods/env_sounds/README.txt +++ b/mods/env_sounds/README.txt @@ -11,3 +11,7 @@ Authors of media (sounds) Yuval (CC0 1.0) https://freesound.org/people/Yuval/sounds/197023/ env_sounds_water.*.ogg + +Halion (CC0 1.0) +https://freesound.org/people/Halion/sounds/17785/ + env_sounds_lava.*.ogg diff --git a/mods/env_sounds/init.lua b/mods/env_sounds/init.lua index 546e9908..31cc483e 100644 --- a/mods/env_sounds/init.lua +++ b/mods/env_sounds/init.lua @@ -1,11 +1,41 @@ -- 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 @@ -13,39 +43,57 @@ local river_source_sounds = minetest.settings:get_bool("river_source_sounds") local function update_sound(player) local player_name = player:get_player_name() local ppos = player:get_pos() + ppos = vector.add(ppos, player:get_properties().eye_height) local areamin = vector.subtract(ppos, radius) local areamax = vector.add(ppos, radius) - local water_nodes = {"default:water_flowing", "default:river_water_flowing"} - if river_source_sounds then - table.insert(water_nodes, "default:river_water_source") - end - local wpos, _ = minetest.find_nodes_in_area(areamin, areamax, water_nodes) - local waters = #wpos - if waters == 0 then + + local pos = minetest.find_nodes_in_area(areamin, areamax, cache_triggers, true) + if next(pos) == nil then -- If table empty return end + for sound, def in pairs(allsounds) do + -- Find average position + local posav = {0, 0, 0} + local count = 0 + for _, name in ipairs(def.trigger) do + if pos[name] then + 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 - -- Find average position of water positions - local wposav = vector.new() - for _, pos in ipairs(wpos) do - wposav.x = wposav.x + pos.x - wposav.y = wposav.y + pos.y - wposav.z = wposav.z + pos.z + if count > 0 then + posav = vector.new(posav[1] / count, posav[2] / count, + posav[3] / count) + + -- 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, + gain = gain, + }, true) + end end - wposav = vector.divide(wposav, waters) - - minetest.sound_play( - "env_sounds_water", - { - pos = wposav, - to_player = player_name, - gain = math.min(0.04 + waters * 0.004, 0.4), - } - ) end --- Update sound 'on joinplayer' +-- Update sound when player joins minetest.register_on_joinplayer(function(player) update_sound(player) diff --git a/mods/env_sounds/sounds/env_sounds_lava.1.ogg b/mods/env_sounds/sounds/env_sounds_lava.1.ogg new file mode 100644 index 00000000..d417e515 Binary files /dev/null and b/mods/env_sounds/sounds/env_sounds_lava.1.ogg differ diff --git a/mods/env_sounds/sounds/env_sounds_lava.2.ogg b/mods/env_sounds/sounds/env_sounds_lava.2.ogg new file mode 100644 index 00000000..c98068fc Binary files /dev/null and b/mods/env_sounds/sounds/env_sounds_lava.2.ogg differ diff --git a/mods/farming/README.txt b/mods/farming/README.txt index d46748d7..a6427d04 100644 --- a/mods/farming/README.txt +++ b/mods/farming/README.txt @@ -38,3 +38,6 @@ Created by Gambit (CC BY 3.0): Created by Napiophelios (CC BY-SA 3.0): farming_cotton.png + +Created by Extex101 (CC BY-SA 3.0): + farming_cotton_wild.png diff --git a/mods/farming/api.lua b/mods/farming/api.lua index c2c549e4..91d557c7 100644 --- a/mods/farming/api.lua +++ b/mods/farming/api.lua @@ -59,7 +59,7 @@ farming.hoe_on_use = function(itemstack, user, pointed_thing, uses) minetest.sound_play("default_dig_crumbly", { pos = pt.under, gain = 0.5, - }) + }, true) if not (creative and creative.is_enabled_for 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)) -- tool break sound 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 return itemstack @@ -176,6 +177,8 @@ farming.place_seed = function(itemstack, placer, pointed_thing, plantname) end -- 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}) tick(pt.above) if not (creative and creative.is_enabled_for diff --git a/mods/farming/init.lua b/mods/farming/init.lua index e6dfd579..d328cb4a 100644 --- a/mods/farming/init.lua +++ b/mods/farming/init.lua @@ -16,7 +16,7 @@ dofile(farming.path .. "/nodes.lua") dofile(farming.path .. "/hoes.lua") --- WHEAT +-- Wheat farming.register_plant("farming:wheat", { description = S("Wheat Seed"), @@ -71,6 +71,25 @@ farming.register_plant("farming:cotton", { 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", { description = S("String"), inventory_image = "farming_string.png", @@ -115,12 +134,6 @@ minetest.register_craft({ -- Fuels -minetest.register_craft({ - type = "fuel", - recipe = "farming:straw", - burntime = 3, -}) - minetest.register_craft({ type = "fuel", recipe = "farming:wheat", @@ -144,3 +157,15 @@ minetest.register_craft({ recipe = "farming:hoe_wood", 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 diff --git a/mods/farming/license.txt b/mods/farming/license.txt index 8cbb63a8..b9708de3 100644 --- a/mods/farming/license.txt +++ b/mods/farming/license.txt @@ -59,3 +59,37 @@ rights may limit how you use the material. For more details: 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/ diff --git a/mods/farming/locale/farming.de.tr b/mods/farming/locale/farming.de.tr index 13a363b4..6c63a92c 100644 --- a/mods/farming/locale/farming.de.tr +++ b/mods/farming/locale/farming.de.tr @@ -12,9 +12,9 @@ Cotton Seed=Baumwollsamen String=Faden Soil=Ackerboden Wet Soil=Nasser Ackerboden -Dry Soil=Trockener Ackerboden -Wet Dry Soil=Nasser trockener Ackerboden -Desert Sand Soil=Wüsensandackerboden +Savanna Soil=Savannenackerboden +Wet Savanna Soil=Nasser Savannenackerboden +Desert Sand Soil=Wüstensandackerboden Wet Desert Sand Soil=Nasser Wüstensandackerboden Straw=Stroh Straw Stair=Strohtreppe @@ -23,3 +23,6 @@ Inner Straw Stair=Innere Strohtreppe Outer Straw Stair=Äußere Strohtreppe Wheat=Weizen Cotton=Baumwolle +Hoe=Hacke +Seed=Samen +Wild Cotton=Wilde Baumwolle diff --git a/mods/farming/locale/farming.es.tr b/mods/farming/locale/farming.es.tr index f935a7b4..8f958870 100644 --- a/mods/farming/locale/farming.es.tr +++ b/mods/farming/locale/farming.es.tr @@ -23,3 +23,4 @@ Inner Straw Stair=Escalera de paja interior Outer Straw Stair=Escalera de paja exterior Wheat=Trigo Cotton=Algodón +Wild Cotton=Algodón silvestre diff --git a/mods/farming/locale/farming.id.tr b/mods/farming/locale/farming.id.tr new file mode 100644 index 00000000..9904b6f6 --- /dev/null +++ b/mods/farming/locale/farming.id.tr @@ -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 diff --git a/mods/farming/locale/farming.zh_CN.tr b/mods/farming/locale/farming.zh_CN.tr index d9a0ff71..d8562884 100644 --- a/mods/farming/locale/farming.zh_CN.tr +++ b/mods/farming/locale/farming.zh_CN.tr @@ -1,10 +1,10 @@ # textdomain: farming -Wooden Hoe=木锄 -Stone Hoe=石锄 -Steel Hoe=铁锄 -Bronze Hoe=青铜锄 -Mese Hoe=Mese锄 -Diamond Hoe=钻石锄 +Wooden Hoe=木锄头 +Stone Hoe=石锄头 +Steel Hoe=铁锄头 +Bronze Hoe=青铜锄头 +Mese Hoe=黄石锄头 +Diamond Hoe=钻石锄头 Wheat Seed=小麦种子 Flour=面粉 Bread=面包 diff --git a/mods/farming/locale/farming.zh_TW.tr b/mods/farming/locale/farming.zh_TW.tr new file mode 100644 index 00000000..f1b7a7a6 --- /dev/null +++ b/mods/farming/locale/farming.zh_TW.tr @@ -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=棉 diff --git a/mods/farming/locale/template.txt b/mods/farming/locale/template.txt index 92d113e9..2f4248bd 100644 --- a/mods/farming/locale/template.txt +++ b/mods/farming/locale/template.txt @@ -1,19 +1,8 @@ # 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= +Savanna Soil= +Wet Savanna Soil= Desert Sand Soil= Wet Desert Sand Soil= Straw= @@ -21,5 +10,19 @@ Straw Stair= Inner Straw Stair= Outer Straw Stair= Straw Slab= +Wild Cotton= +Wheat Seed= Wheat= +Flour= +Bread= +Cotton Seed= Cotton= +String= +Wooden Hoe= +Stone Hoe= +Steel Hoe= +Bronze Hoe= +Mese Hoe= +Diamond Hoe= +Hoe= +Seed= diff --git a/mods/farming/mod.conf b/mods/farming/mod.conf index c26c28fc..9a76a6a7 100644 --- a/mods/farming/mod.conf +++ b/mods/farming/mod.conf @@ -1,3 +1,4 @@ name = farming description = Minetest Game mod: farming depends = default, wool, stairs +optional_depends = dungeon_loot diff --git a/mods/farming/nodes.lua b/mods/farming/nodes.lua index 22dd51c8..b5f90f96 100644 --- a/mods/farming/nodes.lua +++ b/mods/farming/nodes.lua @@ -86,7 +86,7 @@ minetest.register_node("farming:soil_wet", { }) 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"}, drop = "default:dry_dirt", 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", { - 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"}, drop = "default:dry_dirt", 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(), }) +-- Registered before the stairs so the stairs get fuel recipes. +minetest.register_craft({ + type = "fuel", + recipe = "farming:straw", + burntime = 3, +}) + do local recipe = "farming:straw" local groups = {snappy = 3, flammable = 4} @@ -223,20 +230,53 @@ minetest.register_abm({ }) +-- Make default:grass_* occasionally drop wheat seed + for i = 1, 5 do minetest.override_item("default:grass_"..i, {drop = { max_items = 1, items = { - {items = {"farming:seed_wheat"},rarity = 5}, + {items = {"farming:seed_wheat"}, rarity = 5}, {items = {"default:grass_1"}}, } }}) 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 = { max_items = 1, items = { - {items = {"farming:seed_cotton"},rarity = 8}, + {items = {"farming:seed_cotton"}, rarity = 8}, {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}, + }, +}) diff --git a/mods/farming/textures/farming_cotton_wild.png b/mods/farming/textures/farming_cotton_wild.png new file mode 100644 index 00000000..0107ad4a Binary files /dev/null and b/mods/farming/textures/farming_cotton_wild.png differ diff --git a/mods/fire/init.lua b/mods/fire/init.lua index 3c8a8fcf..b69a7311 100644 --- a/mods/fire/init.lua +++ b/mods/fire/init.lua @@ -1,15 +1,12 @@ -- fire/init.lua -- Global namespace for functions - fire = {} -- Load support for MT game translation. local S = minetest.get_translator("fire") - -- 'Enable fire' setting - local fire_enabled = minetest.settings:get_bool("enable_fire") if fire_enabled == nil then -- enable_fire setting not specified, check for disable_fire @@ -27,33 +24,27 @@ end -- -- Flood flame function - -local function flood_flame(pos, oldnode, newnode) +local function flood_flame(pos, _, newnode) -- Play flame extinguish sound if liquid is not an 'igniter' - local nodedef = minetest.registered_items[newnode.name] - if not (nodedef and nodedef.groups and - nodedef.groups.igniter and nodedef.groups.igniter > 0) then + if minetest.get_item_group(newnode.name, "igniter") == 0 then 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 -- Remove the flame return false end -- Flame nodes - -minetest.register_node("fire:basic_flame", { +local fire_node = { drawtype = "firelike", - tiles = { - { - name = "fire_basic_flame_animated.png", - animation = { - type = "vertical_frames", - aspect_w = 16, - aspect_h = 16, - length = 1 - }, - }, + 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", @@ -63,61 +54,36 @@ minetest.register_node("fire:basic_flame", { sunlight_propagates = true, floodable = true, damage_per_second = 4, - groups = {igniter = 2, dig_immediate = 3, not_in_creative_inventory = 1}, + groups = {igniter = 2, dig_immediate = 3, fire = 1}, drop = "", + on_flood = flood_flame +} - on_timer = function(pos) - local f = minetest.find_node_near(pos, 1, {"group:flammable"}) - if not fire_enabled or not f then - minetest.remove_node(pos) - return - end - -- Restart timer - return true - end, +-- Basic flame node +local flame_fire_node = table.copy(fire_node) +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) + return + end + -- Restart timer + return true +end +flame_fire_node.on_construct = function(pos) + minetest.get_node_timer(pos):start(math.random(30, 60)) +end - on_construct = function(pos) - if not fire_enabled then - minetest.remove_node(pos) - else - minetest.get_node_timer(pos):start(math.random(30, 60)) - end - end, +minetest.register_node("fire:basic_flame", flame_fire_node) - on_flood = flood_flame, -}) +-- Permanent flame node +local permanent_fire_node = table.copy(fire_node) +permanent_fire_node.description = S("Permanent Fire") -minetest.register_node("fire:permanent_flame", { - description = S("Permanent Flame"), - drawtype = "firelike", - 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, -}) - - --- Flint and steel +minetest.register_node("fire:permanent_flame", permanent_fire_node) +-- Flint and Steel minetest.register_tool("fire:flint_and_steel", { description = S("Flint and Steel"), inventory_image = "fire_flint_steel.png", @@ -125,10 +91,8 @@ minetest.register_tool("fire:flint_and_steel", { on_use = function(itemstack, user, pointed_thing) local sound_pos = pointed_thing.above or user:get_pos() - minetest.sound_play( - "fire_flint_and_steel", - {pos = sound_pos, gain = 0.5, max_hear_distance = 8} - ) + minetest.sound_play("fire_flint_and_steel", + {pos = sound_pos, gain = 0.5, max_hear_distance = 8}, true) local player_name = user:get_player_name() if pointed_thing.type == "node" then local node_under = minetest.get_node(pointed_thing.under).name @@ -152,9 +116,11 @@ minetest.register_tool("fire:flint_and_steel", { -- Wear tool local wdef = itemstack:get_definition() itemstack:add_wear(1000) + -- Tool break sound 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 return itemstack end @@ -168,23 +134,21 @@ minetest.register_craft({ } }) - -- Override coalblock to enable permanent flame above -- Coalblock is non-flammable to avoid unwanted basic_flame nodes - minetest.override_item("default:coalblock", { - after_destruct = function(pos, oldnode) + after_destruct = function(pos) pos.y = pos.y + 1 if minetest.get_node(pos).name == "fire:permanent_flame" then minetest.remove_node(pos) end end, - on_ignite = function(pos, igniter) + on_ignite = function(pos) local flame_pos = {x = pos.x, y = pos.y + 1, z = pos.z} if minetest.get_node(flame_pos).name == "air" then minetest.set_node(flame_pos, {name = "fire:permanent_flame"}) end - end, + end }) @@ -192,24 +156,18 @@ minetest.override_item("default:coalblock", { -- Sound -- -local flame_sound = minetest.settings:get_bool("flame_sound") -if flame_sound == nil then - -- Enable if no setting present - flame_sound = true -end +-- Enable if no setting present +local flame_sound = minetest.settings:get_bool("flame_sound", true) if flame_sound then - local handles = {} local timer = 0 -- Parameters - local radius = 8 -- Flame node search radius around player local cycle = 3 -- Cycle time for sound updates -- Update sound for player - function fire.update_player_sound(player) local player_name = player:get_player_name() -- Search for flame nodes in radius around player @@ -261,16 +219,13 @@ if flame_sound then fposmid = vector.divide(vector.add(fposmin, fposmax), 2) end -- Play sound - local handle = minetest.sound_play( - "fire_fire", - { - pos = fposmid, - to_player = player_name, - gain = math.min(0.06 * (1 + flames * 0.125), 0.18), - max_hear_distance = 32, - loop = true, -- In case of lag - } - ) + local handle = minetest.sound_play("fire_fire", { + pos = fposmid, + to_player = player_name, + gain = math.min(0.06 * (1 + flames * 0.125), 0.18), + max_hear_distance = 32, + loop = true -- In case of lag + }) -- Store sound handle for this player if handle then handles[player_name] = handle @@ -279,7 +234,6 @@ if flame_sound then end -- Cycle for updating players sounds - minetest.register_globalstep(function(dtime) timer = timer + dtime if timer < cycle then @@ -294,7 +248,6 @@ if flame_sound then end) -- Stop sound and clear handle on player leave - minetest.register_on_leaveplayer(function(player) local player_name = player:get_player_name() if handles[player_name] then @@ -306,19 +259,14 @@ end -- Deprecated function kept temporarily to avoid crashes if mod fire nodes call it - -function fire.update_sounds_around(pos) -end - +function fire.update_sounds_around() end -- -- ABMs -- if fire_enabled then - -- Ignite neighboring nodes, add basic flames - minetest.register_abm({ label = "Ignite flame", nodenames = {"group:flammable"}, @@ -331,11 +279,10 @@ if fire_enabled then if p then minetest.set_node(p, {name = "fire:basic_flame"}) end - end, + end }) -- Remove flammable nodes around basic flame - minetest.register_abm({ label = "Remove flammable nodes", nodenames = {"fire:basic_flame"}, @@ -356,7 +303,6 @@ if fire_enabled then minetest.remove_node(p) minetest.check_for_falling(p) end - end, + end }) - end diff --git a/mods/fire/locale/fire.de.tr b/mods/fire/locale/fire.de.tr index d6f8dde8..dad7c34a 100644 --- a/mods/fire/locale/fire.de.tr +++ b/mods/fire/locale/fire.de.tr @@ -1,3 +1,4 @@ # textdomain: fire -Permanent Flame=Permanente Flamme +Fire=Feuer +Permanent Fire=Permanentes Feuer Flint and Steel=Feuerstein und Stahl diff --git a/mods/fire/locale/fire.id.tr b/mods/fire/locale/fire.id.tr new file mode 100644 index 00000000..60c1c01b --- /dev/null +++ b/mods/fire/locale/fire.id.tr @@ -0,0 +1,4 @@ +# textdomain: fire +Fire=Api +Permanent Fire=Api Abadi +Flint and Steel=Pemantik diff --git a/mods/fire/locale/fire.zh_CN.tr b/mods/fire/locale/fire.zh_CN.tr index 89aff0e9..b28157eb 100644 --- a/mods/fire/locale/fire.zh_CN.tr +++ b/mods/fire/locale/fire.zh_CN.tr @@ -1,3 +1,4 @@ # textdomain: fire -Permanent Flame=永久火焰 +Permanent Fire=永久火焰 Flint and Steel=火石和钢 +Fire=火焰 diff --git a/mods/fire/locale/fire.zh_TW.tr b/mods/fire/locale/fire.zh_TW.tr new file mode 100644 index 00000000..2e7e9ddd --- /dev/null +++ b/mods/fire/locale/fire.zh_TW.tr @@ -0,0 +1,4 @@ +# textdomain: fire +Permanent Fire=永久火焰 +Flint and Steel=火石和鋼 +Fire=火焰 diff --git a/mods/fire/locale/template.txt b/mods/fire/locale/template.txt index 79ea7a29..e4e44e79 100644 --- a/mods/fire/locale/template.txt +++ b/mods/fire/locale/template.txt @@ -1,3 +1,4 @@ # textdomain: fire -Permanent Flame= +Fire= +Permanent Fire= Flint and Steel= diff --git a/mods/fire/textures/fire_basic_flame.png b/mods/fire/textures/fire_basic_flame.png index 1da0702d..484bcb19 100644 Binary files a/mods/fire/textures/fire_basic_flame.png and b/mods/fire/textures/fire_basic_flame.png differ diff --git a/mods/fire/textures/fire_basic_flame_animated.png b/mods/fire/textures/fire_basic_flame_animated.png index 1cdd9fdb..b01f7036 100644 Binary files a/mods/fire/textures/fire_basic_flame_animated.png and b/mods/fire/textures/fire_basic_flame_animated.png differ diff --git a/mods/fire/textures/fire_flint_steel.png b/mods/fire/textures/fire_flint_steel.png index c262ebc0..9d32d85b 100644 Binary files a/mods/fire/textures/fire_flint_steel.png and b/mods/fire/textures/fire_flint_steel.png differ diff --git a/mods/fireflies/locale/fireflies.id.tr b/mods/fireflies/locale/fireflies.id.tr new file mode 100644 index 00000000..bc6434ee --- /dev/null +++ b/mods/fireflies/locale/fireflies.id.tr @@ -0,0 +1,5 @@ +# textdomain: fireflies +Firefly=Kunang-Kunang +Hidden Firefly=Kunang-Kunang Tersembunyi +Bug Net=Jaring Serangga +Firefly in a Bottle=Kunang-Kunang dalam Botol diff --git a/mods/fireflies/locale/fireflies.zh_CN.tr b/mods/fireflies/locale/fireflies.zh_CN.tr index 6e43bf53..5971785a 100644 --- a/mods/fireflies/locale/fireflies.zh_CN.tr +++ b/mods/fireflies/locale/fireflies.zh_CN.tr @@ -2,4 +2,4 @@ Firefly=萤火虫 Hidden Firefly=隐藏的萤火虫 Bug Net=虫网 -Firefly in a Bottle=瓶中的萤火虫 +Firefly in a Bottle=放在瓶子里的萤火虫 diff --git a/mods/fireflies/locale/fireflies.zh_TW.tr b/mods/fireflies/locale/fireflies.zh_TW.tr new file mode 100644 index 00000000..af754a91 --- /dev/null +++ b/mods/fireflies/locale/fireflies.zh_TW.tr @@ -0,0 +1,5 @@ +# textdomain: fireflies +Firefly=螢火蟲 +Hidden Firefly=隱藏的螢火蟲 +Bug Net=蟲網 +Firefly in a Bottle=放在瓶子裡的螢火蟲 diff --git a/mods/flowers/locale/flowers.id.tr b/mods/flowers/locale/flowers.id.tr new file mode 100644 index 00000000..730529b3 --- /dev/null +++ b/mods/flowers/locale/flowers.id.tr @@ -0,0 +1,12 @@ +# textdomain: flowers +Red Rose=Mawar Merah +Orange Tulip=Tulip Oranye +Yellow Dandelion=Dandelion Kuning +Green Chrysanthemum=Krisan Hijau +Blue Geranium=Geranium Biru +Viola=Viola +White Dandelion=Dandelion Putih +Black Tulip=Tulip Hitam +Red Mushroom=Jamur Merah +Brown Mushroom=Jamur Cokelat +Waterlily=Teratai diff --git a/mods/flowers/locale/flowers.zh_CN.tr b/mods/flowers/locale/flowers.zh_CN.tr index d36411c0..3139dfbc 100644 --- a/mods/flowers/locale/flowers.zh_CN.tr +++ b/mods/flowers/locale/flowers.zh_CN.tr @@ -4,9 +4,9 @@ Orange Tulip=橙郁金香 Yellow Dandelion=黄蒲公英 Green Chrysanthemum=绿菊花 Blue Geranium=蓝天竺葵 -Viola=堇菜 +Viola=三色堇 White Dandelion=白蒲公英 Black Tulip=黑郁金香 Red Mushroom=红蘑菇 Brown Mushroom=棕蘑菇 -Waterlily=荷花 +Waterlily=睡莲 diff --git a/mods/flowers/locale/flowers.zh_TW.tr b/mods/flowers/locale/flowers.zh_TW.tr new file mode 100644 index 00000000..a3a3ec5a --- /dev/null +++ b/mods/flowers/locale/flowers.zh_TW.tr @@ -0,0 +1,12 @@ +# textdomain: flowers +Red Rose=紅玫瑰 +Orange Tulip=橙鬱金香 +Yellow Dandelion=黃蒲公英 +Green Chrysanthemum=綠菊花 +Blue Geranium=藍天竺葵 +Viola=三色堇 +White Dandelion=白蒲公英 +Black Tulip=黑鬱金香 +Red Mushroom=紅蘑菇 +Brown Mushroom=棕蘑菇 +Waterlily=睡蓮 diff --git a/mods/game_commands/locale/game_commands.id.tr b/mods/game_commands/locale/game_commands.id.tr new file mode 100644 index 00000000..1ab364b2 --- /dev/null +++ b/mods/game_commands/locale/game_commands.id.tr @@ -0,0 +1,4 @@ +# textdomain: game_commands +Kill yourself to respawn=Bunuh diri untuk bangkit kembali +No static_spawnpoint defined=Tiada static_spawnpoint (titik bangkit statis) yang diatur +You need to be online to be killed!=Anda harus daring untuk dibunuh! diff --git a/mods/game_commands/locale/game_commands.zh_CN.tr b/mods/game_commands/locale/game_commands.zh_CN.tr index dc549b73..3c69dfb7 100644 --- a/mods/game_commands/locale/game_commands.zh_CN.tr +++ b/mods/game_commands/locale/game_commands.zh_CN.tr @@ -1,4 +1,4 @@ # textdomain: game_commands Kill yourself to respawn=杀死自己并重生 -No static_spawnpoint defined=static_spawnpoint未定义 +No static_spawnpoint defined=static_spawnpoint 未定义 You need to be online to be killed!=您需要在线才能被杀死! diff --git a/mods/game_commands/locale/game_commands.zh_TW.tr b/mods/game_commands/locale/game_commands.zh_TW.tr new file mode 100644 index 00000000..34e148d2 --- /dev/null +++ b/mods/game_commands/locale/game_commands.zh_TW.tr @@ -0,0 +1,4 @@ +# textdomain: game_commands +Kill yourself to respawn=殺死自己並重生 +No static_spawnpoint defined=static_spawnpoint 未定義 +You need to be online to be killed!=您需要在線才能被殺死! diff --git a/mods/map/locale/map.id.tr b/mods/map/locale/map.id.tr new file mode 100644 index 00000000..cb31d0f7 --- /dev/null +++ b/mods/map/locale/map.id.tr @@ -0,0 +1,3 @@ +# textdomain: map +Mapping Kit=Alat Pemetaan +Use with 'Minimap' key=Pakai dengan tombol 'Peta Mini' diff --git a/mods/map/locale/map.zh_CN.tr b/mods/map/locale/map.zh_CN.tr index ce9b5f68..cec95bb7 100644 --- a/mods/map/locale/map.zh_CN.tr +++ b/mods/map/locale/map.zh_CN.tr @@ -1,3 +1,3 @@ # textdomain: map -Mapping Kit=制地图套件 -Use with 'Minimap' key=与“小地图”键一起使用 +Mapping Kit=地图绘制工具包 +Use with 'Minimap' key=与“迷你地图”键一起使用 diff --git a/mods/map/locale/map.zh_TW.tr b/mods/map/locale/map.zh_TW.tr new file mode 100644 index 00000000..a0981245 --- /dev/null +++ b/mods/map/locale/map.zh_TW.tr @@ -0,0 +1,3 @@ +# textdomain: map +Mapping Kit=地圖繪製工具包 +Use with 'Minimap' key=與“迷你地圖”鍵一起使用 diff --git a/mods/mtg_craftguide/README.md b/mods/mtg_craftguide/README.md new file mode 100644 index 00000000..9c4ed7a4 --- /dev/null +++ b/mods/mtg_craftguide/README.md @@ -0,0 +1,25 @@ +Minetest Game mod: mtg_craftguide +================================= + +Adds a "Recipes" tab to the inventory. Click an item to see it's recipes. +Click again to show usages. + +Based on [craftguide](https://github.com/minetest-mods/craftguide). + +Authors of media +---------------- + +paramat (CC BY-SA 3.0): + +* craftguide_clear_icon.png +* craftguide_next_icon.png +* craftguide_prev_icon.png +* craftguide_search_icon.png + +Neuromancer (CC BY-SA 3.0): + +* craftguide_furnace.png + +Wuzzy (CC BY-SA 3.0): + +* craftguide_shapeless.png diff --git a/mods/mtg_craftguide/init.lua b/mods/mtg_craftguide/init.lua new file mode 100644 index 00000000..e20b168e --- /dev/null +++ b/mods/mtg_craftguide/init.lua @@ -0,0 +1,432 @@ +local S = minetest.get_translator("mtg_craftguide") +local esc = minetest.formspec_escape + +local player_data = {} +local init_items = {} +local recipes_cache = {} +local usages_cache = {} + +local group_stereotypes = { + dye = "dye:white", + wool = "wool:white", + coal = "default:coal_lump", + vessel = "vessels:glass_bottle", + flower = "flowers:dandelion_yellow" +} + +local group_names = { + coal = S("Any coal"), + sand = S("Any sand"), + wool = S("Any wool"), + stick = S("Any stick"), + vessel = S("Any vessel"), + wood = S("Any wood planks"), + stone = S("Any kind of stone block"), + + ["color_red,flower"] = S("Any red flower"), + ["color_blue,flower"] = S("Any blue flower"), + ["color_black,flower"] = S("Any black flower"), + ["color_green,flower"] = S("Any green flower"), + ["color_white,flower"] = S("Any white flower"), + ["color_orange,flower"] = S("Any orange flower"), + ["color_violet,flower"] = S("Any violet flower"), + ["color_yellow,flower"] = S("Any yellow flower"), + + ["color_red,dye"] = S("Any red dye"), + ["color_blue,dye"] = S("Any blue dye"), + ["color_cyan,dye"] = S("Any cyan dye"), + ["color_grey,dye"] = S("Any grey dye"), + ["color_pink,dye"] = S("Any pink dye"), + ["color_black,dye"] = S("Any black dye"), + ["color_brown,dye"] = S("Any brown dye"), + ["color_green,dye"] = S("Any green dye"), + ["color_white,dye"] = S("Any white dye"), + ["color_orange,dye"] = S("Any orange dye"), + ["color_violet,dye"] = S("Any violet dye"), + ["color_yellow,dye"] = S("Any yellow dye"), + ["color_magenta,dye"] = S("Any magenta dye"), + ["color_dark_grey,dye"] = S("Any dark grey dye"), + ["color_dark_green,dye"] = S("Any dark green dye") +} + +local function table_replace(t, val, new) + for k, v in pairs(t) do + if v == val then + t[k] = new + end + end +end + +local function extract_groups(str) + if str:sub(1, 6) == "group:" then + return str:sub(7):split() + end + return nil +end + +local function item_has_groups(item_groups, groups) + for _, group in ipairs(groups) do + if not item_groups[group] then + return false + end + end + return true +end + +local function groups_to_item(groups) + if #groups == 1 then + local group = groups[1] + if group_stereotypes[group] then + return group_stereotypes[group] + elseif minetest.registered_items["default:"..group] then + return "default:"..group + end + end + + for name, def in pairs(minetest.registered_items) do + if item_has_groups(def.groups, groups) then + return name + end + end + + return ":unknown" +end + +local function get_craftable_recipes(output) + local recipes = minetest.get_all_craft_recipes(output) + if not recipes then + return nil + end + + for i = #recipes, 1, -1 do + for _, item in pairs(recipes[i].items) do + local groups = extract_groups(item) + if groups then + item = groups_to_item(groups) + end + if not minetest.registered_items[item] then + table.remove(recipes, i) + break + end + end + end + + if #recipes > 0 then + return recipes + end +end + +local function show_item(def) + return def.groups.not_in_craft_guide ~= 1 and def.description ~= "" +end + +local function cache_usages(recipe) + local added = {} + for _, item in pairs(recipe.items) do + if not added[item] then + local groups = extract_groups(item) + if groups then + for name, def in pairs(minetest.registered_items) do + if not added[name] and show_item(def) + and item_has_groups(def.groups, groups) then + local usage = table.copy(recipe) + table_replace(usage.items, item, name) + usages_cache[name] = usages_cache[name] or {} + table.insert(usages_cache[name], usage) + added[name] = true + end + end + elseif show_item(minetest.registered_items[item]) then + usages_cache[item] = usages_cache[item] or {} + table.insert(usages_cache[item], recipe) + end + added[item] = true + end + end +end + +minetest.register_on_mods_loaded(function() + for name, def in pairs(minetest.registered_items) do + if show_item(def) then + local recipes = get_craftable_recipes(name) + if recipes then + recipes_cache[name] = recipes + for _, recipe in ipairs(recipes) do + cache_usages(recipe) + end + end + end + end + for name, def in pairs(minetest.registered_items) do + if recipes_cache[name] or usages_cache[name] then + table.insert(init_items, name) + end + end + table.sort(init_items) +end) + +local function coords(i, cols) + return i % cols, math.floor(i / cols) +end + +local function is_fuel(item) + return minetest.get_craft_result({method="fuel", items={item}}).time > 0 +end + +local function item_button_fs(fs, x, y, item, element_name, groups) + table.insert(fs, ("item_image_button[%s,%s;1.05,1.05;%s;%s;%s]") + :format(x, y, item, element_name, groups and "\n"..esc(S("G")) or "")) + + local tooltip + if groups then + table.sort(groups) + tooltip = group_names[table.concat(groups, ",")] + if not tooltip then + local groupstr = {} + for _, group in ipairs(groups) do + table.insert(groupstr, minetest.colorize("yellow", group)) + end + groupstr = table.concat(groupstr, ", ") + tooltip = S("Any item belonging to the group(s): @1", groupstr) + end + elseif is_fuel(item) then + local itemdef = minetest.registered_items[item:match("%S*")] + local desc = itemdef and itemdef.description or S("Unknown Item") + tooltip = desc.."\n"..minetest.colorize("orange", S("Fuel")) + end + if tooltip then + table.insert(fs, ("tooltip[%s;%s]"):format(element_name, esc(tooltip))) + end +end + +local function recipe_fs(fs, data) + local recipe = data.recipes[data.rnum] + local width = recipe.width + local cooktime, shapeless + + if recipe.method == "cooking" then + cooktime, width = width, 1 + elseif width == 0 then + shapeless = true + if #recipe.items == 1 then + width = 1 + elseif #recipe.items <= 4 then + width = 2 + else + width = 3 + end + end + + table.insert(fs, ("label[5.5,1;%s]"):format(esc(data.show_usages + and S("Usage @1 of @2", data.rnum, #data.recipes) + or S("Recipe @1 of @2", data.rnum, #data.recipes)))) + + if #data.recipes > 1 then + table.insert(fs, + "image_button[5.5,1.6;0.8,0.8;craftguide_prev_icon.png;recipe_prev;]".. + "image_button[6.2,1.6;0.8,0.8;craftguide_next_icon.png;recipe_next;]".. + "tooltip[recipe_prev;"..esc(S("Previous recipe")).."]".. + "tooltip[recipe_next;"..esc(S("Next recipe")).."]") + end + + local rows = math.ceil(table.maxn(recipe.items) / width) + if width > 3 or rows > 3 then + table.insert(fs, ("label[0,1;%s]") + :format(esc(S("Recipe is too big to be displayed.")))) + return + end + + local base_x = 3 - width + local base_y = rows == 1 and 1 or 0 + + for i, item in pairs(recipe.items) do + local x, y = coords(i - 1, width) + + local groups = extract_groups(item) + if groups then + item = groups_to_item(groups) + end + item_button_fs(fs, base_x + x, base_y + y, item, item, groups) + end + + if shapeless or recipe.method == "cooking" then + table.insert(fs, ("image[3.2,0.5;0.5,0.5;craftguide_%s.png]") + :format(shapeless and "shapeless" or "furnace")) + local tooltip = shapeless and S("Shapeless") or + S("Cooking time: @1", minetest.colorize("yellow", cooktime)) + table.insert(fs, "tooltip[3.2,0.5;0.5,0.5;"..esc(tooltip).."]") + end + table.insert(fs, "image[3,1;1,1;sfinv_crafting_arrow.png]") + + item_button_fs(fs, 4, 1, recipe.output, recipe.output:match("%S*")) +end + +local function get_formspec(player) + local name = player:get_player_name() + local data = player_data[name] + data.pagemax = math.max(1, math.ceil(#data.items / 32)) + + local fs = {} + table.insert(fs, + "style_type[item_image_button;padding=2]".. + "field[0.3,4.2;2.8,1.2;filter;;"..esc(data.filter).."]".. + "label[5.8,4.15;"..minetest.colorize("yellow", data.pagenum).." / ".. + data.pagemax.."]".. + "image_button[2.63,4.05;0.8,0.8;craftguide_search_icon.png;search;]".. + "image_button[3.25,4.05;0.8,0.8;craftguide_clear_icon.png;clear;]".. + "image_button[5,4.05;0.8,0.8;craftguide_prev_icon.png;prev;]".. + "image_button[7.25,4.05;0.8,0.8;craftguide_next_icon.png;next;]".. + "tooltip[search;"..esc(S("Search")).."]".. + "tooltip[clear;"..esc(S("Reset")).."]".. + "tooltip[prev;"..esc(S("Previous page")).."]".. + "tooltip[next;"..esc(S("Next page")).."]".. + "field_close_on_enter[filter;false]") + + if #data.items == 0 then + table.insert(fs, "label[3,2;"..esc(S("No items to show.")).."]") + else + local first_item = (data.pagenum - 1) * 32 + for i = first_item, first_item + 31 do + local item = data.items[i + 1] + if not item then + break + end + local x, y = coords(i % 32, 8) + item_button_fs(fs, x, y, item, item) + end + end + + table.insert(fs, "container[0,5.6]") + if data.recipes then + recipe_fs(fs, data) + elseif data.prev_item then + table.insert(fs, ("label[2,1;%s]"):format(esc(data.show_usages + and S("No usages.").."\n"..S("Click again to show recipes.") + or S("No recipes.").."\n"..S("Click again to show usages.")))) + end + table.insert(fs, "container_end[]") + + return table.concat(fs) +end + +local function imatch(str, filter) + return str:lower():find(filter, 1, true) ~= nil +end + +local function execute_search(data) + local filter = data.filter + if filter == "" then + data.items = init_items + return + end + data.items = {} + + for _, item in ipairs(init_items) do + local def = minetest.registered_items[item] + local desc = def and minetest.get_translated_string(data.lang_code, def.description) + + if imatch(item, filter) or desc and imatch(desc, filter) then + table.insert(data.items, item) + end + end +end + +local function on_receive_fields(player, fields) + local name = player:get_player_name() + local data = player_data[name] + + if fields.clear then + data.filter = "" + data.pagenum = 1 + data.prev_item = nil + data.recipes = nil + data.items = init_items + return true + + elseif fields.key_enter_field == "filter" or fields.search then + local new = fields.filter:lower() + if data.filter == new then + return + end + data.filter = new + data.pagenum = 1 + execute_search(data) + return true + + elseif fields.prev or fields.next then + if data.pagemax == 1 then + return + end + data.pagenum = data.pagenum + (fields.next and 1 or -1) + if data.pagenum > data.pagemax then + data.pagenum = 1 + elseif data.pagenum == 0 then + data.pagenum = data.pagemax + end + return true + + elseif fields.recipe_next or fields.recipe_prev then + data.rnum = data.rnum + (fields.recipe_next and 1 or -1) + if data.rnum > #data.recipes then + data.rnum = 1 + elseif data.rnum == 0 then + data.rnum = #data.recipes + end + return true + + else + local item + for field in pairs(fields) do + if field:find(":") then + item = field + break + end + end + if not item then + return + end + + if item == data.prev_item then + data.show_usages = not data.show_usages + else + data.show_usages = nil + end + if data.show_usages then + data.recipes = usages_cache[item] + else + data.recipes = recipes_cache[item] + end + data.prev_item = item + data.rnum = 1 + return true + end +end + +minetest.register_on_joinplayer(function(player) + local name = player:get_player_name() + local info = minetest.get_player_information(name) + + player_data[name] = { + filter = "", + pagenum = 1, + items = init_items, + lang_code = info.lang_code + } +end) + +minetest.register_on_leaveplayer(function(player) + local name = player:get_player_name() + player_data[name] = nil +end) + +sfinv.register_page("mtg_craftguide:craftguide", { + title = esc(S("Recipes")), + get = function(self, player, context) + return sfinv.make_formspec(player, context, get_formspec(player)) + end, + on_player_receive_fields = function(self, player, context, fields) + if on_receive_fields(player, fields) then + sfinv.set_player_inventory_formspec(player) + end + end +}) diff --git a/mods/mtg_craftguide/license.txt b/mods/mtg_craftguide/license.txt new file mode 100644 index 00000000..8d28c5c7 --- /dev/null +++ b/mods/mtg_craftguide/license.txt @@ -0,0 +1,63 @@ +License of source code +---------------------- + +The MIT License (MIT) + +Copyright (C) 2015-2019 Jean-Patrick Guerrero and contributors. +Copyright (C) 2020 pauloue + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + + +Licenses of media (textures) +---------------------------- + +Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0) + +Copyright (C) 2018 paramat +Copyright (C) Neuromancer +Copyright (C) 2017 Wuzzy + +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/ diff --git a/mods/mtg_craftguide/locale/mtg_craftguide.fr.tr b/mods/mtg_craftguide/locale/mtg_craftguide.fr.tr new file mode 100644 index 00000000..d43d66c9 --- /dev/null +++ b/mods/mtg_craftguide/locale/mtg_craftguide.fr.tr @@ -0,0 +1,41 @@ +# textdomain: mtg_craftguide + + +### init.lua ### + +Any black dye=Quelconque colorant noir +Any black flower=Quelconque fleur noire +Any blue dye=Quelconque colorant bleu +Any blue flower=Quelconque fleur bleue +Any brown dye=Quelconque colorant marron +Any coal=Quelconque charbon +Any cyan dye=Quelconque colorant bleu ciel +Any dark green dye=Quelconque colorant vert foncé +Any dark grey dye=Quelconque colorant gris foncé +Any green dye=Quelconque colorant vert +Any green flower=Quelconque fleur verte +Any grey dye=Quelconque colorant gris +Any item belonging to the group(s): @1=Tout item appartenant au(x) groupe(s) : @1 +Any kind of stone block=Quelconque roche +Any magenta dye=Quelconque colorant magenta +Any orange dye=Quelconque colorant orange +Any orange flower=Quelconque fleur orange +Any pink dye=Quelconque colorant rose +Any red dye=Quelconque colorant rouge +Any red flower=Quelconque fleur rouge +Any sand=Quelconque sable +Any stick=Quelconque bâton +Any vessel=Quelconque couvert +Any violet dye=Quelconque colorant violet +Any violet flower=Quelconque fleur violette +Any white dye=Quelconque colorant blanc +Any white flower=Quelconque fleur blanche +Any wood planks=Quelconques planches de bois +Any wool=Quelconque laine +Any yellow dye=Quelconque colorant jaune +Any yellow flower=Quelconque fleur jaune +Cooking time: @1=Temps de cuisson : @1 +Recipe @1 of @2=Recette @1 sur @2 +Recipes=Recettes +Shapeless=Sans forme +Usage @1 of @2=Usage @1 sur @2 diff --git a/mods/mtg_craftguide/locale/template.txt b/mods/mtg_craftguide/locale/template.txt new file mode 100644 index 00000000..aec21266 --- /dev/null +++ b/mods/mtg_craftguide/locale/template.txt @@ -0,0 +1,57 @@ +# textdomain: mtg_craftguide + + +### init.lua ### + +Any black dye= +Any black flower= +Any blue dye= +Any blue flower= +Any brown dye= +Any coal= +Any cyan dye= +Any dark green dye= +Any dark grey dye= +Any green dye= +Any green flower= +Any grey dye= +Any item belonging to the group(s): @1= +Any kind of stone block= +Any magenta dye= +Any orange dye= +Any orange flower= +Any pink dye= +Any red dye= +Any red flower= +Any sand= +Any stick= +Any vessel= +Any violet dye= +Any violet flower= +Any white dye= +Any white flower= +Any wood planks= +Any wool= +Any yellow dye= +Any yellow flower= +Click again to show recipes.= +Click again to show usages.= +Cooking time: @1= +Fuel= +# Label for group ingredients +G= +Next page= +Next recipe= +No items to show.= +No recipes.= +No usages.= +Previous page= +Previous recipe= +Recipe @1 of @2= +Recipe is too big to be displayed.= +Recipes= +Reset= +Search= +Shapeless= +Unknown Item= +Usage @1 of @2= diff --git a/mods/mtg_craftguide/mod.conf b/mods/mtg_craftguide/mod.conf new file mode 100644 index 00000000..3b2d975f --- /dev/null +++ b/mods/mtg_craftguide/mod.conf @@ -0,0 +1,3 @@ +name = mtg_craftguide +description = Minetest Game mod: mtg_craftguide +depends = sfinv diff --git a/mods/mtg_craftguide/textures/craftguide_clear_icon.png b/mods/mtg_craftguide/textures/craftguide_clear_icon.png new file mode 100644 index 00000000..1a0e513f Binary files /dev/null and b/mods/mtg_craftguide/textures/craftguide_clear_icon.png differ diff --git a/mods/mtg_craftguide/textures/craftguide_furnace.png b/mods/mtg_craftguide/textures/craftguide_furnace.png new file mode 100644 index 00000000..60d1a619 Binary files /dev/null and b/mods/mtg_craftguide/textures/craftguide_furnace.png differ diff --git a/mods/mtg_craftguide/textures/craftguide_next_icon.png b/mods/mtg_craftguide/textures/craftguide_next_icon.png new file mode 100644 index 00000000..266c9ba6 Binary files /dev/null and b/mods/mtg_craftguide/textures/craftguide_next_icon.png differ diff --git a/mods/mtg_craftguide/textures/craftguide_prev_icon.png b/mods/mtg_craftguide/textures/craftguide_prev_icon.png new file mode 100644 index 00000000..c8072961 Binary files /dev/null and b/mods/mtg_craftguide/textures/craftguide_prev_icon.png differ diff --git a/mods/mtg_craftguide/textures/craftguide_search_icon.png b/mods/mtg_craftguide/textures/craftguide_search_icon.png new file mode 100644 index 00000000..1c374cad Binary files /dev/null and b/mods/mtg_craftguide/textures/craftguide_search_icon.png differ diff --git a/mods/mtg_craftguide/textures/craftguide_shapeless.png b/mods/mtg_craftguide/textures/craftguide_shapeless.png new file mode 100644 index 00000000..51d8ce50 Binary files /dev/null and b/mods/mtg_craftguide/textures/craftguide_shapeless.png differ diff --git a/mods/player_api/api.lua b/mods/player_api/api.lua index 0afd6790..5803e954 100644 --- a/mods/player_api/api.lua +++ b/mods/player_api/api.lua @@ -96,22 +96,25 @@ end) local player_set_animation = player_api.set_animation local player_attached = player_api.player_attached +-- Prevent knockback for attached players +local old_calculate_knockback = minetest.calculate_knockback +function minetest.calculate_knockback(player, ...) + if player_attached[player:get_player_name()] then + return 0 + end + return old_calculate_knockback(player, ...) +end + -- Check each player and apply animations -minetest.register_globalstep(function(dtime) +minetest.register_globalstep(function() for _, player in pairs(minetest.get_connected_players()) do local name = player:get_player_name() local model_name = player_model[name] local model = model_name and models[model_name] if model and not player_attached[name] then local controls = player:get_player_control() - local walking = false local animation_speed_mod = model.animation_speed or 30 - -- Determine if the player is walking - if controls.up or controls.down or controls.left or controls.right then - walking = true - end - -- Determine if the player is sneaking, and reduce animation speed if so if controls.sneak then animation_speed_mod = animation_speed_mod / 2 @@ -120,18 +123,19 @@ minetest.register_globalstep(function(dtime) -- Apply animations based on what the player is doing if player:get_hp() == 0 then player_set_animation(player, "lay") - elseif walking then + -- Determine if the player is walking + elseif controls.up or controls.down or controls.left or controls.right then if player_sneak[name] ~= controls.sneak then player_anim[name] = nil player_sneak[name] = controls.sneak end - if controls.LMB then + if controls.LMB or controls.RMB then player_set_animation(player, "walk_mine", animation_speed_mod) else player_set_animation(player, "walk", animation_speed_mod) end - elseif controls.LMB then - player_set_animation(player, "mine") + elseif controls.LMB or controls.RMB then + player_set_animation(player, "mine", animation_speed_mod) else player_set_animation(player, "stand", animation_speed_mod) end diff --git a/mods/screwdriver/locale/screwdriver.id.tr b/mods/screwdriver/locale/screwdriver.id.tr new file mode 100644 index 00000000..ec83c794 --- /dev/null +++ b/mods/screwdriver/locale/screwdriver.id.tr @@ -0,0 +1,3 @@ +# textdomain: screwdriver +Screwdriver=Obeng +(left-click rotates face, right-click rotates axis)=(klik kiri putar sisi, klik kanan putar sumbu) diff --git a/mods/screwdriver/locale/screwdriver.zh_CN.tr b/mods/screwdriver/locale/screwdriver.zh_CN.tr index 2531d3de..caddf798 100644 --- a/mods/screwdriver/locale/screwdriver.zh_CN.tr +++ b/mods/screwdriver/locale/screwdriver.zh_CN.tr @@ -1,3 +1,3 @@ # textdomain: screwdriver -Screwdriver=Screwdriver +Screwdriver=螺丝刀 (left-click rotates face, right-click rotates axis)=(左键单击旋转面,右键单击旋转轴) diff --git a/mods/screwdriver/locale/screwdriver.zh_TW.tr b/mods/screwdriver/locale/screwdriver.zh_TW.tr new file mode 100644 index 00000000..e638bfa0 --- /dev/null +++ b/mods/screwdriver/locale/screwdriver.zh_TW.tr @@ -0,0 +1,3 @@ +# textdomain: screwdriver +Screwdriver=螺絲刀 +(left-click rotates face, right-click rotates axis)=(左鍵單擊旋轉面,右鍵單擊旋轉軸) diff --git a/mods/sethome/init.lua b/mods/sethome/init.lua index bad7806d..9fc8e6ac 100644 --- a/mods/sethome/init.lua +++ b/mods/sethome/init.lua @@ -29,9 +29,13 @@ sethome.set = function(name, pos) if not player or not pos then return false end - player:set_attribute("sethome:home", minetest.pos_to_string(pos)) + local player_meta = player:get_meta() + player_meta:set_string("sethome:home", minetest.pos_to_string(pos)) -- remove `name` from the old storage file + if not homepos[name] then + return true + end local data = {} local output = io.open(homes_file, "w") if output then @@ -48,7 +52,8 @@ end sethome.get = function(name) local player = minetest.get_player_by_name(name) - local pos = minetest.string_to_pos(player:get_attribute("sethome:home")) + local player_meta = player:get_meta() + local pos = minetest.string_to_pos(player_meta:get_string("sethome:home")) if pos then return pos end diff --git a/mods/sethome/locale/sethome.id.tr b/mods/sethome/locale/sethome.id.tr new file mode 100644 index 00000000..1966978c --- /dev/null +++ b/mods/sethome/locale/sethome.id.tr @@ -0,0 +1,8 @@ +# textdomain: sethome +Can use /sethome and /home=Boleh pakai /sethome dan /home +Teleport you to your home point=Teleportasi ke rumah Anda +Teleported to home!=Teleportasi ke rumah! +Set a home using /sethome=Atur letak rumah dengan /sethome +Set your home point=Atur letak rumah +Home set!=Letak rumah diatur! +Player not found!=Pemain tidak ditemukan! diff --git a/mods/sethome/locale/sethome.zh_CN.tr b/mods/sethome/locale/sethome.zh_CN.tr index 7cd8c5aa..9e3780a7 100644 --- a/mods/sethome/locale/sethome.zh_CN.tr +++ b/mods/sethome/locale/sethome.zh_CN.tr @@ -1,8 +1,8 @@ # textdomain: sethome Can use /sethome and /home=可以使用/sethome和/home -Teleport you to your home point=传送您到您的家 -Teleported to home!=传送到家了! +Teleport you to your home point=传送您到您家的地点 +Teleported to home!=已传送到家! Set a home using /sethome=使用/sethome设定家 -Set your home point=设定您的家 -Home set!=家设定了! -Player not found!=找不到玩家! +Set your home point=设定您家的地点 +Home set!=已设定家! +Player not found!=未找到玩家! diff --git a/mods/sethome/locale/sethome.zh_TW.tr b/mods/sethome/locale/sethome.zh_TW.tr new file mode 100644 index 00000000..43e14aaa --- /dev/null +++ b/mods/sethome/locale/sethome.zh_TW.tr @@ -0,0 +1,8 @@ +# textdomain: sethome +Can use /sethome and /home=可以使用/sethome和/home +Teleport you to your home point=傳送您到您家的地點 +Teleported to home!=已傳送到家! +Set a home using /sethome=使用/sethome設定家 +Set your home point=設定您家的地點 +Home set!=已設定家! +Player not found!=未找到玩家! diff --git a/mods/sfinv/locale/sfinv.id.tr b/mods/sfinv/locale/sfinv.id.tr new file mode 100644 index 00000000..643196e1 --- /dev/null +++ b/mods/sfinv/locale/sfinv.id.tr @@ -0,0 +1,2 @@ +# textdomain: sfinv +Crafting=Kerajinan diff --git a/mods/sfinv/locale/sfinv.zh_TW.tr b/mods/sfinv/locale/sfinv.zh_TW.tr new file mode 100644 index 00000000..251362ff --- /dev/null +++ b/mods/sfinv/locale/sfinv.zh_TW.tr @@ -0,0 +1,2 @@ +# textdomain:sfinv +Crafting=合成 diff --git a/mods/sfinv/locale/template.txt b/mods/sfinv/locale/template.txt index 913ba9fc..ace55196 100644 --- a/mods/sfinv/locale/template.txt +++ b/mods/sfinv/locale/template.txt @@ -1,2 +1,2 @@ -# textdomain:sfinv +# textdomain: sfinv Crafting= diff --git a/mods/spawn/init.lua b/mods/spawn/init.lua index 0e1261e6..12c957f9 100644 --- a/mods/spawn/init.lua +++ b/mods/spawn/init.lua @@ -135,6 +135,7 @@ local function on_spawn(player) if success then player:set_pos(spawn_pos) end + return success end minetest.register_on_newplayer(function(player) @@ -153,7 +154,5 @@ minetest.register_on_respawnplayer(function(player) return end - on_spawn(player) - - return true + return on_spawn(player) end) diff --git a/mods/stairs/init.lua b/mods/stairs/init.lua index f1eda34a..3892149b 100644 --- a/mods/stairs/init.lua +++ b/mods/stairs/init.lua @@ -874,7 +874,7 @@ my_register_stair_and_slab( stairs.register_stair( "glass", "default:glass", - {cracky = 3}, + {cracky = 3, oddly_breakable_by_hand = 3}, {"stairs_glass_split.png", "default_glass.png", "stairs_glass_stairside.png^[transformFX", "stairs_glass_stairside.png", "default_glass.png", "stairs_glass_split.png"}, @@ -886,7 +886,7 @@ stairs.register_stair( stairs.register_slab( "glass", "default:glass", - {cracky = 3}, + {cracky = 3, oddly_breakable_by_hand = 3}, {"default_glass.png", "default_glass.png", "stairs_glass_split.png"}, S("Glass Slab"), default.node_sound_glass_defaults(), @@ -896,7 +896,7 @@ stairs.register_slab( stairs.register_stair_inner( "glass", "default:glass", - {cracky = 3}, + {cracky = 3, oddly_breakable_by_hand = 3}, {"stairs_glass_stairside.png^[transformR270", "default_glass.png", "stairs_glass_stairside.png^[transformFX", "default_glass.png", "default_glass.png", "stairs_glass_stairside.png"}, @@ -909,7 +909,7 @@ stairs.register_stair_inner( stairs.register_stair_outer( "glass", "default:glass", - {cracky = 3}, + {cracky = 3, oddly_breakable_by_hand = 3}, {"stairs_glass_stairside.png^[transformR90", "default_glass.png", "stairs_glass_outer_stairside.png", "stairs_glass_stairside.png", "stairs_glass_stairside.png^[transformR90","stairs_glass_outer_stairside.png"}, diff --git a/mods/stairs/locale/stairs.fr.tr b/mods/stairs/locale/stairs.fr.tr index 2dd6594c..81b575e6 100644 --- a/mods/stairs/locale/stairs.fr.tr +++ b/mods/stairs/locale/stairs.fr.tr @@ -142,4 +142,4 @@ Ice Slab=Dalle de glace Snow Block Stair=Escalier en bloc de neige Inner Snow Block Stair=Escalier intérieur en bloc de neige Outer Snow Block Stair=Escalier extérieur en bloc de neige -Snow Block Slab=Escalier en bloc de neige +Snow Block Slab=Dalle en bloc de neige diff --git a/mods/stairs/locale/stairs.id.tr b/mods/stairs/locale/stairs.id.tr new file mode 100644 index 00000000..dbdfaa0f --- /dev/null +++ b/mods/stairs/locale/stairs.id.tr @@ -0,0 +1,145 @@ +# textdomain: stairs +Glass Stair=Tangga Kaca +Glass Slab=Lempengan Kaca +Inner Glass Stair=Tangga Kaca Dalam +Outer Glass Stair=Tangga Kaca Luar +Obsidian Glass Stair=Tangga Kaca Obsidian +Obsidian Glass Slab=Lempengan Kaca Obsidian +Inner Obsidian Glass Stair=Tangga Kaca Obsidian Dalam +Outer Obsidian Glass Stair=Tangga Kaca Obsidian Luar +Wooden Stair=Tangga Kayu +Inner Wooden Stair=Tangga Kayu Dalam +Outer Wooden Stair=Tangga Kayu Luar +Wooden Slab=Lempengan Kayu +Jungle Wood Stair=Tangga Kayu Rimba +Inner Jungle Wood Stair=Tangga Kayu Rimba Dalam +Outer Jungle Wood Stair=Tangga Kayu Rimba Luar +Jungle Wood Slab=Lempengan Kayu Rimba +Pine Wood Stair=Tangga Kayu Pinus +Inner Pine Wood Stair=Tangga Kayu Pinus Dalam +Outer Pine Wood Stair=Tangga Kayu Pinus Luar +Pine Wood Slab=Lempengan Kayu Pinus +Acacia Wood Stair=Tangga Kayu Akasia +Inner Acacia Wood Stair=Tangga Kayu Akasia Dalam +Outer Acacia Wood Stair=Tangga Kayu Akasia Luar +Acacia Wood Slab=Lempengan Kayu Akasia +Aspen Wood Stair=Tangga Kayu Aspen +Inner Aspen Wood Stair=Tangga Kayu Aspen Dalam +Outer Aspen Wood Stair=Tangga Kayu Aspen Luar +Aspen Wood Slab=Lempengan Kayu Aspen +Stone Stair=Tangga Batu +Inner Stone Stair=Tangga Batu Dalam +Outer Stone Stair=Tangga Batu Luar +Stone Slab=Lempengan Batu +Cobblestone Stair=Tangga Bongkahan Batu +Inner Cobblestone Stair=Tangga Bongkahan Batu Dalam +Outer Cobblestone Stair=Tangga Bongkahan Batu Luar +Cobblestone Slab=Lempengan Bongkahan Batu +Mossy Cobblestone Stair=Tangga Bongkahan Batu Berlumut +Inner Mossy Cobblestone Stair=Tangga Bongkahan Batu Berlumut Dalam +Outer Mossy Cobblestone Stair=Tangga Bongkahan Batu Berlumut Luar +Mossy Cobblestone Slab=Lempengan Bongkahan Batu Berlumut +Stone Brick Stair=Tangga Tembok Batu +Inner Stone Brick Stair=Tangga Tembok Batu Dalam +Outer Stone Brick Stair=Tangga Tembok Batu Luar +Stone Brick Slab=Lempengan Tembok Batu +Stone Block Stair=Tangga Balok Batu +Inner Stone Block Stair=Tangga Balok Batu Dalam +Outer Stone Block Stair=Tangga Balok Batu Luar +Stone Block Slab=Lempengan Balok Batu +Desert Stone Stair=Tangga Batu Gurun +Inner Desert Stone Stair=Tangga Batu Gurun Dalam +Outer Desert Stone Stair=Tangga Batu Gurun Luar +Desert Stone Slab=Lempengan Batu Gurun +Desert Cobblestone Stair=Tangga Bongkahan Batu Gurun +Inner Desert Cobblestone Stair=Tangga Bongkahan Batu Gurun Dalam +Outer Desert Cobblestone Stair=Tangga Bongkahan Batu Gurun Luar +Desert Cobblestone Slab=Lempengan Bongkahan Batu Gurun +Desert Stone Brick Stair=Tangga Tembok Batu Gurun +Inner Desert Stone Brick Stair=Tangga Tembok Batu Gurun Dalam +Outer Desert Stone Brick Stair=Tangga Tembok Batu Gurun Luar +Desert Stone Brick Slab=Lempengan Tembok Batu Gurun +Desert Stone Block Stair=Tangga Balok Batu Gurun +Inner Desert Stone Block Stair=Tangga Balok Batu Gurun Dalam +Outer Desert Stone Block Stair=Tangga Balok Batu Gurun Luar +Desert Stone Block Slab=Lempengan Balok Batu Gurun +Sandstone Stair=Tangga Batu Pasir +Inner Sandstone Stair=Tangga Batu Pasir Dalam +Outer Sandstone Stair=Tangga Batu Pasir Luar +Sandstone Slab=Lempengan Batu Pasir +Sandstone Brick Stair=Tangga Tembok Batu Pasir +Inner Sandstone Brick Stair=Tangga Tembok Batu Pasir Dalam +Outer Sandstone Brick Stair=Tangga Tembok Batu Pasir Luar +Sandstone Brick Slab=Lempengan Tembok Batu Pasir +Sandstone Block Stair=Tangga Balok Batu Pasir +Inner Sandstone Block Stair=Tangga Balok Batu Pasir Dalam +Outer Sandstone Block Stair=Tangga Balok Batu Pasir Luar +Sandstone Block Slab=Lempengan Balok Batu Pasir +Desert Sandstone Stair=Tangga Batu Pasir Gurun +Inner Desert Sandstone Stair=Tangga Batu Pasir Gurun Dalam +Outer Desert Sandstone Stair=Tangga Batu Pasir Gurun Luar +Desert Sandstone Slab=Lempengan Batu Pasir Gurun +Desert Sandstone Brick Stair=Tangga Tembok Batu Pasir Gurun +Inner Desert Sandstone Brick Stair=Tangga Tembok Batu Pasir Gurun Dalam +Outer Desert Sandstone Brick Stair=Tangga Tembok Batu Pasir Gurun Luar +Desert Sandstone Brick Slab=Lempengan Tembok Batu Pasir Gurun +Desert Sandstone Block Stair=Tangga Balok Batu Pasir Gurun +Inner Desert Sandstone Block Stair=Tangga Balok Batu Pasir Gurun Dalam +Outer Desert Sandstone Block Stair=Tangga Balok Batu Pasir Gurun Luar +Desert Sandstone Block Slab=Lempengan Balok Batu Pasir Gurun +Silver Sandstone Stair=Tangga Batu Pasir Perak +Inner Silver Sandstone Stair=Tangga Batu Pasir Perak Dalam +Outer Silver Sandstone Stair=Tangga Batu Pasir Perak Luar +Silver Sandstone Slab=Lempengan Batu Pasir Perak +Silver Sandstone Brick Stair=Tangga Tembok Batu Pasir Perak +Inner Silver Sandstone Brick Stair=Tangga Tembok Batu Pasir Perak Dalam +Outer Silver Sandstone Brick Stair=Tangga Tembok Batu Pasir Perak Luar +Silver Sandstone Brick Slab=Lempengan Tembok Batu Pasir Perak +Silver Sandstone Block Stair=Tangga Balok Batu Pasir Perak +Inner Silver Sandstone Block Stair=Tangga Balok Batu Pasir Perak Dalam +Outer Silver Sandstone Block Stair=Tangga Balok Batu Pasir Perak Luar +Silver Sandstone Block Slab=Lempengan Balok Batu Pasir Perak +Obsidian Stair=Tangga Obsidian +Inner Obsidian Stair=Tangga Obsidian Dalam +Outer Obsidian Stair=Tangga Obsidian Luar +Obsidian Slab=Lempengan Obsidian +Obsidian Brick Stair=Tangga Tembok Obsidian +Inner Obsidian Brick Stair=Tangga Tembok Obsidian Dalam +Outer Obsidian Brick Stair=Tangga Tembok Obsidian Luar +Obsidian Brick Slab=Lempengan Tembok Obsidian +Obsidian Block Stair=Tangga Balok Obsidian +Inner Obsidian Block Stair=Tangga Balok Obsidian Dalam +Outer Obsidian Block Stair=Tangga Balok Obsidian Luar +Obsidian Block Slab=Lempengan Balok Obsidian +Brick Stair=Tangga Bata +Inner Brick Stair=Tangga Bata Dalam +Outer Brick Stair=Tangga Bata Luar +Brick Slab=Lempengan Bata +Steel Block Stair=Tangga Balok Baja +Inner Steel Block Stair=Tangga Balok Baja Dalam +Outer Steel Block Stair=Tangga Balok Baja Luar +Steel Block Slab=Lempengan Balok Baja +Tin Block Stair=Tangga Balok Timah +Inner Tin Block Stair=Tangga Balok Timah Dalam +Outer Tin Block Stair=Tangga Balok Timah Luar +Tin Block Slab=Lempengan Balok Timah +Copper Block Stair=Tangga Balok Tembaga +Inner Copper Block Stair=Tangga Balok Tembaga Dalam +Outer Copper Block Stair=Tangga Balok Tembaga Luar +Copper Block Slab=Lempengan Balok Tembaga +Bronze Block Stair=Tangga Balok Perunggu +Inner Bronze Block Stair=Tangga Balok Perunggu Dalam +Outer Bronze Block Stair=Tangga Balok Perunggu Luar +Bronze Block Slab=Lempengan Balok Perunggu +Gold Block Stair=Tangga Balok Emas +Inner Gold Block Stair=Tangga Balok Emas Dalam +Outer Gold Block Stair=Tangga Balok Emas Luar +Gold Block Slab=Lempengan Balok Emas +Ice Stair=Tangga Es +Inner Ice Stair=Tangga Es Dalam +Outer Ice Stair=Tangga Es Luar +Ice Slab=Lempengan Es +Snow Block Stair=Tangga Balok Salju +Inner Snow Block Stair=Tangga Balok Salju Dalam +Outer Snow Block Stair=Tangga Balok Salju Luar +Snow Block Slab=Lempengan Balok Salju diff --git a/mods/stairs/locale/stairs.zh_CN.tr b/mods/stairs/locale/stairs.zh_CN.tr index 0a95776c..060ccaf7 100644 --- a/mods/stairs/locale/stairs.zh_CN.tr +++ b/mods/stairs/locale/stairs.zh_CN.tr @@ -1,145 +1,149 @@ # textdomain: stairs Glass Stair=玻璃楼梯 -Glass Slab=玻璃平板 -Inner Glass Stair=内玻璃楼梯 -Outer Glass Stair=外玻璃楼梯 +Glass Slab=玻璃台阶 +Inner Glass Stair=玻璃楼梯(内) +Outer Glass Stair=玻璃楼梯(外) Obsidian Glass Stair=黑曜石玻璃楼梯 -Obsidian Glass Slab=黑曜石玻璃平板 -Inner Obsidian Glass Stair=内黑曜石玻璃楼梯 -Outer Obsidian Glass Stair=外黑曜石玻璃楼梯 -Wooden Stair=木楼梯 -Inner Wooden Stair=内木楼梯 -Outer Wooden Stair=外木楼梯 -Wooden Slab=木平板 +Obsidian Glass Slab=黑曜石玻璃台阶 +Inner Obsidian Glass Stair=黑曜石玻璃楼梯(内) +Outer Obsidian Glass Stair=黑曜石玻璃楼梯(外) +Wooden Stair=木制楼梯 +Inner Wooden Stair=木楼梯(内) +Outer Wooden Stair=木楼梯(外) +Wooden Slab=木制台阶 Jungle Wood Stair=丛林木楼梯 -Inner Jungle Wood Stair=内丛林木楼梯 -Outer Jungle Wood Stair=外丛林木楼梯 -Jungle Wood Slab=丛林木平板 +Inner Jungle Wood Stair=丛林木楼梯(内) +Outer Jungle Wood Stair=丛林木楼梯(外) +Jungle Wood Slab=丛林木台阶 Pine Wood Stair=松木楼梯 -Inner Pine Wood Stair=内松木楼梯 -Outer Pine Wood Stair=外松木楼梯 -Pine Wood Slab=松木平板 -Acacia Wood Stair=相思木楼梯 -Inner Acacia Wood Stair=内相思木楼梯 -Outer Acacia Wood Stair=外相思木楼梯 -Acacia Wood Slab=相思木平板 +Inner Pine Wood Stair=松木楼梯(内) +Outer Pine Wood Stair=松木楼梯(外) +Pine Wood Slab=松木台阶 +Acacia Wood Stair=金合欢木楼梯 +Inner Acacia Wood Stair=金合欢木楼梯(内) +Outer Acacia Wood Stair=金合欢木楼梯(外) +Acacia Wood Slab=金合欢木台阶 Aspen Wood Stair=白杨木楼梯 -Inner Aspen Wood Stair=内白杨木楼梯 -Outer Aspen Wood Stair=外白杨木楼梯 -Aspen Wood Slab=白杨木平板 +Inner Aspen Wood Stair=白杨木楼梯(内) +Outer Aspen Wood Stair=白杨木楼梯(外) +Aspen Wood Slab=白杨木台阶 +Blue Stained Stair=蓝木楼梯 +Inner Blue Stained Stair=蓝木楼梯(内) +Outer Blue Stained Stair=蓝木楼梯(外) +Blue Stained Slab=蓝木台阶 Stone Stair=石楼梯 -Inner Stone Stair=内石楼梯 -Outer Stone Stair=外石楼梯 -Stone Slab=石平板 -Cobblestone Stair=鹅卵石楼梯 -Inner Cobblestone Stair=内鹅卵石楼梯 -Outer Cobblestone Stair=外鹅卵石楼梯 -Cobblestone Slab=鹅卵石平板 -Mossy Cobblestone Stair=生苔的鹅卵石楼梯 -Inner Mossy Cobblestone Stair=内生苔的鹅卵石楼梯 -Outer Mossy Cobblestone Stair=外生苔的鹅卵石楼梯 -Mossy Cobblestone Slab=生苔的鹅卵石平板 +Inner Stone Stair=石楼梯(内) +Outer Stone Stair=石楼梯(外) +Stone Slab=石台阶 +Cobblestone Stair=圆石楼梯 +Inner Cobblestone Stair=圆石楼梯(内) +Outer Cobblestone Stair=圆石楼梯(外) +Cobblestone Slab=圆石台阶 +Mossy Cobblestone Stair=苔石楼梯 +Inner Mossy Cobblestone Stair=苔石楼梯(内) +Outer Mossy Cobblestone Stair=苔石楼梯(外) +Mossy Cobblestone Slab=苔石台阶 Stone Brick Stair=石砖楼梯 -Inner Stone Brick Stair=内石砖楼梯 -Outer Stone Brick Stair=外石砖楼梯 -Stone Brick Slab=石砖平板 +Inner Stone Brick Stair=石砖楼梯(内) +Outer Stone Brick Stair=石砖楼梯(外) +Stone Brick Slab=石砖台阶 Stone Block Stair=石块楼梯 -Inner Stone Block Stair=内石块楼梯 -Outer Stone Block Stair=外石块楼梯 -Stone Block Slab=石块平板 +Inner Stone Block Stair=石块楼梯(内) +Outer Stone Block Stair=石块楼梯(外) +Stone Block Slab=石块台阶 Desert Stone Stair=沙漠石楼梯 -Inner Desert Stone Stair=内沙漠石楼梯 -Outer Desert Stone Stair=外沙漠石楼梯 -Desert Stone Slab=沙漠石平板 -Desert Cobblestone Stair=沙漠鹅卵石楼梯 -Inner Desert Cobblestone Stair=内沙漠鹅卵石 -Outer Desert Cobblestone Stair=外沙漠鹅卵石 -Desert Cobblestone Slab=沙漠鹅卵石平板 +Inner Desert Stone Stair=沙漠石楼梯(内) +Outer Desert Stone Stair=沙漠石楼梯(外) +Desert Stone Slab=沙漠石台阶 +Desert Cobblestone Stair=沙漠圆石楼梯 +Inner Desert Cobblestone Stair=沙漠圆石楼梯(内) +Outer Desert Cobblestone Stair=沙漠圆石楼梯(外) +Desert Cobblestone Slab=沙漠圆石台阶 Desert Stone Brick Stair=沙漠石砖楼梯 -Inner Desert Stone Brick Stair=内沙漠石砖楼梯 -Outer Desert Stone Brick Stair=外沙漠石砖楼梯 -Desert Stone Brick Slab=沙漠石砖平板 +Inner Desert Stone Brick Stair=沙漠石砖楼梯(内) +Outer Desert Stone Brick Stair=沙漠石砖楼梯(外) +Desert Stone Brick Slab=沙漠石砖台阶 Desert Stone Block Stair=沙漠石块楼梯 -Inner Desert Stone Block Stair=内沙漠石块楼梯 -Outer Desert Stone Block Stair=外沙漠石块楼梯 -Desert Stone Block Slab=沙漠石块平板 -Sandstone Stair=砂岩楼梯 -Inner Sandstone Stair=内砂岩楼梯 -Outer Sandstone Stair=外砂岩楼梯 -Sandstone Slab=砂岩平板 -Sandstone Brick Stair=砂岩砖楼梯 -Inner Sandstone Brick Stair=内砂岩砖楼梯 -Outer Sandstone Brick Stair=外砂岩砖楼梯 -Sandstone Brick Slab=砂岩砖平板 -Sandstone Block Stair=砂岩块楼梯 -Inner Sandstone Block Stair=内砂岩块楼梯 -Outer Sandstone Block Stair=外砂岩块楼梯 -Sandstone Block Slab=砂岩块平板 -Desert Sandstone Stair=沙漠砂岩楼梯 -Inner Desert Sandstone Stair=内沙漠砂岩楼梯 -Outer Desert Sandstone Stair=外沙漠砂岩楼梯 -Desert Sandstone Slab=沙漠砂岩平板 -Desert Sandstone Brick Stair=沙漠砂岩砖楼梯 -Inner Desert Sandstone Brick Stair=内沙漠砂岩砖楼梯 -Outer Desert Sandstone Brick Stair=外沙漠砂岩砖楼梯 -Desert Sandstone Brick Slab=沙漠砂岩砖平板 -Desert Sandstone Block Stair=沙漠砂岩块楼梯 -Inner Desert Sandstone Block Stair=内沙漠砂岩块楼梯 -Outer Desert Sandstone Block Stair=外沙漠砂岩块楼梯 -Desert Sandstone Block Slab=沙漠砂岩块平板 -Silver Sandstone Stair=银砂岩楼梯 -Inner Silver Sandstone Stair=内银砂岩楼梯 -Outer Silver Sandstone Stair=外银砂岩楼梯 -Silver Sandstone Slab=银砂岩平板 -Silver Sandstone Brick Stair=银砂岩砖楼梯 -Inner Silver Sandstone Brick Stair=内银砂岩砖楼梯 -Outer Silver Sandstone Brick Stair=外银砂岩砖楼梯 -Silver Sandstone Brick Slab=银砂岩砖平板 -Silver Sandstone Block Stair=银砂岩块楼梯 -Inner Silver Sandstone Block Stair=内银砂岩块楼梯 -Outer Silver Sandstone Block Stair=外银砂岩块楼梯 -Silver Sandstone Block Slab=银砂岩块平板 +Inner Desert Stone Block Stair=沙漠石块楼梯(内) +Outer Desert Stone Block Stair=沙漠石块楼梯(外) +Desert Stone Block Slab=沙漠石块台阶 +Sandstone Stair=沙石楼梯 +Inner Sandstone Stair=沙石楼梯(内) +Outer Sandstone Stair=沙石楼梯(外) +Sandstone Slab=沙石台阶 +Sandstone Brick Stair=沙石砖楼梯 +Inner Sandstone Brick Stair=沙石砖楼梯(内) +Outer Sandstone Brick Stair=沙石砖楼梯(外) +Sandstone Brick Slab=沙石砖台阶 +Sandstone Block Stair=沙石块楼梯 +Inner Sandstone Block Stair=沙石块楼梯(内) +Outer Sandstone Block Stair=沙石块楼梯(外) +Sandstone Block Slab=沙石块台阶 +Desert Sandstone Stair=沙漠沙石楼梯 +Inner Desert Sandstone Stair=沙漠沙石楼梯(内) +Outer Desert Sandstone Stair=沙漠沙石楼梯(外) +Desert Sandstone Slab=沙漠沙石台阶 +Desert Sandstone Brick Stair=沙漠沙石砖楼梯 +Inner Desert Sandstone Brick Stair=沙漠沙石砖楼梯(内) +Outer Desert Sandstone Brick Stair=沙漠沙石砖楼梯(外) +Desert Sandstone Brick Slab=沙漠沙石砖台阶 +Desert Sandstone Block Stair=沙漠沙石块楼梯 +Inner Desert Sandstone Block Stair=沙漠沙石块楼梯(内) +Outer Desert Sandstone Block Stair=沙漠沙石块楼梯(外) +Desert Sandstone Block Slab=沙漠沙石块台阶 +Silver Sandstone Stair=银沙石楼梯 +Inner Silver Sandstone Stair=银沙石楼梯(内) +Outer Silver Sandstone Stair=银沙石楼梯(外) +Silver Sandstone Slab=银沙石台阶 +Silver Sandstone Brick Stair=银沙石砖楼梯 +Inner Silver Sandstone Brick Stair=银沙石砖楼梯(内) +Outer Silver Sandstone Brick Stair=银沙石砖楼梯(外) +Silver Sandstone Brick Slab=银沙石砖台阶 +Silver Sandstone Block Stair=银沙石块楼梯 +Inner Silver Sandstone Block Stair=银沙石块楼梯(内) +Outer Silver Sandstone Block Stair=银沙石块楼梯(外) +Silver Sandstone Block Slab=银沙石块台阶 Obsidian Stair=黑曜石楼梯 -Inner Obsidian Stair=内黑曜石楼梯 -Outer Obsidian Stair=外黑曜石楼梯 -Obsidian Slab=黑曜石平板 +Inner Obsidian Stair=黑曜石楼梯(内) +Outer Obsidian Stair=黑曜石楼梯(外) +Obsidian Slab=黑曜石台阶 Obsidian Brick Stair=黑曜石砖楼梯 -Inner Obsidian Brick Stair=内黑曜石砖楼梯 -Outer Obsidian Brick Stair=外黑曜石砖楼梯 -Obsidian Brick Slab=黑曜石砖平板 +Inner Obsidian Brick Stair=黑曜石砖楼梯(内) +Outer Obsidian Brick Stair=黑曜石砖楼梯(外) +Obsidian Brick Slab=黑曜石砖台阶 Obsidian Block Stair=黑曜石块楼梯 -Inner Obsidian Block Stair=内黑曜石块楼梯 -Outer Obsidian Block Stair=外黑曜石块楼梯 -Obsidian Block Slab=黑曜石块平板 +Inner Obsidian Block Stair=黑曜石块楼梯(内) +Outer Obsidian Block Stair=黑曜石块楼梯(外) +Obsidian Block Slab=黑曜石块台阶 Brick Stair=砖楼梯 -Inner Brick Stair=内砖楼梯 -Outer Brick Stair=外砖楼梯 -Brick Slab=砖平板 -Steel Block Stair=钢楼梯 -Inner Steel Block Stair=内钢楼梯 -Outer Steel Block Stair=外钢楼梯 -Steel Block Slab=钢平板 -Tin Block Stair=锡楼梯 -Inner Tin Block Stair=内锡楼梯 -Outer Tin Block Stair=外锡楼梯 -Tin Block Slab=锡平板 -Copper Block Stair=铜楼梯 -Inner Copper Block Stair=内铜楼梯 -Outer Copper Block Stair=外铜楼梯 -Copper Block Slab=铜平板 -Bronze Block Stair=青铜楼梯 -Inner Bronze Block Stair=内青铜楼梯 -Outer Bronze Block Stair=外青铜楼梯 -Bronze Block Slab=青铜平板 -Gold Block Stair=金楼梯 -Inner Gold Block Stair=内金楼梯 -Outer Gold Block Stair=外金楼梯 -Gold Block Slab=金平板 -Ice Stair=冰楼梯 -Inner Ice Stair=内冰楼梯 -Outer Ice Stair=外冰楼梯 -Ice Slab=冰平板 +Inner Brick Stair=砖楼梯(内) +Outer Brick Stair=砖楼梯(外) +Brick Slab=砖制台阶 +Steel Block Stair=铁块楼梯 +Inner Steel Block Stair=铁块楼梯(内) +Outer Steel Block Stair=铁块楼梯(外) +Steel Block Slab=铁块台阶 +Tin Block Stair=锡块楼梯 +Inner Tin Block Stair=锡块楼梯(内) +Outer Tin Block Stair=锡块楼梯(外) +Tin Block Slab=锡块台阶 +Copper Block Stair=铜块楼梯 +Inner Copper Block Stair=铜块楼梯(内) +Outer Copper Block Stair=铜块楼梯(外) +Copper Block Slab=铜块台阶 +Bronze Block Stair=青铜块楼梯 +Inner Bronze Block Stair=青铜块楼梯(内) +Outer Bronze Block Stair=青铜块楼梯(外) +Bronze Block Slab=青铜块台阶 +Gold Block Stair=金块楼梯 +Inner Gold Block Stair=金块楼梯(内) +Outer Gold Block Stair=金块楼梯(外) +Gold Block Slab=金块台阶 +Ice Stair=冰阶梯 +Inner Ice Stair=冰块楼梯(内) +Outer Ice Stair=冰块楼梯(外) +Ice Slab=冰台阶 Snow Block Stair=雪块楼梯 -Inner Snow Block Stair=内雪块楼梯 -Outer Snow Block Stair=外雪块楼梯 -Snow Block Slab=雪块平板 +Inner Snow Block Stair=雪块楼梯(内) +Outer Snow Block Stair=雪块楼梯(外) +Snow Block Slab=雪块台阶 diff --git a/mods/stairs/locale/stairs.zh_TW.tr b/mods/stairs/locale/stairs.zh_TW.tr new file mode 100644 index 00000000..00c43e22 --- /dev/null +++ b/mods/stairs/locale/stairs.zh_TW.tr @@ -0,0 +1,149 @@ +# textdomain: stairs +Glass Stair=玻璃樓梯 +Glass Slab=玻璃臺階 +Inner Glass Stair=玻璃樓梯(內) +Outer Glass Stair=玻璃樓梯(外) +Obsidian Glass Stair=黑曜石玻璃樓梯 +Obsidian Glass Slab=黑曜石玻璃臺階 +Inner Obsidian Glass Stair=黑曜石玻璃樓梯(內) +Outer Obsidian Glass Stair=黑曜石玻璃樓梯(外) +Wooden Stair=木製樓梯 +Inner Wooden Stair=木樓梯(內) +Outer Wooden Stair=木樓梯(外) +Wooden Slab=木製臺階 +Jungle Wood Stair=叢林木樓梯 +Inner Jungle Wood Stair=叢林木樓梯(內) +Outer Jungle Wood Stair=叢林木樓梯(外) +Jungle Wood Slab=叢林木臺階 +Pine Wood Stair=松木樓梯 +Inner Pine Wood Stair=松木樓梯(內) +Outer Pine Wood Stair=松木樓梯(外) +Pine Wood Slab=松木臺階 +Acacia Wood Stair=金合歡木樓梯 +Inner Acacia Wood Stair=金合歡木樓梯(內) +Outer Acacia Wood Stair=金合歡木樓梯(外) +Acacia Wood Slab=金合歡木臺階 +Aspen Wood Stair=白楊木樓梯 +Inner Aspen Wood Stair=白楊木樓梯(內) +Outer Aspen Wood Stair=白楊木樓梯(外) +Aspen Wood Slab=白楊木臺階 +Blue Stained Stair=藍木樓梯 +Inner Blue Stained Stair=藍木樓梯(內) +Outer Blue Stained Stair=藍木樓梯(外) +Blue Stained Slab=藍木臺階 +Stone Stair=石樓梯 +Inner Stone Stair=石樓梯(內) +Outer Stone Stair=石樓梯(外) +Stone Slab=石臺階 +Cobblestone Stair=圓石樓梯 +Inner Cobblestone Stair=圓石樓梯(內) +Outer Cobblestone Stair=圓石樓梯(外) +Cobblestone Slab=圓石臺階 +Mossy Cobblestone Stair=苔石樓梯 +Inner Mossy Cobblestone Stair=苔石樓梯(內) +Outer Mossy Cobblestone Stair=苔石樓梯(外) +Mossy Cobblestone Slab=苔石臺階 +Stone Brick Stair=石磚樓梯 +Inner Stone Brick Stair=石磚樓梯(內) +Outer Stone Brick Stair=石磚樓梯(外) +Stone Brick Slab=石磚臺階 +Stone Block Stair=石塊樓梯 +Inner Stone Block Stair=石塊樓梯(內) +Outer Stone Block Stair=石塊樓梯(外) +Stone Block Slab=石塊臺階 +Desert Stone Stair=沙漠石樓梯 +Inner Desert Stone Stair=沙漠石樓梯(內) +Outer Desert Stone Stair=沙漠石樓梯(外) +Desert Stone Slab=沙漠石臺階 +Desert Cobblestone Stair=沙漠圓石樓梯 +Inner Desert Cobblestone Stair=沙漠圓石樓梯(內) +Outer Desert Cobblestone Stair=沙漠圓石樓梯(外) +Desert Cobblestone Slab=沙漠圓石臺階 +Desert Stone Brick Stair=沙漠石磚樓梯 +Inner Desert Stone Brick Stair=沙漠石磚樓梯(內) +Outer Desert Stone Brick Stair=沙漠石磚樓梯(外) +Desert Stone Brick Slab=沙漠石磚臺階 +Desert Stone Block Stair=沙漠石塊樓梯 +Inner Desert Stone Block Stair=沙漠石塊樓梯(內) +Outer Desert Stone Block Stair=沙漠石塊樓梯(外) +Desert Stone Block Slab=沙漠石塊臺階 +Sandstone Stair=沙石樓梯 +Inner Sandstone Stair=沙石樓梯(內) +Outer Sandstone Stair=沙石樓梯(外) +Sandstone Slab=沙石臺階 +Sandstone Brick Stair=沙石磚樓梯 +Inner Sandstone Brick Stair=沙石磚樓梯(內) +Outer Sandstone Brick Stair=沙石磚樓梯(外) +Sandstone Brick Slab=沙石磚臺階 +Sandstone Block Stair=沙石塊樓梯 +Inner Sandstone Block Stair=沙石塊樓梯(內) +Outer Sandstone Block Stair=沙石塊樓梯(外) +Sandstone Block Slab=沙石塊臺階 +Desert Sandstone Stair=沙漠沙石樓梯 +Inner Desert Sandstone Stair=沙漠沙石樓梯(內) +Outer Desert Sandstone Stair=沙漠沙石樓梯(外) +Desert Sandstone Slab=沙漠沙石臺階 +Desert Sandstone Brick Stair=沙漠沙石磚樓梯 +Inner Desert Sandstone Brick Stair=沙漠沙石磚樓梯(內) +Outer Desert Sandstone Brick Stair=沙漠沙石磚樓梯(外) +Desert Sandstone Brick Slab=沙漠沙石磚臺階 +Desert Sandstone Block Stair=沙漠沙石塊樓梯 +Inner Desert Sandstone Block Stair=沙漠沙石塊樓梯(內) +Outer Desert Sandstone Block Stair=沙漠沙石塊樓梯(外) +Desert Sandstone Block Slab=沙漠沙石塊臺階 +Silver Sandstone Stair=銀沙石樓梯 +Inner Silver Sandstone Stair=銀沙石樓梯(內) +Outer Silver Sandstone Stair=銀沙石樓梯(外) +Silver Sandstone Slab=銀沙石臺階 +Silver Sandstone Brick Stair=銀沙石磚樓梯 +Inner Silver Sandstone Brick Stair=銀沙石磚樓梯(內) +Outer Silver Sandstone Brick Stair=銀沙石磚樓梯(外) +Silver Sandstone Brick Slab=銀沙石磚臺階 +Silver Sandstone Block Stair=銀沙石塊樓梯 +Inner Silver Sandstone Block Stair=銀沙石塊樓梯(內) +Outer Silver Sandstone Block Stair=銀沙石塊樓梯(外) +Silver Sandstone Block Slab=銀沙石塊臺階 +Obsidian Stair=黑曜石樓梯 +Inner Obsidian Stair=黑曜石樓梯(內) +Outer Obsidian Stair=黑曜石樓梯(外) +Obsidian Slab=黑曜石臺階 +Obsidian Brick Stair=黑曜石磚樓梯 +Inner Obsidian Brick Stair=黑曜石磚樓梯(內) +Outer Obsidian Brick Stair=黑曜石磚樓梯(外) +Obsidian Brick Slab=黑曜石磚臺階 +Obsidian Block Stair=黑曜石塊樓梯 +Inner Obsidian Block Stair=黑曜石塊樓梯(內) +Outer Obsidian Block Stair=黑曜石塊樓梯(外) +Obsidian Block Slab=黑曜石塊臺階 +Brick Stair=磚樓梯 +Inner Brick Stair=磚樓梯(內) +Outer Brick Stair=磚樓梯(外) +Brick Slab=磚制臺階 +Steel Block Stair=鐵塊樓梯 +Inner Steel Block Stair=鐵塊樓梯(內) +Outer Steel Block Stair=鐵塊樓梯(外) +Steel Block Slab=鐵塊臺階 +Tin Block Stair=錫塊樓梯 +Inner Tin Block Stair=錫塊樓梯(內) +Outer Tin Block Stair=錫塊樓梯(外) +Tin Block Slab=錫塊臺階 +Copper Block Stair=銅塊樓梯 +Inner Copper Block Stair=銅塊樓梯(內) +Outer Copper Block Stair=銅塊樓梯(外) +Copper Block Slab=銅塊臺階 +Bronze Block Stair=青銅塊樓梯 +Inner Bronze Block Stair=青銅塊樓梯(內) +Outer Bronze Block Stair=青銅塊樓梯(外) +Bronze Block Slab=青銅塊臺階 +Gold Block Stair=金塊樓梯 +Inner Gold Block Stair=金塊樓梯(內) +Outer Gold Block Stair=金塊樓梯(外) +Gold Block Slab=金塊臺階 +Ice Stair=冰階梯 +Inner Ice Stair=冰塊樓梯(內) +Outer Ice Stair=冰塊樓梯(外) +Ice Slab=冰臺階 +Snow Block Stair=雪塊樓梯 +Inner Snow Block Stair=雪塊樓梯(內) +Outer Snow Block Stair=雪塊樓梯(外) +Snow Block Slab=雪塊臺階 diff --git a/mods/tnt/init.lua b/mods/tnt/init.lua index 0e061fa6..ae28191a 100644 --- a/mods/tnt/init.lua +++ b/mods/tnt/init.lua @@ -22,7 +22,7 @@ local tnt_radius = tonumber(minetest.settings:get("tnt_radius") or 3) -- Fill a list with data for content IDs, after all nodes are registered local cid_data = {} -minetest.after(0, function() +minetest.register_on_mods_loaded(function() for name, def in pairs(minetest.registered_nodes) do cid_data[minetest.get_content_id(name)] = { name = name, @@ -163,42 +163,41 @@ local function entity_physics(pos, radius, drops) local damage = (4 / dist) * radius if obj:is_player() then - -- currently the engine has no method to set - -- player velocity. See #2960 - -- instead, we knock the player back 1.0 node, and slightly upwards local dir = vector.normalize(vector.subtract(obj_pos, pos)) - local moveoff = vector.multiply(dir, dist + 1.0) - local newpos = vector.add(pos, moveoff) - newpos = vector.add(newpos, {x = 0, y = 0.2, z = 0}) - obj:set_pos(newpos) + local moveoff = vector.multiply(dir, 2 / dist * radius) + obj:add_player_velocity(moveoff) obj:set_hp(obj:get_hp() - damage) else - local do_damage = true - local do_knockback = true - local entity_drops = {} local luaobj = obj:get_luaentity() - local objdef = minetest.registered_entities[luaobj.name] - if objdef and objdef.on_blast then - do_damage, do_knockback, entity_drops = objdef.on_blast(luaobj, damage) - end + -- object might have disappeared somehow + if luaobj then + local do_damage = true + local do_knockback = true + local entity_drops = {} + local objdef = minetest.registered_entities[luaobj.name] - if do_knockback then - local obj_vel = obj:get_velocity() - obj:set_velocity(calc_velocity(pos, obj_pos, - obj_vel, radius * 10)) - end - if do_damage then - if not obj:get_armor_groups().immortal then - obj:punch(obj, 1.0, { - full_punch_interval = 1.0, - damage_groups = {fleshy = damage}, - }, nil) + if objdef and objdef.on_blast then + do_damage, do_knockback, entity_drops = objdef.on_blast(luaobj, damage) + end + + if do_knockback then + local obj_vel = obj:get_velocity() + obj:set_velocity(calc_velocity(pos, obj_pos, + obj_vel, radius * 10)) + end + if do_damage then + if not obj:get_armor_groups().immortal then + obj:punch(obj, 1.0, { + full_punch_interval = 1.0, + damage_groups = {fleshy = damage}, + }, nil) + end + end + for _, item in pairs(entity_drops) do + add_drop(drops, item) end - end - for _, item in pairs(entity_drops) do - add_drop(drops, item) end end end @@ -235,12 +234,16 @@ local function add_effects(pos, radius, drops) -- we just dropped some items. Look at the items entities and pick -- one of them to use as texture local texture = "tnt_blast.png" --fallback texture + local node local most = 0 for name, stack in pairs(drops) do local count = stack:get_count() if count > most then most = count local def = minetest.registered_nodes[name] + if def then + node = { name = name } + end if def and def.tiles and def.tiles[1] then texture = def.tiles[1] end @@ -258,9 +261,11 @@ local function add_effects(pos, radius, drops) maxacc = {x = 0, y = -10, z = 0}, minexptime = 0.8, maxexptime = 2.0, - minsize = radius * 0.66, - maxsize = radius * 2, + minsize = radius * 0.33, + maxsize = radius, texture = texture, + -- ^ only as fallback for clients without support for `node` parameter + node = node, collisiondetection = true, }) end @@ -274,7 +279,7 @@ function tnt.burn(pos, nodename) def.on_ignite(pos) elseif minetest.get_item_group(name, "tnt") > 0 then minetest.swap_node(pos, {name = name .. "_burning"}) - minetest.sound_play("tnt_ignite", {pos = pos}) + minetest.sound_play("tnt_ignite", {pos = pos}, true) minetest.get_node_timer(pos):start(1) end end @@ -289,10 +294,15 @@ local function tnt_explode(pos, radius, ignore_protection, ignore_on_blast, owne local a = VoxelArea:new({MinEdge = minp, MaxEdge = maxp}) local data = vm1:get_data() local count = 0 - local c_tnt = minetest.get_content_id("tnt:tnt") + local c_tnt local c_tnt_burning = minetest.get_content_id("tnt:tnt_burning") local c_tnt_boom = minetest.get_content_id("tnt:boom") local c_air = minetest.get_content_id("air") + if enable_tnt then + c_tnt = minetest.get_content_id("tnt:tnt") + else + c_tnt = c_tnt_burning -- tnt is not registered if disabled + end -- make sure we still have explosion even when centre node isnt tnt related if explode_center then count = 1 @@ -398,12 +408,12 @@ function tnt.boom(pos, def) def.damage_radius = def.damage_radius or def.radius * 2 local meta = minetest.get_meta(pos) local owner = meta:get_string("owner") - if not def.explode_center then + if not def.explode_center and def.ignore_protection ~= true then minetest.set_node(pos, {name = "tnt:boom"}) end local sound = def.sound or "tnt_explode" minetest.sound_play(sound, {pos = pos, gain = 2.5, - max_hear_distance = math.min(def.radius * 20, 128)}) + max_hear_distance = math.min(def.radius * 20, 128)}, true) local drops, radius = tnt_explode(pos, def.radius, def.ignore_protection, def.ignore_on_blast, owner, def.explode_center) -- append entity drops @@ -541,7 +551,8 @@ minetest.register_node("tnt:gunpowder_burning", { -- unaffected by explosions on_blast = function() end, on_construct = function(pos) - minetest.sound_play("tnt_gunpowder_burning", {pos = pos, gain = 2}) + minetest.sound_play("tnt_gunpowder_burning", {pos = pos, + gain = 2}, true) minetest.get_node_timer(pos):start(1) end, }) @@ -672,7 +683,7 @@ function tnt.register_tnt(def) -- unaffected by explosions on_blast = function() end, on_construct = function(pos) - minetest.sound_play("tnt_ignite", {pos = pos}) + minetest.sound_play("tnt_ignite", {pos = pos}, true) minetest.get_node_timer(pos):start(4) minetest.check_for_falling(pos) end, diff --git a/mods/tnt/locale/tnt.id.tr b/mods/tnt/locale/tnt.id.tr new file mode 100644 index 00000000..2652ae0c --- /dev/null +++ b/mods/tnt/locale/tnt.id.tr @@ -0,0 +1,4 @@ +# textdomain: tnt +Gun Powder=Bubuk Mesiu +TNT Stick=Tongkat TNT +TNT=TNT diff --git a/mods/tnt/locale/tnt.zh_CN.tr b/mods/tnt/locale/tnt.zh_CN.tr index dcc1532c..0a3294e5 100644 --- a/mods/tnt/locale/tnt.zh_CN.tr +++ b/mods/tnt/locale/tnt.zh_CN.tr @@ -1,4 +1,4 @@ # textdomain: tnt Gun Powder=火药粉 TNT Stick=炸药棒 -TNT=炸药 +TNT=炸药包 diff --git a/mods/tnt/locale/tnt.zh_TW.tr b/mods/tnt/locale/tnt.zh_TW.tr new file mode 100644 index 00000000..c1b3caf3 --- /dev/null +++ b/mods/tnt/locale/tnt.zh_TW.tr @@ -0,0 +1,4 @@ +# textdomain: tnt +Gun Powder=火藥粉 +TNT Stick=炸藥棒 +TNT=炸藥包 diff --git a/mods/vessels/init.lua b/mods/vessels/init.lua index b330efc2..71a06893 100644 --- a/mods/vessels/init.lua +++ b/mods/vessels/init.lua @@ -228,3 +228,10 @@ minetest.register_craft({ recipe = "vessels:shelf", burntime = 30, }) + +-- Register glass fragments as dungeon loot +if minetest.global_exists("dungeon_loot") then + dungeon_loot.register({ + name = "vessels:glass_fragments", chance = 0.35, count = {1, 4} + }) +end diff --git a/mods/vessels/locale/template.txt b/mods/vessels/locale/template.txt index f4aae91b..e6e5f69a 100644 --- a/mods/vessels/locale/template.txt +++ b/mods/vessels/locale/template.txt @@ -1,8 +1,8 @@ # textdomain: vessels +Empty Vessels Shelf= +Vessels Shelf (@1 items)= Vessels Shelf= Empty Glass Bottle= Empty Drinking Glass= Empty Heavy Steel Bottle= Glass Fragments= -Empty Vessels Shelf= -Vessels Shelf (@1 items)= diff --git a/mods/vessels/locale/vessels.id.tr b/mods/vessels/locale/vessels.id.tr new file mode 100644 index 00000000..f80fbc3d --- /dev/null +++ b/mods/vessels/locale/vessels.id.tr @@ -0,0 +1,8 @@ +# textdomain: vessels +Empty Vessels Shelf=Rak Bejana Kosong +Vessels Shelf (@1 items)=Rak Bejana (@1 barang) +Vessels Shelf=Rak Bejana +Empty Glass Bottle=Botol Kaca Kosong +Empty Drinking Glass=Gelas Minum Kosong +Empty Heavy Steel Bottle=Botol Baja Berat Kosong +Glass Fragments=Pecahan Kaca diff --git a/mods/vessels/locale/vessels.zh_CN.tr b/mods/vessels/locale/vessels.zh_CN.tr index 0604cbd3..f91ccd85 100644 --- a/mods/vessels/locale/vessels.zh_CN.tr +++ b/mods/vessels/locale/vessels.zh_CN.tr @@ -2,7 +2,7 @@ Vessels Shelf=容器架 Empty Glass Bottle=空玻璃瓶 Empty Drinking Glass=空水杯 -Empty Heavy Steel Bottle=空重钢瓶 +Empty Heavy Steel Bottle=空重型钢瓶 Glass Fragments=玻璃碎片 Empty Vessels Shelf=空容器架 Vessels Shelf (@1 items)=容器架(@1项) diff --git a/mods/vessels/locale/vessels.zh_TW.tr b/mods/vessels/locale/vessels.zh_TW.tr new file mode 100644 index 00000000..7936c88c --- /dev/null +++ b/mods/vessels/locale/vessels.zh_TW.tr @@ -0,0 +1,8 @@ +# textdomain: vessels +Vessels Shelf=容器架 +Empty Glass Bottle=空玻璃瓶 +Empty Drinking Glass=空水杯 +Empty Heavy Steel Bottle=空重型鋼瓶 +Glass Fragments=玻璃碎片 +Empty Vessels Shelf=空容器架 +Vessels Shelf (@1 items)=容器架(@1項) diff --git a/mods/vessels/mod.conf b/mods/vessels/mod.conf index 7551b54a..eba9076f 100644 --- a/mods/vessels/mod.conf +++ b/mods/vessels/mod.conf @@ -1,3 +1,4 @@ name = vessels description = Minetest Game mod: vessels depends = default +optional_depends = dungeon_loot diff --git a/mods/walls/locale/walls.id.tr b/mods/walls/locale/walls.id.tr new file mode 100644 index 00000000..8bfd9c77 --- /dev/null +++ b/mods/walls/locale/walls.id.tr @@ -0,0 +1,4 @@ +# textdomain: walls +Cobblestone Wall=Tembok Bongkahan Batu +Mossy Cobblestone Wall=Tembok Bongkahan Batu Berlumut +Desert Cobblestone Wall=Tembok Bongkahan Batu Gurun diff --git a/mods/walls/locale/walls.zh_CN.tr b/mods/walls/locale/walls.zh_CN.tr index eeee1164..f590e825 100644 --- a/mods/walls/locale/walls.zh_CN.tr +++ b/mods/walls/locale/walls.zh_CN.tr @@ -1,4 +1,4 @@ # textdomain: walls Cobblestone Wall=鹅卵石墙 -Mossy Cobblestone Wall=生苔的鹅卵石墙 +Mossy Cobblestone Wall=苔藓覆盖的鹅卵石墙 Desert Cobblestone Wall=沙漠鹅卵石墙 diff --git a/mods/walls/locale/walls.zh_TW.tr b/mods/walls/locale/walls.zh_TW.tr new file mode 100644 index 00000000..ba1285f6 --- /dev/null +++ b/mods/walls/locale/walls.zh_TW.tr @@ -0,0 +1,4 @@ +# textdomain: walls +Cobblestone Wall=鵝卵石牆 +Mossy Cobblestone Wall=苔蘚覆蓋的鵝卵石牆 +Desert Cobblestone Wall=沙漠鵝卵石牆 diff --git a/mods/weather/init.lua b/mods/weather/init.lua index c0d1098f..3b9a305a 100644 --- a/mods/weather/init.lua +++ b/mods/weather/init.lua @@ -82,18 +82,26 @@ local function update_clouds() nobj_speedx = nobj_speedx or minetest.get_perlin(np_speedx) nobj_speedz = nobj_speedz or minetest.get_perlin(np_speedz) - local n_density = nobj_density:get_2d({x = time, y = 0}) - local n_thickness = nobj_thickness:get_2d({x = time, y = 0}) - local n_speedx = nobj_speedx:get_2d({x = time, y = 0}) - local n_speedz = nobj_speedz:get_2d({x = time, y = 0}) + local n_density = nobj_density:get_2d({x = time, y = 0}) -- 0 to 1 + local n_thickness = nobj_thickness:get_2d({x = time, y = 0}) -- 0 to 1 + local n_speedx = nobj_speedx:get_2d({x = time, y = 0}) -- -1 to 1 + local n_speedz = nobj_speedz:get_2d({x = time, y = 0}) -- -1 to 1 for _, player in ipairs(minetest.get_connected_players()) do local humid = minetest.get_humidity(player:get_pos()) + -- Default and classic density value is 0.4, make this happen + -- at humidity midvalue 50 when n_density is at midvalue 0.5. + -- density_max = 0.25 at humid = 0. + -- density_max = 0.8 at humid = 50. + -- density_max = 1.35 at humid = 100. + local density_max = 0.8 + ((humid - 50) / 50) * 0.55 player:set_clouds({ - density = rangelim(humid / 100, 0.25, 1.0) * n_density, + -- Range limit density_max to always have occasional + -- small scattered clouds at extreme low humidity. + density = rangelim(density_max, 0.2, 1.0) * n_density, thickness = math.max(math.floor( rangelim(32 * humid / 100, 8, 32) * n_thickness - ), 1), + ), 2), speed = {x = n_speedx * 4, z = n_speedz * 4}, }) end diff --git a/mods/wool/locale/wool.id.tr b/mods/wool/locale/wool.id.tr new file mode 100644 index 00000000..60e917c7 --- /dev/null +++ b/mods/wool/locale/wool.id.tr @@ -0,0 +1,16 @@ +# textdomain: wool +White Wool=Wol Putih +Grey Wool=Wol Abu +Dark Grey Wool=Wol Abu Tua +Black Wool=Wol Hitam +Violet Wool=Wol Ungu +Blue Wool=Wol Biru +Cyan Wool=Wol Sian +Dark Green Wool=Wol Hijau Tua +Green Wool=Wol Hijau +Yellow Wool=Wol Kuning +Brown Wool=Wol Cokelat +Orange Wool=Wol Oranye +Red Wool=Wol Merah +Magenta Wool=Wol Magenta +Pink Wool=Wol Jambon diff --git a/mods/wool/locale/wool.zh_CN.tr b/mods/wool/locale/wool.zh_CN.tr index 3bea711b..caac9ee2 100644 --- a/mods/wool/locale/wool.zh_CN.tr +++ b/mods/wool/locale/wool.zh_CN.tr @@ -13,4 +13,4 @@ Brown Wool=棕羊毛 Orange Wool=橙羊毛 Red Wool=红羊毛 Magenta Wool=品红羊毛 -Pink Wool=淡红羊毛 +Pink Wool=粉红羊毛 diff --git a/mods/wool/locale/wool.zh_TW.tr b/mods/wool/locale/wool.zh_TW.tr new file mode 100644 index 00000000..290a1fed --- /dev/null +++ b/mods/wool/locale/wool.zh_TW.tr @@ -0,0 +1,16 @@ +# textdomain: wool +White Wool=白羊毛 +Grey Wool=灰羊毛 +Dark Grey Wool=暗灰羊毛 +Black Wool=黑羊毛 +Violet Wool=紫羊毛 +Blue Wool=藍羊毛 +Cyan Wool=青羊毛 +Dark Green Wool=暗綠羊毛 +Green Wool=綠羊毛 +Yellow Wool=黃羊毛 +Brown Wool=棕羊毛 +Orange Wool=橙羊毛 +Red Wool=紅羊毛 +Magenta Wool=品紅羊毛 +Pink Wool=粉紅羊毛 diff --git a/mods/xpanes/init.lua b/mods/xpanes/init.lua index 758fbbb7..e195dbbc 100644 --- a/mods/xpanes/init.lua +++ b/mods/xpanes/init.lua @@ -106,12 +106,12 @@ function xpanes.register_pane(name, def) wield_image = def.wield_image, paramtype2 = "facedir", tiles = { - def.textures[3], - def.textures[3], - def.textures[3], - def.textures[3], - def.textures[1], - def.textures[1] + def.textures[3], + def.textures[3], + def.textures[3], + def.textures[3], + def.textures[1], + def.textures[1] }, groups = flatgroups, drop = "xpanes:" .. name .. "_flat", @@ -137,7 +137,11 @@ function xpanes.register_pane(name, def) is_ground_content = false, sunlight_propagates = true, description = def.description, - tiles = {def.textures[3], def.textures[3], def.textures[1]}, + tiles = { + def.textures[3], + def.textures[3], + def.textures[1] + }, groups = groups, drop = "xpanes:" .. name .. "_flat", sounds = def.sounds, @@ -161,7 +165,7 @@ end xpanes.register_pane("pane", { description = S("Glass Pane"), - textures = {"default_glass.png","xpanes_pane_half.png","xpanes_edge.png"}, + textures = {"default_glass.png", "", "xpanes_edge.png"}, inventory_image = "default_glass.png", wield_image = "default_glass.png", sounds = default.node_sound_glass_defaults(), @@ -174,7 +178,7 @@ xpanes.register_pane("pane", { xpanes.register_pane("obsidian_pane", { description = S("Obsidian Glass Pane"), - textures = {"default_obsidian_glass.png","xpanes_pane_half.png","xpanes_edge_obsidian.png"}, + textures = {"default_obsidian_glass.png", "", "xpanes_edge_obsidian.png"}, inventory_image = "default_obsidian_glass.png", wield_image = "default_obsidian_glass.png", sounds = default.node_sound_glass_defaults(), @@ -187,7 +191,7 @@ xpanes.register_pane("obsidian_pane", { xpanes.register_pane("bar", { description = S("Steel Bars"), - textures = {"xpanes_bar.png","xpanes_bar.png","xpanes_bar_top.png"}, + textures = {"xpanes_bar.png", "", "xpanes_bar_top.png"}, inventory_image = "xpanes_bar.png", wield_image = "xpanes_bar.png", groups = {cracky=2}, @@ -219,7 +223,7 @@ if minetest.get_modpath("doors") then description = S("Steel Bar Door"), inventory_image = "xpanes_item_steel_bar.png", protected = true, - groups = {cracky = 1, level = 2}, + groups = {node = 1, cracky = 1, level = 2}, sounds = default.node_sound_metal_defaults(), sound_open = "xpanes_steel_bar_door_open", sound_close = "xpanes_steel_bar_door_close", @@ -237,7 +241,7 @@ if minetest.get_modpath("doors") then tile_front = "xpanes_trapdoor_steel_bar.png", tile_side = "xpanes_trapdoor_steel_bar_side.png", protected = true, - groups = {cracky = 1, level = 2, door = 1}, + groups = {node = 1, cracky = 1, level = 2, door = 1}, sounds = default.node_sound_metal_defaults(), sound_open = "xpanes_steel_bar_door_open", sound_close = "xpanes_steel_bar_door_close", diff --git a/mods/xpanes/locale/xpanes.id.tr b/mods/xpanes/locale/xpanes.id.tr new file mode 100644 index 00000000..906cc0f8 --- /dev/null +++ b/mods/xpanes/locale/xpanes.id.tr @@ -0,0 +1,6 @@ +# textdomain: xpanes +Glass Pane=Panel Kaca +Obsidian Glass Pane=Panel Kaca Obsidian +Steel Bars=Batang Baja +Steel Bar Door=Pintu Batang Baja +Steel Bar Trapdoor=Pintu Kolong Batang Baja diff --git a/mods/xpanes/locale/xpanes.zh_CN.tr b/mods/xpanes/locale/xpanes.zh_CN.tr index 9cdb251a..7b1871c9 100644 --- a/mods/xpanes/locale/xpanes.zh_CN.tr +++ b/mods/xpanes/locale/xpanes.zh_CN.tr @@ -1,6 +1,6 @@ # textdomain: xpanes -Glass Pane=玻璃板 -Obsidian Glass Pane=黑曜石玻璃板 +Glass Pane=玻璃窗 +Obsidian Glass Pane=黑曜石玻璃窗 Steel Bars=钢筋 Steel Bar Door=钢筋门 Steel Bar Trapdoor=钢筋活板门 diff --git a/mods/xpanes/locale/xpanes.zh_TW.tr b/mods/xpanes/locale/xpanes.zh_TW.tr new file mode 100644 index 00000000..97ee7a28 --- /dev/null +++ b/mods/xpanes/locale/xpanes.zh_TW.tr @@ -0,0 +1,6 @@ +# textdomain: xpanes +Glass Pane=玻璃窗 +Obsidian Glass Pane=黑曜石玻璃窗 +Steel Bars=鋼筋 +Steel Bar Door=鋼筋門 +Steel Bar Trapdoor=鋼筋活板門 diff --git a/mods/xpanes/textures/xpanes_bar_top.png b/mods/xpanes/textures/xpanes_bar_top.png index 7b74508f..2955d72c 100644 Binary files a/mods/xpanes/textures/xpanes_bar_top.png and b/mods/xpanes/textures/xpanes_bar_top.png differ diff --git a/mods/xpanes/textures/xpanes_pane_half.png b/mods/xpanes/textures/xpanes_pane_half.png deleted file mode 100644 index 4e846dfa..00000000 Binary files a/mods/xpanes/textures/xpanes_pane_half.png and /dev/null differ diff --git a/mods/xpanes/textures/xpanes_space.png b/mods/xpanes/textures/xpanes_space.png deleted file mode 100644 index 331e3658..00000000 Binary files a/mods/xpanes/textures/xpanes_space.png and /dev/null differ diff --git a/schematic_tables.txt b/schematic_tables.txt index a33300f7..eff2d359 100644 --- a/schematic_tables.txt +++ b/schematic_tables.txt @@ -2100,7 +2100,7 @@ mts_save("large_cactus", { -- Papyrus -mts_save("papyrus", { +mts_save("papyrus_on_dirt", { size = {x = 1, y = 7, z = 1}, data = { {name = "default:dirt", prob = 255, force_place = true}, @@ -2117,6 +2117,23 @@ mts_save("papyrus", { }, }) +mts_save("papyrus_on_dry_dirt", { + size = {x = 1, y = 7, z = 1}, + data = { + {name = "default:dry_dirt", prob = 255, force_place = true}, + {name = "default:dry_dirt", prob = 255, force_place = true}, + {name = "default:papyrus", prob = 255}, + {name = "default:papyrus", prob = 255}, + {name = "default:papyrus", prob = 255}, + {name = "default:papyrus", prob = 255}, + {name = "default:papyrus", prob = 255}, + }, + yslice_prob = { + {ypos = 2, prob = 127}, + {ypos = 3, prob = 127}, + }, +}) + -- Bush