Merge tag '5.3.0' into nalc-dev

5.3.0
This commit is contained in:
Sys Quatre 2020-07-12 13:11:07 +02:00
commit b3e660e897
81 changed files with 1181 additions and 366 deletions

View File

@ -93,16 +93,21 @@ For example,
is used to show all tools. Name is used in the sfinv page name, title is the is used to show all tools. Name is used in the sfinv page name, title is the
human readable title. human readable title.
`is_enabled_for` is used to check whether a player is in creative mode: Creative provides `creative.is_enabled_for(name)`, which is identical in
functionality to the engine's `minetest.creative_is_enabled(name)`.
creative.is_enabled_for(name) Its use is deprecated and it should also not be overriden.
Override this to allow per-player game modes.
The contents of `creative.formspec_add` is appended to every creative inventory The contents of `creative.formspec_add` is appended to every creative inventory
page. Mods can use it to add additional formspec elements onto the default page. Mods can use it to add additional formspec elements onto the default
creative inventory formspec to be drawn after each update. creative inventory formspec to be drawn after each update.
Group overrides can be used for any registered item, node or tool. Use one of
the groups stated below to pick which category it will appear in.
node = 1 -- Appears in the Nodes category
tool = 1 -- Appears in the Tools category
craftitem = 1 -- Appears in the Items category
Chests API Chests API
---------- ----------
@ -129,12 +134,12 @@ The chests API allows the creation of chests, which have their own inventories f
* A table indexed by player name to keep track of who opened what chest. * A table indexed by player name to keep track of who opened what chest.
* Key: The name of the player. * Key: The name of the player.
* Value: A table containing information about the chest the player is looking at. * Value: A table containing information about the chest the player is looking at.
e.g `{ pos = {1, 1, 1}, sound = null, swap = "chest" }` e.g `{ pos = {1, 1, 1}, sound = null, swap = "default:chest" }`
`default.chest.register_chest(name, def)` `default.chest.register_chest(name, def)`
* Registers new chest * Registers new chest
* `name` Name for chest * `name` Name for chest e.g. "default:chest"
* `def` See [#Chest Definition] * `def` See [#Chest Definition]
### Chest Definition ### Chest Definition

View File

@ -74,10 +74,10 @@ local function lay_down(player, pos, bed_pos, state, skip)
-- physics, eye_offset, etc -- physics, eye_offset, etc
player:set_eye_offset({x = 0, y = 0, z = 0}, {x = 0, y = 0, z = 0}) player:set_eye_offset({x = 0, y = 0, z = 0}, {x = 0, y = 0, z = 0})
player:set_look_horizontal(math.random(1, 180) / 100) player:set_look_horizontal(math.random(1, 180) / 100)
default.player_attached[name] = false player_api.player_attached[name] = false
player:set_physics_override(1, 1, 1) player:set_physics_override(1, 1, 1)
hud_flags.wielditem = true hud_flags.wielditem = true
default.player_set_animation(player, "stand" , 30) player_api.set_animation(player, "stand" , 30)
-- lay down -- lay down
else else
@ -99,9 +99,9 @@ local function lay_down(player, pos, bed_pos, state, skip)
} }
player:set_physics_override(0, 0, 0) player:set_physics_override(0, 0, 0)
player:set_pos(p) player:set_pos(p)
default.player_attached[name] = true player_api.player_attached[name] = true
hud_flags.wielditem = false hud_flags.wielditem = false
default.player_set_animation(player, "lay" , 0) player_api.set_animation(player, "lay" , 0)
end end
player:hud_set_flags(hud_flags) player:hud_set_flags(hud_flags)

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

Binary file not shown.

Before

Width:  |  Height:  |  Size: 684 B

After

Width:  |  Height:  |  Size: 456 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 618 B

After

Width:  |  Height:  |  Size: 436 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 660 B

After

Width:  |  Height:  |  Size: 494 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 698 B

After

Width:  |  Height:  |  Size: 434 B

View File

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

View File

@ -61,6 +61,7 @@ function creative.init_creative_inventory(player)
return player_inventory[player_name] return player_inventory[player_name]
end end
local NO_MATCH = 999
local function match(s, filter) local function match(s, filter)
if filter == "" then if filter == "" then
return 0 return 0
@ -68,7 +69,15 @@ local function match(s, filter)
if s:lower():find(filter, 1, true) then if s:lower():find(filter, 1, true) then
return #s - #filter return #s - #filter
end end
return nil return NO_MATCH
end
local function description(def, lang_code)
local s = def.description
if lang_code then
s = minetest.get_translated_string(lang_code, s)
end
return s:gsub("\n.*", "") -- First line only
end end
function creative.update_creative_inventory(player_name, tab_content) function creative.update_creative_inventory(player_name, tab_content)
@ -84,13 +93,26 @@ function creative.update_creative_inventory(player_name, tab_content)
local items = inventory_cache[tab_content] or init_creative_cache(tab_content) local items = inventory_cache[tab_content] or init_creative_cache(tab_content)
local lang
local player_info = minetest.get_player_information(player_name)
if player_info and player_info.lang_code ~= "" then
lang = player_info.lang_code
end
local creative_list = {} local creative_list = {}
local order = {} local order = {}
for name, def in pairs(items) do for name, def in pairs(items) do
local m = match(def.description, inv.filter) or match(def.name, inv.filter) local m = match(description(def), inv.filter)
if m then if m > 0 then
m = math.min(m, match(description(def, lang), inv.filter))
end
if m > 0 then
m = math.min(m, match(name, inv.filter))
end
if m < NO_MATCH then
creative_list[#creative_list+1] = name creative_list[#creative_list+1] = name
-- Sort by description length first so closer matches appear earlier -- Sort by match value first so closer matches appear earlier
order[name] = string.format("%02d", m) .. name order[name] = string.format("%02d", m) .. name
end end
end end
@ -199,10 +221,30 @@ function creative.register_tab(name, title, items)
}) })
end end
-- Sort registered items
local registered_nodes = {}
local registered_tools = {}
local registered_craftitems = {}
minetest.register_on_mods_loaded(function()
for name, def in pairs(minetest.registered_items) do
local group = def.groups or {}
local nogroup = not (group.node or group.tool or group.craftitem)
if group.node or (nogroup and minetest.registered_nodes[name]) then
registered_nodes[name] = def
elseif group.tool or (nogroup and minetest.registered_tools[name]) then
registered_tools[name] = def
elseif group.craftitem or (nogroup and minetest.registered_craftitems[name]) then
registered_craftitems[name] = def
end
end
end)
creative.register_tab("all", S("All"), minetest.registered_items) creative.register_tab("all", S("All"), minetest.registered_items)
creative.register_tab("nodes", S("Nodes"), minetest.registered_nodes) creative.register_tab("nodes", S("Nodes"), registered_nodes)
creative.register_tab("tools", S("Tools"), minetest.registered_tools) creative.register_tab("tools", S("Tools"), registered_tools)
creative.register_tab("craftitems", S("Items"), minetest.registered_craftitems) creative.register_tab("craftitems", S("Items"), registered_craftitems)
local old_homepage_name = sfinv.get_homepage_name local old_homepage_name = sfinv.get_homepage_name
function sfinv.get_homepage_name(player) function sfinv.get_homepage_name(player)

View File

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

View File

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

View File

@ -151,7 +151,6 @@ BlockMen (CC BY-SA 3.0):
default_chest_top.png default_chest_top.png
default_mineral_mese.png default_mineral_mese.png
default_meselamp.png default_meselamp.png
bubble.png
gui_formbg.png gui_formbg.png
gui_furnace_arrow_bg.png gui_furnace_arrow_bg.png
gui_furnace_arrow_fg.png gui_furnace_arrow_fg.png
@ -196,9 +195,6 @@ Gambit (CC BY-SA 3.0):
asl97 (CC BY-SA 3.0): asl97 (CC BY-SA 3.0):
default_ice.png default_ice.png
KevDoy (CC BY-SA 3.0):
heart.png
Pithydon (CC BY-SA 3.0) Pithydon (CC BY-SA 3.0)
default_coral_brown.png default_coral_brown.png
default_coral_orange.png default_coral_orange.png
@ -253,6 +249,11 @@ Topywo (CC BY-SA 3.0)
Extex101 (CC BY-SA 3.0) Extex101 (CC BY-SA 3.0)
default_large_cactus_seedling.png default_large_cactus_seedling.png
default_dry_shrub.png -- Derived from the original texture by celeron55
An0n3m0us (CC BY-SA 3.0):
heart.png -- Derived from a texture by KevDoy (CC BY-SA 3.0)
bubble.png -- Derived from a texture by BlockMen (CC BY-SA 3.0)
Sounds Sounds

View File

@ -44,7 +44,7 @@ function default.chest.chest_lid_close(pn)
end end
local node = minetest.get_node(pos) local node = minetest.get_node(pos)
minetest.after(0.2, minetest.swap_node, pos, { name = "default:" .. swap, minetest.after(0.2, minetest.swap_node, pos, { name = swap,
param2 = node.param2 }) param2 = node.param2 })
minetest.sound_play(sound, {gain = 0.3, pos = pos, minetest.sound_play(sound, {gain = 0.3, pos = pos,
max_hear_distance = 10}, true) max_hear_distance = 10}, true)
@ -76,7 +76,8 @@ minetest.register_on_leaveplayer(function(player)
end end
end) end)
function default.chest.register_chest(name, d) function default.chest.register_chest(prefixed_name, d)
local name = prefixed_name:sub(1,1) == ':' and prefixed_name:sub(2,-1) or prefixed_name
local def = table.copy(d) local def = table.copy(d)
def.drawtype = "mesh" def.drawtype = "mesh"
def.visual = "mesh" def.visual = "mesh"
@ -132,7 +133,7 @@ function default.chest.register_chest(name, d)
pos = pos, max_hear_distance = 10}, true) pos = pos, max_hear_distance = 10}, true)
if not default.chest.chest_lid_obstructed(pos) then if not default.chest.chest_lid_obstructed(pos) then
minetest.swap_node(pos, minetest.swap_node(pos,
{ name = "default:" .. name .. "_open", { name = name .. "_open",
param2 = node.param2 }) param2 = node.param2 })
end end
minetest.after(0.2, minetest.show_formspec, minetest.after(0.2, minetest.show_formspec,
@ -203,7 +204,7 @@ function default.chest.register_chest(name, d)
max_hear_distance = 10}, true) max_hear_distance = 10}, true)
if not default.chest.chest_lid_obstructed(pos) then if not default.chest.chest_lid_obstructed(pos) then
minetest.swap_node(pos, { minetest.swap_node(pos, {
name = "default:" .. name .. "_open", name = name .. "_open",
param2 = node.param2 }) param2 = node.param2 })
end end
minetest.after(0.2, minetest.show_formspec, minetest.after(0.2, minetest.show_formspec,
@ -215,7 +216,7 @@ function default.chest.register_chest(name, d)
def.on_blast = function(pos) def.on_blast = function(pos)
local drops = {} local drops = {}
default.get_inventory_drops(pos, "main", drops) default.get_inventory_drops(pos, "main", drops)
drops[#drops+1] = "default:" .. name drops[#drops+1] = name
minetest.remove_node(pos) minetest.remove_node(pos)
return drops return drops
end end
@ -248,7 +249,7 @@ function default.chest.register_chest(name, d)
def_opened.tiles[i].backface_culling = true def_opened.tiles[i].backface_culling = true
end end
end end
def_opened.drop = "default:" .. name def_opened.drop = name
def_opened.groups.not_in_creative_inventory = 1 def_opened.groups.not_in_creative_inventory = 1
def_opened.selection_box = { def_opened.selection_box = {
type = "fixed", type = "fixed",
@ -265,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[5] = def.tiles[3] -- drawtype to make them match the mesh
def_closed.tiles[3] = def.tiles[3].."^[transformFX" def_closed.tiles[3] = def.tiles[3].."^[transformFX"
minetest.register_node("default:" .. name, def_closed) minetest.register_node(prefixed_name, def_closed)
minetest.register_node("default:" .. name .. "_open", def_opened) minetest.register_node(prefixed_name .. "_open", def_opened)
-- convert old chests to this new variant -- convert old chests to this new variant
minetest.register_lbm({ if name == "default:chest" or name == "default:chest_locked" then
label = "update chests to opening chests", minetest.register_lbm({
name = "default:upgrade_" .. name .. "_v2", label = "update chests to opening chests",
nodenames = {"default:" .. name}, name = "default:upgrade_" .. name:sub(9,-1) .. "_v2",
action = function(pos, node) nodenames = {name},
local meta = minetest.get_meta(pos) action = function(pos, node)
meta:set_string("formspec", nil) local meta = minetest.get_meta(pos)
local inv = meta:get_inventory() meta:set_string("formspec", nil)
local list = inv:get_list("default:chest") local inv = meta:get_inventory()
if list then local list = inv:get_list("default:chest")
inv:set_size("main", 8*4) if list then
inv:set_list("main", list) inv:set_size("main", 8*4)
inv:set_list("default:chest", nil) inv:set_list("main", list)
inv:set_list("default:chest", nil)
end
end end
end })
}) end
end end
default.chest.register_chest("chest", { default.chest.register_chest("default:chest", {
description = S("Chest"), description = S("Chest"),
tiles = { tiles = {
"default_chest_top.png", "default_chest_top.png",
@ -303,7 +306,7 @@ default.chest.register_chest("chest", {
groups = {choppy = 2, oddly_breakable_by_hand = 2}, groups = {choppy = 2, oddly_breakable_by_hand = 2},
}) })
default.chest.register_chest("chest_locked", { default.chest.register_chest("default:chest_locked", {
description = S("Locked Chest"), description = S("Locked Chest"),
tiles = { tiles = {
"default_chest_top.png", "default_chest_top.png",

View File

@ -210,7 +210,12 @@ end
function default.grow_papyrus(pos, node) function default.grow_papyrus(pos, node)
pos.y = pos.y - 1 pos.y = pos.y - 1
local name = minetest.get_node(pos).name local name = minetest.get_node(pos).name
if name ~= "default:dirt_with_grass" and name ~= "default:dirt" then if name ~= "default:dirt" and
name ~= "default:dirt_with_grass" and
name ~= "default:dirt_with_dry_grass" and
name ~= "default:dirt_with_rainforest_litter" and
name ~= "default:dry_dirt" and
name ~= "default:dry_dirt_with_dry_grass" then
return return
end end
if not minetest.find_node_near(pos, 3, {"group:water"}) then if not minetest.find_node_near(pos, 3, {"group:water"}) then
@ -247,7 +252,17 @@ minetest.register_abm({
minetest.register_abm({ minetest.register_abm({
label = "Grow papyrus", label = "Grow papyrus",
nodenames = {"default:papyrus"}, nodenames = {"default:papyrus"},
neighbors = {"default:dirt", "default:dirt_with_grass"}, -- Grows on the dirt and surface dirt nodes of the biomes papyrus appears in,
-- including the old savanna nodes.
-- 'default:dirt_with_grass' is here only because it was allowed before.
neighbors = {
"default:dirt",
"default:dirt_with_grass",
"default:dirt_with_dry_grass",
"default:dirt_with_rainforest_litter",
"default:dry_dirt",
"default:dry_dirt_with_dry_grass",
},
interval = 14, interval = 14,
chance = 71, chance = 71,
action = function(...) action = function(...)
@ -433,6 +448,9 @@ local function leafdecay_after_destruct(pos, oldnode, def)
end end
end end
local movement_gravity = tonumber(
minetest.settings:get("movement_gravity")) or 9.81
local function leafdecay_on_timer(pos, def) local function leafdecay_on_timer(pos, def)
if minetest.find_node_near(pos, def.radius, def.trunks) then if minetest.find_node_near(pos, def.radius, def.trunks) then
return false return false
@ -459,6 +477,21 @@ local function leafdecay_on_timer(pos, def)
minetest.remove_node(pos) minetest.remove_node(pos)
minetest.check_for_falling(pos) minetest.check_for_falling(pos)
-- spawn a few particles for the removed node
minetest.add_particlespawner({
amount = 8,
time = 0.001,
minpos = vector.subtract(pos, {x=0.5, y=0.5, z=0.5}),
maxpos = vector.add(pos, {x=0.5, y=0.5, z=0.5}),
minvel = vector.new(-0.5, -1, -0.5),
maxvel = vector.new(0.5, 0, 0.5),
minacc = vector.new(0, -movement_gravity, 0),
maxacc = vector.new(0, -movement_gravity, 0),
minsize = 0,
maxsize = 0,
node = node,
})
end end
function default.register_leafdecay(def) function default.register_leafdecay(def)
@ -483,7 +516,7 @@ end
-- --
-- Convert dirt to something that fits the environment -- Convert default:dirt to something that fits the environment
-- --
minetest.register_abm({ minetest.register_abm({
@ -492,6 +525,7 @@ minetest.register_abm({
neighbors = { neighbors = {
"air", "air",
"group:grass", "group:grass",
"group:dry_grass",
"default:snow", "default:snow",
}, },
interval = 6, interval = 6,
@ -520,6 +554,8 @@ minetest.register_abm({
minetest.set_node(pos, {name = "default:dirt_with_snow"}) minetest.set_node(pos, {name = "default:dirt_with_snow"})
elseif minetest.get_item_group(name, "grass") ~= 0 then elseif minetest.get_item_group(name, "grass") ~= 0 then
minetest.set_node(pos, {name = "default:dirt_with_grass"}) minetest.set_node(pos, {name = "default:dirt_with_grass"})
elseif minetest.get_item_group(name, "dry_grass") ~= 0 then
minetest.set_node(pos, {name = "default:dirt_with_dry_grass"})
end end
end end
}) })

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -458,12 +458,12 @@ minetest.register_node("default:dirt_with_grass_footsteps", {
}) })
minetest.register_node("default:dirt_with_dry_grass", { minetest.register_node("default:dirt_with_dry_grass", {
description = S("Dirt with Dry Grass"), description = S("Dirt with Savanna Grass"),
tiles = {"default_dry_grass.png", tiles = {"default_dry_grass.png",
"default_dirt.png", "default_dirt.png",
{name = "default_dirt.png^default_dry_grass_side.png", {name = "default_dirt.png^default_dry_grass_side.png",
tileable_vertical = false}}, tileable_vertical = false}},
groups = {crumbly = 3, soil = 1}, groups = {crumbly = 3, soil = 1, spreading_dirt_type = 1},
drop = "default:dirt", drop = "default:dirt",
sounds = default.node_sound_dirt_defaults({ sounds = default.node_sound_dirt_defaults({
footstep = {name = "default_grass_footstep", gain = 0.4}, footstep = {name = "default_grass_footstep", gain = 0.4},
@ -513,14 +513,14 @@ minetest.register_node("default:dirt_with_coniferous_litter", {
}) })
minetest.register_node("default:dry_dirt", { minetest.register_node("default:dry_dirt", {
description = S("Dry Dirt"), description = S("Savanna Dirt"),
tiles = {"default_dry_dirt.png"}, tiles = {"default_dry_dirt.png"},
groups = {crumbly = 3, soil = 1}, groups = {crumbly = 3, soil = 1},
sounds = default.node_sound_dirt_defaults(), sounds = default.node_sound_dirt_defaults(),
}) })
minetest.register_node("default:dry_dirt_with_dry_grass", { minetest.register_node("default:dry_dirt_with_dry_grass", {
description = S("Dry Dirt with Dry Grass"), description = S("Savanna Dirt with Savanna Grass"),
tiles = {"default_dry_grass.png", "default_dry_dirt.png", tiles = {"default_dry_grass.png", "default_dry_dirt.png",
{name = "default_dry_dirt.png^default_dry_grass_side.png", {name = "default_dry_dirt.png^default_dry_grass_side.png",
tileable_vertical = false}}, tileable_vertical = false}},
@ -621,7 +621,7 @@ minetest.register_node("default:snow", {
collision_box = { collision_box = {
type = "fixed", type = "fixed",
fixed = { fixed = {
{-0.5, -0.5, -0.5, 0.5, -7 / 16, 0.5}, {-0.5, -0.5, -0.5, 0.5, -6 / 16, 0.5},
}, },
}, },
groups = {crumbly = 3, falling_node = 1, snowy = 1}, groups = {crumbly = 3, falling_node = 1, snowy = 1},
@ -1497,7 +1497,7 @@ end
minetest.register_node("default:dry_grass_1", { minetest.register_node("default:dry_grass_1", {
description = S("Dry Grass"), description = S("Savanna Grass"),
drawtype = "plantlike", drawtype = "plantlike",
waving = 1, waving = 1,
tiles = {"default_dry_grass_1.png"}, tiles = {"default_dry_grass_1.png"},
@ -1526,7 +1526,7 @@ minetest.register_node("default:dry_grass_1", {
for i = 2, 5 do for i = 2, 5 do
minetest.register_node("default:dry_grass_" .. i, { minetest.register_node("default:dry_grass_" .. i, {
description = S("Dry Grass"), description = S("Savanna Grass"),
drawtype = "plantlike", drawtype = "plantlike",
waving = 1, waving = 1,
tiles = {"default_dry_grass_" .. i .. ".png"}, tiles = {"default_dry_grass_" .. i .. ".png"},
@ -2579,12 +2579,10 @@ local function register_sign(material, desc, def)
sounds = def.sounds, sounds = def.sounds,
on_construct = function(pos) on_construct = function(pos)
--local n = minetest.get_node(pos)
local meta = minetest.get_meta(pos) local meta = minetest.get_meta(pos)
meta:set_string("formspec", "field[text;;${text}]") meta:set_string("formspec", "field[text;;${text}]")
end, end,
on_receive_fields = function(pos, formname, fields, sender) on_receive_fields = function(pos, formname, fields, sender)
--print("Sign at "..minetest.pos_to_string(pos).." got "..dump(fields))
local player_name = sender:get_player_name() local player_name = sender:get_player_name()
if minetest.is_protected(pos, player_name) then if minetest.is_protected(pos, player_name) then
minetest.record_protection_violation(pos, player_name) minetest.record_protection_violation(pos, player_name)
@ -2598,8 +2596,8 @@ local function register_sign(material, desc, def)
minetest.chat_send_player(player_name, S("Text too long")) minetest.chat_send_player(player_name, S("Text too long"))
return return
end end
minetest.log("action", (player_name or "") .. " wrote \"" .. minetest.log("action", player_name .. " wrote \"" .. text ..
text .. "\" to sign at " .. minetest.pos_to_string(pos)) "\" to the sign at " .. minetest.pos_to_string(pos))
local meta = minetest.get_meta(pos) local meta = minetest.get_meta(pos)
meta:set_string("text", text) meta:set_string("text", text)
@ -2816,7 +2814,10 @@ minetest.register_node("default:brick", {
description = S("Brick Block"), description = S("Brick Block"),
paramtype2 = "facedir", paramtype2 = "facedir",
place_param2 = 0, place_param2 = 0,
tiles = {"default_brick.png"}, tiles = {
"default_brick.png^[transformFX",
"default_brick.png",
},
is_ground_content = false, is_ground_content = false,
groups = {cracky = 3}, groups = {cracky = 3},
sounds = default.node_sound_stone_defaults(), sounds = default.node_sound_stone_defaults(),

Binary file not shown.

Before

Width:  |  Height:  |  Size: 459 B

After

Width:  |  Height:  |  Size: 331 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 148 B

After

Width:  |  Height:  |  Size: 154 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

After

Width:  |  Height:  |  Size: 279 B

View File

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

View File

@ -78,9 +78,7 @@ end
-- nodes from being placed in the top half of the door. -- nodes from being placed in the top half of the door.
minetest.register_node("doors:hidden", { minetest.register_node("doors:hidden", {
description = S("Hidden Door Segment"), description = S("Hidden Door Segment"),
-- can't use airlike otherwise falling nodes will turn to entities drawtype = "airlike",
-- and will be forever stuck until door is removed.
drawtype = "nodebox",
paramtype = "light", paramtype = "light",
paramtype2 = "facedir", paramtype2 = "facedir",
sunlight_propagates = true, sunlight_propagates = true,
@ -93,13 +91,7 @@ minetest.register_node("doors:hidden", {
drop = "", drop = "",
groups = {not_in_creative_inventory = 1}, groups = {not_in_creative_inventory = 1},
on_blast = function() end, on_blast = function() end,
tiles = {"doors_blank.png"}, -- 1px block inside door hinge near node top
-- 1px transparent block inside door hinge near node top.
node_box = {
type = "fixed",
fixed = {-15/32, 13/32, -15/32, -13/32, 1/2, -13/32},
},
-- collision_box needed otherise selection box would be full node size
collision_box = { collision_box = {
type = "fixed", type = "fixed",
fixed = {-15/32, 13/32, -15/32, -13/32, 1/2, -13/32}, fixed = {-15/32, 13/32, -15/32, -13/32, 1/2, -13/32},
@ -115,10 +107,10 @@ local transform = {
{v = "_a", param2 = 2}, {v = "_a", param2 = 2},
}, },
{ {
{v = "_b", param2 = 1}, {v = "_c", param2 = 1},
{v = "_b", param2 = 2}, {v = "_c", param2 = 2},
{v = "_b", param2 = 3}, {v = "_c", param2 = 3},
{v = "_b", param2 = 0}, {v = "_c", param2 = 0},
}, },
{ {
{v = "_b", param2 = 1}, {v = "_b", param2 = 1},
@ -127,10 +119,10 @@ local transform = {
{v = "_b", param2 = 0}, {v = "_b", param2 = 0},
}, },
{ {
{v = "_a", param2 = 3}, {v = "_d", param2 = 3},
{v = "_a", param2 = 0}, {v = "_d", param2 = 0},
{v = "_a", param2 = 1}, {v = "_d", param2 = 1},
{v = "_a", param2 = 2}, {v = "_d", param2 = 2},
}, },
} }
@ -449,15 +441,23 @@ function doors.register(name, def)
def.mesh = "door_b.obj" def.mesh = "door_b.obj"
minetest.register_node(":" .. name .. "_b", def) minetest.register_node(":" .. name .. "_b", def)
def.mesh = "door_a2.obj"
minetest.register_node(":" .. name .. "_c", def)
def.mesh = "door_b2.obj"
minetest.register_node(":" .. name .. "_d", def)
doors.registered_doors[name .. "_a"] = true doors.registered_doors[name .. "_a"] = true
doors.registered_doors[name .. "_b"] = true doors.registered_doors[name .. "_b"] = true
doors.registered_doors[name .. "_c"] = true
doors.registered_doors[name .. "_d"] = true
end end
doors.register("door_wood", { doors.register("door_wood", {
tiles = {{ name = "doors_door_wood.png", backface_culling = true }}, tiles = {{ name = "doors_door_wood.png", backface_culling = true }},
description = S("Wooden Door"), description = S("Wooden Door"),
inventory_image = "doors_item_wood.png", inventory_image = "doors_item_wood.png",
groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, groups = {node = 1, choppy = 2, oddly_breakable_by_hand = 2, flammable = 2},
recipe = { recipe = {
{"group:wood", "group:wood"}, {"group:wood", "group:wood"},
{"group:wood", "group:wood"}, {"group:wood", "group:wood"},
@ -470,7 +470,7 @@ doors.register("door_steel", {
description = S("Steel Door"), description = S("Steel Door"),
inventory_image = "doors_item_steel.png", inventory_image = "doors_item_steel.png",
protected = true, protected = true,
groups = {cracky = 1, level = 2}, groups = {node = 1, cracky = 1, level = 2},
sounds = default.node_sound_metal_defaults(), sounds = default.node_sound_metal_defaults(),
sound_open = "doors_steel_door_open", sound_open = "doors_steel_door_open",
sound_close = "doors_steel_door_close", sound_close = "doors_steel_door_close",
@ -485,7 +485,7 @@ doors.register("door_glass", {
tiles = {"doors_door_glass.png"}, tiles = {"doors_door_glass.png"},
description = S("Glass Door"), description = S("Glass Door"),
inventory_image = "doors_item_glass.png", inventory_image = "doors_item_glass.png",
groups = {cracky=3, oddly_breakable_by_hand=3}, groups = {node = 1, cracky=3, oddly_breakable_by_hand=3},
sounds = default.node_sound_glass_defaults(), sounds = default.node_sound_glass_defaults(),
sound_open = "doors_glass_door_open", sound_open = "doors_glass_door_open",
sound_close = "doors_glass_door_close", sound_close = "doors_glass_door_close",
@ -500,7 +500,7 @@ doors.register("door_obsidian_glass", {
tiles = {"doors_door_obsidian_glass.png"}, tiles = {"doors_door_obsidian_glass.png"},
description = S("Obsidian Glass Door"), description = S("Obsidian Glass Door"),
inventory_image = "doors_item_obsidian_glass.png", inventory_image = "doors_item_obsidian_glass.png",
groups = {cracky=3}, groups = {node = 1, cracky=3},
sounds = default.node_sound_glass_defaults(), sounds = default.node_sound_glass_defaults(),
sound_open = "doors_glass_door_open", sound_open = "doors_glass_door_open",
sound_close = "doors_glass_door_close", sound_close = "doors_glass_door_close",

View File

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

View File

@ -4,7 +4,7 @@ Owned by @1=Di proprietà di @1
You do not own this locked door.=Non sei il proprietario di questa porta chiusa a chiave. You do not own this locked door.=Non sei il proprietario di questa porta chiusa a chiave.
a locked door=una porta chiusa a chiave a locked door=una porta chiusa a chiave
Wooden Door=Porta di legno Wooden Door=Porta di legno
Steel Door=Porta d'acciacio Steel Door=Porta d'acciaio
Glass Door=Porta di vetro Glass Door=Porta di vetro
Obsidian Glass Door=Porta di vetro d'ossidiana Obsidian Glass Door=Porta di vetro d'ossidiana
Owned by @1=Di proprietà di @1 Owned by @1=Di proprietà di @1
@ -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 Acacia Wood Fence Gate=Cancello della recinzione di legno d'acacia
Jungle Wood Fence Gate=Cancello della recinzione di legno della giungla Jungle Wood Fence Gate=Cancello della recinzione di legno della giungla
Pine Wood Fence Gate=Cancello della recinzione di legno di pino Pine Wood Fence Gate=Cancello della recinzione di legno di pino
Aspen Wood Fence Gate=Cancello della recinzione di legno di pioppo Aspen Wood Fence Gate=Cancello della recinzione di legno di pioppo

View File

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

View File

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

View File

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

View File

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

Binary file not shown.

Before

Width:  |  Height:  |  Size: 95 B

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

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 228 B

View File

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

View File

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

View File

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

View File

@ -1,3 +1,4 @@
# textdomain: fire # textdomain: fire
Permanent Flame=永久火焰 Permanent Fire=永久火焰
Flint and Steel=火石和钢 Flint and Steel=火石和钢
Fire=火焰

View File

@ -1,3 +1,4 @@
# textdomain: fire # textdomain: fire
Permanent Flame=永久火焰 Permanent Fire=永久火焰
Flint and Steel=火石和鋼 Flint and Steel=火石和鋼
Fire=火焰

View File

@ -1,3 +1,4 @@
# textdomain: fire # textdomain: fire
Permanent Flame= Fire=
Permanent Fire=
Flint and Steel= Flint and Steel=

Binary file not shown.

Before

Width:  |  Height:  |  Size: 646 B

After

Width:  |  Height:  |  Size: 594 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.0 KiB

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 459 B

After

Width:  |  Height:  |  Size: 205 B

View File

@ -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

View File

@ -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

View File

@ -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!

View File

@ -0,0 +1,3 @@
# textdomain: map
Mapping Kit=Alat Pemetaan
Use with 'Minimap' key=Pakai dengan tombol 'Peta Mini'

View File

@ -106,21 +106,15 @@ function minetest.calculate_knockback(player, ...)
end end
-- Check each player and apply animations -- Check each player and apply animations
minetest.register_globalstep(function(dtime) minetest.register_globalstep(function()
for _, player in pairs(minetest.get_connected_players()) do for _, player in pairs(minetest.get_connected_players()) do
local name = player:get_player_name() local name = player:get_player_name()
local model_name = player_model[name] local model_name = player_model[name]
local model = model_name and models[model_name] local model = model_name and models[model_name]
if model and not player_attached[name] then if model and not player_attached[name] then
local controls = player:get_player_control() local controls = player:get_player_control()
local walking = false
local animation_speed_mod = model.animation_speed or 30 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 -- Determine if the player is sneaking, and reduce animation speed if so
if controls.sneak then if controls.sneak then
animation_speed_mod = animation_speed_mod / 2 animation_speed_mod = animation_speed_mod / 2
@ -129,18 +123,19 @@ minetest.register_globalstep(function(dtime)
-- Apply animations based on what the player is doing -- Apply animations based on what the player is doing
if player:get_hp() == 0 then if player:get_hp() == 0 then
player_set_animation(player, "lay") 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 if player_sneak[name] ~= controls.sneak then
player_anim[name] = nil player_anim[name] = nil
player_sneak[name] = controls.sneak player_sneak[name] = controls.sneak
end end
if controls.LMB then if controls.LMB or controls.RMB then
player_set_animation(player, "walk_mine", animation_speed_mod) player_set_animation(player, "walk_mine", animation_speed_mod)
else else
player_set_animation(player, "walk", animation_speed_mod) player_set_animation(player, "walk", animation_speed_mod)
end end
elseif controls.LMB then elseif controls.LMB or controls.RMB then
player_set_animation(player, "mine") player_set_animation(player, "mine", animation_speed_mod)
else else
player_set_animation(player, "stand", animation_speed_mod) player_set_animation(player, "stand", animation_speed_mod)
end end

View File

@ -0,0 +1,3 @@
# textdomain: screwdriver
Screwdriver=Obeng
(left-click rotates face, right-click rotates axis)=(klik kiri putar sisi, klik kanan putar sumbu)

View File

@ -32,6 +32,9 @@ sethome.set = function(name, pos)
player:set_attribute("sethome:home", minetest.pos_to_string(pos)) player:set_attribute("sethome:home", minetest.pos_to_string(pos))
-- remove `name` from the old storage file -- remove `name` from the old storage file
if not homepos[name] then
return true
end
local data = {} local data = {}
local output = io.open(homes_file, "w") local output = io.open(homes_file, "w")
if output then if output then

View File

@ -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!

View File

@ -0,0 +1,2 @@
# textdomain: sfinv
Crafting=Kerajinan

View File

@ -1,2 +1,2 @@
# textdomain:sfinv # textdomain: sfinv
Crafting= Crafting=

View File

@ -874,7 +874,7 @@ my_register_stair_and_slab(
stairs.register_stair( stairs.register_stair(
"glass", "glass",
"default:glass", "default:glass",
{cracky = 3}, {cracky = 3, oddly_breakable_by_hand = 3},
{"stairs_glass_split.png", "default_glass.png", {"stairs_glass_split.png", "default_glass.png",
"stairs_glass_stairside.png^[transformFX", "stairs_glass_stairside.png", "stairs_glass_stairside.png^[transformFX", "stairs_glass_stairside.png",
"default_glass.png", "stairs_glass_split.png"}, "default_glass.png", "stairs_glass_split.png"},
@ -886,7 +886,7 @@ stairs.register_stair(
stairs.register_slab( stairs.register_slab(
"glass", "glass",
"default:glass", "default:glass",
{cracky = 3}, {cracky = 3, oddly_breakable_by_hand = 3},
{"default_glass.png", "default_glass.png", "stairs_glass_split.png"}, {"default_glass.png", "default_glass.png", "stairs_glass_split.png"},
S("Glass Slab"), S("Glass Slab"),
default.node_sound_glass_defaults(), default.node_sound_glass_defaults(),
@ -896,7 +896,7 @@ stairs.register_slab(
stairs.register_stair_inner( stairs.register_stair_inner(
"glass", "glass",
"default:glass", "default:glass",
{cracky = 3}, {cracky = 3, oddly_breakable_by_hand = 3},
{"stairs_glass_stairside.png^[transformR270", "default_glass.png", {"stairs_glass_stairside.png^[transformR270", "default_glass.png",
"stairs_glass_stairside.png^[transformFX", "default_glass.png", "stairs_glass_stairside.png^[transformFX", "default_glass.png",
"default_glass.png", "stairs_glass_stairside.png"}, "default_glass.png", "stairs_glass_stairside.png"},
@ -909,7 +909,7 @@ stairs.register_stair_inner(
stairs.register_stair_outer( stairs.register_stair_outer(
"glass", "glass",
"default:glass", "default:glass",
{cracky = 3}, {cracky = 3, oddly_breakable_by_hand = 3},
{"stairs_glass_stairside.png^[transformR90", "default_glass.png", {"stairs_glass_stairside.png^[transformR90", "default_glass.png",
"stairs_glass_outer_stairside.png", "stairs_glass_stairside.png", "stairs_glass_outer_stairside.png", "stairs_glass_stairside.png",
"stairs_glass_stairside.png^[transformR90","stairs_glass_outer_stairside.png"}, "stairs_glass_stairside.png^[transformR90","stairs_glass_outer_stairside.png"},

View File

@ -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

View File

@ -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 -- Fill a list with data for content IDs, after all nodes are registered
local cid_data = {} local cid_data = {}
minetest.after(0, function() minetest.register_on_mods_loaded(function()
for name, def in pairs(minetest.registered_nodes) do for name, def in pairs(minetest.registered_nodes) do
cid_data[minetest.get_content_id(name)] = { cid_data[minetest.get_content_id(name)] = {
name = name, name = name,
@ -163,13 +163,9 @@ local function entity_physics(pos, radius, drops)
local damage = (4 / dist) * radius local damage = (4 / dist) * radius
if obj:is_player() then if obj:is_player() then
-- we knock the player back 1.0 node, and slightly upwards
-- TODO: switch to add_player_velocity() introduced in 5.1
local dir = vector.normalize(vector.subtract(obj_pos, pos)) local dir = vector.normalize(vector.subtract(obj_pos, pos))
local moveoff = vector.multiply(dir, dist + 1.0) local moveoff = vector.multiply(dir, 2 / dist * radius)
local newpos = vector.add(pos, moveoff) obj:add_player_velocity(moveoff)
newpos = vector.add(newpos, {x = 0, y = 0.2, z = 0})
obj:set_pos(newpos)
obj:set_hp(obj:get_hp() - damage) obj:set_hp(obj:get_hp() - damage)
else else
@ -238,12 +234,16 @@ local function add_effects(pos, radius, drops)
-- we just dropped some items. Look at the items entities and pick -- we just dropped some items. Look at the items entities and pick
-- one of them to use as texture -- one of them to use as texture
local texture = "tnt_blast.png" --fallback texture local texture = "tnt_blast.png" --fallback texture
local node
local most = 0 local most = 0
for name, stack in pairs(drops) do for name, stack in pairs(drops) do
local count = stack:get_count() local count = stack:get_count()
if count > most then if count > most then
most = count most = count
local def = minetest.registered_nodes[name] local def = minetest.registered_nodes[name]
if def then
node = { name = name }
end
if def and def.tiles and def.tiles[1] then if def and def.tiles and def.tiles[1] then
texture = def.tiles[1] texture = def.tiles[1]
end end
@ -261,9 +261,11 @@ local function add_effects(pos, radius, drops)
maxacc = {x = 0, y = -10, z = 0}, maxacc = {x = 0, y = -10, z = 0},
minexptime = 0.8, minexptime = 0.8,
maxexptime = 2.0, maxexptime = 2.0,
minsize = radius * 0.66, minsize = radius * 0.33,
maxsize = radius * 2, maxsize = radius,
texture = texture, texture = texture,
-- ^ only as fallback for clients without support for `node` parameter
node = node,
collisiondetection = true, collisiondetection = true,
}) })
end end
@ -292,10 +294,15 @@ local function tnt_explode(pos, radius, ignore_protection, ignore_on_blast, owne
local a = VoxelArea:new({MinEdge = minp, MaxEdge = maxp}) local a = VoxelArea:new({MinEdge = minp, MaxEdge = maxp})
local data = vm1:get_data() local data = vm1:get_data()
local count = 0 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_burning = minetest.get_content_id("tnt:tnt_burning")
local c_tnt_boom = minetest.get_content_id("tnt:boom") local c_tnt_boom = minetest.get_content_id("tnt:boom")
local c_air = minetest.get_content_id("air") 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 -- make sure we still have explosion even when centre node isnt tnt related
if explode_center then if explode_center then
count = 1 count = 1
@ -401,7 +408,7 @@ function tnt.boom(pos, def)
def.damage_radius = def.damage_radius or def.radius * 2 def.damage_radius = def.damage_radius or def.radius * 2
local meta = minetest.get_meta(pos) local meta = minetest.get_meta(pos)
local owner = meta:get_string("owner") 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"}) minetest.set_node(pos, {name = "tnt:boom"})
end end
local sound = def.sound or "tnt_explode" local sound = def.sound or "tnt_explode"

View File

@ -0,0 +1,4 @@
# textdomain: tnt
Gun Powder=Bubuk Mesiu
TNT Stick=Tongkat TNT
TNT=TNT

View File

@ -1,8 +1,8 @@
# textdomain: vessels # textdomain: vessels
Empty Vessels Shelf=
Vessels Shelf (@1 items)=
Vessels Shelf= Vessels Shelf=
Empty Glass Bottle= Empty Glass Bottle=
Empty Drinking Glass= Empty Drinking Glass=
Empty Heavy Steel Bottle= Empty Heavy Steel Bottle=
Glass Fragments= Glass Fragments=
Empty Vessels Shelf=
Vessels Shelf (@1 items)=

View File

@ -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

View File

@ -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

View File

@ -82,18 +82,26 @@ local function update_clouds()
nobj_speedx = nobj_speedx or minetest.get_perlin(np_speedx) nobj_speedx = nobj_speedx or minetest.get_perlin(np_speedx)
nobj_speedz = nobj_speedz or minetest.get_perlin(np_speedz) nobj_speedz = nobj_speedz or minetest.get_perlin(np_speedz)
local n_density = nobj_density: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}) 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}) 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}) local n_speedz = nobj_speedz:get_2d({x = time, y = 0}) -- -1 to 1
for _, player in ipairs(minetest.get_connected_players()) do for _, player in ipairs(minetest.get_connected_players()) do
local humid = minetest.get_humidity(player:get_pos()) 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({ 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( thickness = math.max(math.floor(
rangelim(32 * humid / 100, 8, 32) * n_thickness rangelim(32 * humid / 100, 8, 32) * n_thickness
), 1), ), 2),
speed = {x = n_speedx * 4, z = n_speedz * 4}, speed = {x = n_speedx * 4, z = n_speedz * 4},
}) })
end end

View File

@ -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

View File

@ -223,7 +223,7 @@ if minetest.get_modpath("doors") then
description = S("Steel Bar Door"), description = S("Steel Bar Door"),
inventory_image = "xpanes_item_steel_bar.png", inventory_image = "xpanes_item_steel_bar.png",
protected = true, protected = true,
groups = {cracky = 1, level = 2}, groups = {node = 1, cracky = 1, level = 2},
sounds = default.node_sound_metal_defaults(), sounds = default.node_sound_metal_defaults(),
sound_open = "xpanes_steel_bar_door_open", sound_open = "xpanes_steel_bar_door_open",
sound_close = "xpanes_steel_bar_door_close", sound_close = "xpanes_steel_bar_door_close",
@ -241,7 +241,7 @@ if minetest.get_modpath("doors") then
tile_front = "xpanes_trapdoor_steel_bar.png", tile_front = "xpanes_trapdoor_steel_bar.png",
tile_side = "xpanes_trapdoor_steel_bar_side.png", tile_side = "xpanes_trapdoor_steel_bar_side.png",
protected = true, protected = true,
groups = {cracky = 1, level = 2, door = 1}, groups = {node = 1, cracky = 1, level = 2, door = 1},
sounds = default.node_sound_metal_defaults(), sounds = default.node_sound_metal_defaults(),
sound_open = "xpanes_steel_bar_door_open", sound_open = "xpanes_steel_bar_door_open",
sound_close = "xpanes_steel_bar_door_close", sound_close = "xpanes_steel_bar_door_close",

View File

@ -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