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

View File

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

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
Fancy Bed=
Simple Bed=
Leave Bed=
Good morning.=
@1 of @2 players are in bed=
Force night skip=
You can only sleep at night.=
Fancy Bed=
Simple Bed=

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)
if child and child:get_player_name() == self.driver then
self.driver = nil
carts:manage_attachment(child, nil)
end
end
@ -327,11 +328,10 @@ local function rail_on_step(self, dtime)
if self.punched then
-- Collect dropped items
for _, obj_ in pairs(minetest.get_objects_inside_radius(pos, 1)) do
if not obj_:is_player() and
obj_:get_luaentity() and
not obj_:get_luaentity().physical_state and
obj_:get_luaentity().name == "__builtin:item" then
local ent = obj_:get_luaentity()
-- Careful here: physical_state and disable_physics are item-internal APIs
if ent and ent.name == "__builtin:item" and ent.physical_state then
ent:disable_physics()
obj_:set_attach(self.object, "", {x=0, y=0, z=0}, {x=0, y=0, z=0})
self.attached_items[#self.attached_items + 1] = obj_
end
@ -389,7 +389,7 @@ minetest.register_entity("carts:cart", cart_entity)
minetest.register_craftitem("carts:cart", {
description = S("Cart") .. "\n" .. S("(Sneak+Click to pick up)"),
inventory_image = minetest.inventorycube("carts_cart_top.png", "carts_cart_side.png", "carts_cart_side.png"),
inventory_image = minetest.inventorycube("carts_cart_top.png", "carts_cart_front.png", "carts_cart_side.png"),
wield_image = "carts_cart_side.png",
on_place = function(itemstack, placer, pointed_thing)
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
Cart=
(Sneak+Click to pick up)=
Rail=
Powered 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,
})
local creative_mode_cache = minetest.settings:get_bool("creative_mode")
-- Override the engine's creative mode function
local old_is_creative_enabled = minetest.is_creative_enabled
function minetest.is_creative_enabled(name)
if name == "" then
return old_is_creative_enabled(name)
end
return minetest.check_player_privs(name, {creative = true}) or
old_is_creative_enabled(name)
end
-- For backwards compatibility:
function creative.is_enabled_for(name)
return creative_mode_cache or
minetest.check_player_privs(name, {creative = true})
return minetest.is_creative_enabled(name)
end
dofile(minetest.get_modpath("creative") .. "/inventory.lua")
if creative_mode_cache then
if minetest.is_creative_enabled("") then
-- Dig time is modified according to difference (leveldiff) between tool
-- 'maxlevel' and node 'level'. Digtime is divided by the larger of
-- leveldiff and 1.

View File

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

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
Allow player to use creative inventory=
Search=
Reset=
Previous page=
@ -8,3 +7,4 @@ All=
Nodes=
Tools=
Items=
Allow player to use creative inventory=

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

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

View File

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

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
return false
end
local name_under = node_under.name
local is_soil = minetest.get_item_group(name_under, "soil")
if is_soil == 0 then
if minetest.get_item_group(node_under.name, "soil") == 0 then
return false
end
local light_level = minetest.get_node_light(pos)

View File

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

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.
a locked door=una porta chiusa a chiave
Wooden Door=Porta di legno
Steel Door=Porta d'acciacio
Steel Door=Porta d'acciaio
Glass Door=Porta di vetro
Obsidian Glass Door=Porta di vetro d'ossidiana
Owned by @1=Di proprietà di @1
@ -16,4 +16,4 @@ Apple Wood Fence Gate=Cancello della recinzione di legno di melo
Acacia Wood Fence Gate=Cancello della recinzione di legno d'acacia
Jungle Wood Fence Gate=Cancello della recinzione di legno della giungla
Pine Wood Fence Gate=Cancello della recinzione di legno di pino
Aspen Wood Fence Gate=Cancello della recinzione di legno di pioppo
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'
# www.blender.org
mtllib door_a.mtl
o Cube_Cube.001
o door_a
v 0.499000 -0.499000 -0.499000
v 0.499000 1.499000 -0.499000
v 0.499000 -0.499000 -0.375000

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
mtllib door_b.mtl
o Cube_Cube.001
v -0.499000 -0.499000 -0.499000
v -0.499000 1.499000 -0.499000
v -0.499000 -0.499000 -0.375000
v -0.499000 1.499000 -0.375000
v 0.499000 -0.499000 -0.499000
o door_b
v 0.499000 1.499000 -0.499000
v 0.499000 -0.499000 -0.375000
v 0.499000 1.499000 -0.375000
v 0.499000 -0.499000 -0.375000
v 0.499000 -0.499000 -0.499000
v -0.499000 1.499000 -0.375000
v -0.499000 -0.499000 -0.375000
v -0.499000 1.499000 -0.499000
v -0.499000 -0.499000 -0.499000
vt 0.894736 1.000000
vt 0.947368 1.000000
vt 0.947368 0.000000
vt 0.894736 0.000000
vt 0.842105 1.000000
vt 0.842105 0.000000
vt 0.894737 0.000000
vt 0.894737 1.000000
vt 0.421053 1.000000
vt 0.421053 0.000000
vt 0.947368 0.000000
vt 0.947368 1.000000
vt 0.842105 0.000000
vt 0.842105 1.000000
vt 0.894736 1.000000
vt 0.894736 0.000000
vt 0.842105 0.000000
vt 0.421053 1.000000
vt 0.000000 1.000000
vt 0.000000 0.000000
vt 1.000000 0.000000
vt 0.421053 0.000000
vt 1.000000 0.500000
vt 0.947368 0.500000
vt 0.947368 1.000000
vt 1.000000 1.000000
vn -1.000000 0.000000 0.000000
vn 0.000000 0.000000 1.000000
vn 1.000000 0.000000 0.000000
vn 0.000000 0.000000 -1.000000
vn 0.000000 -1.000000 0.000000
vn 0.000000 1.000000 0.000000
usemtl None
s off
f 2/1/1 1/2/1 3/3/1 4/4/1
f 4/5/2 3/6/2 7/2/2 8/1/2
f 8/4/3 7/3/3 5/7/3 6/8/3
f 6/9/4 5/10/4 1/6/4 2/5/4
f 1/11/5 5/12/5 7/13/5 3/7/5
f 6/8/6 2/13/6 4/12/6 8/14/6
vt 1.000000 0.000000
vt 0.947368 0.000000
vt 0.947368 0.500000
vt 1.000000 0.500000
vn 1.0000 0.0000 0.0000
vn 0.0000 -0.0000 1.0000
vn -1.0000 0.0000 0.0000
vn 0.0000 0.0000 -1.0000
vn 0.0000 -1.0000 0.0000
vn 0.0000 1.0000 0.0000
usemtl None.007
s 1
f 1/1/1 2/2/1 3/3/1 4/4/1
f 2/5/2 5/6/2 6/7/2 3/8/2
f 5/9/3 7/10/3 8/11/3 6/12/3
f 7/13/4 1/14/4 4/15/4 8/16/4
f 4/17/5 3/18/5 6/19/5 8/20/5
f 7/21/6 5/22/6 2/23/6 1/24/6

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

View File

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

View File

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

View File

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

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
Wooden Hoe=
Stone Hoe=
Steel Hoe=
Bronze Hoe=
Mese Hoe=
Diamond Hoe=
Wheat Seed=
Flour=
Bread=
Cotton Seed=
String=
Soil=
Wet Soil=
Dry Soil=
Wet Dry Soil=
Savanna Soil=
Wet Savanna Soil=
Desert Sand Soil=
Wet Desert Sand Soil=
Straw=
@ -21,5 +10,19 @@ Straw Stair=
Inner Straw Stair=
Outer Straw Stair=
Straw Slab=
Wild Cotton=
Wheat Seed=
Wheat=
Flour=
Bread=
Cotton Seed=
Cotton=
String=
Wooden Hoe=
Stone Hoe=
Steel Hoe=
Bronze Hoe=
Mese Hoe=
Diamond Hoe=
Hoe=
Seed=

View File

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 228 B

View File

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

View File

@ -1,3 +1,4 @@
# textdomain: fire
Permanent Flame=Permanente Flamme
Fire=Feuer
Permanent Fire=Permanentes Feuer
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
Permanent Flame=永久火焰
Permanent Fire=永久火焰
Flint and Steel=火石和钢
Fire=火焰

View File

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

View File

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

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))
-- remove `name` from the old storage file
if not homepos[name] then
return true
end
local data = {}
local output = io.open(homes_file, "w")
if output then

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=

View File

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

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
local cid_data = {}
minetest.after(0, function()
minetest.register_on_mods_loaded(function()
for name, def in pairs(minetest.registered_nodes) do
cid_data[minetest.get_content_id(name)] = {
name = name,
@ -163,13 +163,9 @@ local function entity_physics(pos, radius, drops)
local damage = (4 / dist) * radius
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 moveoff = vector.multiply(dir, dist + 1.0)
local newpos = vector.add(pos, moveoff)
newpos = vector.add(newpos, {x = 0, y = 0.2, z = 0})
obj:set_pos(newpos)
local moveoff = vector.multiply(dir, 2 / dist * radius)
obj:add_player_velocity(moveoff)
obj:set_hp(obj:get_hp() - damage)
else
@ -238,12 +234,16 @@ local function add_effects(pos, radius, drops)
-- we just dropped some items. Look at the items entities and pick
-- one of them to use as texture
local texture = "tnt_blast.png" --fallback texture
local node
local most = 0
for name, stack in pairs(drops) do
local count = stack:get_count()
if count > most then
most = count
local def = minetest.registered_nodes[name]
if def then
node = { name = name }
end
if def and def.tiles and def.tiles[1] then
texture = def.tiles[1]
end
@ -261,9 +261,11 @@ local function add_effects(pos, radius, drops)
maxacc = {x = 0, y = -10, z = 0},
minexptime = 0.8,
maxexptime = 2.0,
minsize = radius * 0.66,
maxsize = radius * 2,
minsize = radius * 0.33,
maxsize = radius,
texture = texture,
-- ^ only as fallback for clients without support for `node` parameter
node = node,
collisiondetection = true,
})
end
@ -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 data = vm1:get_data()
local count = 0
local c_tnt = minetest.get_content_id("tnt:tnt")
local c_tnt
local c_tnt_burning = minetest.get_content_id("tnt:tnt_burning")
local c_tnt_boom = minetest.get_content_id("tnt:boom")
local c_air = minetest.get_content_id("air")
if enable_tnt then
c_tnt = minetest.get_content_id("tnt:tnt")
else
c_tnt = c_tnt_burning -- tnt is not registered if disabled
end
-- make sure we still have explosion even when centre node isnt tnt related
if explode_center then
count = 1
@ -401,7 +408,7 @@ function tnt.boom(pos, def)
def.damage_radius = def.damage_radius or def.radius * 2
local meta = minetest.get_meta(pos)
local owner = meta:get_string("owner")
if not def.explode_center then
if not def.explode_center and def.ignore_protection ~= true then
minetest.set_node(pos, {name = "tnt:boom"})
end
local sound = def.sound or "tnt_explode"

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
Empty Vessels Shelf=
Vessels Shelf (@1 items)=
Vessels Shelf=
Empty Glass Bottle=
Empty Drinking Glass=
Empty Heavy Steel Bottle=
Glass Fragments=
Empty Vessels Shelf=
Vessels Shelf (@1 items)=

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_speedz = nobj_speedz or minetest.get_perlin(np_speedz)
local n_density = nobj_density:get_2d({x = time, y = 0})
local n_thickness = nobj_thickness:get_2d({x = time, y = 0})
local n_speedx = nobj_speedx:get_2d({x = time, y = 0})
local n_speedz = nobj_speedz:get_2d({x = time, y = 0})
local n_density = nobj_density:get_2d({x = time, y = 0}) -- 0 to 1
local n_thickness = nobj_thickness:get_2d({x = time, y = 0}) -- 0 to 1
local n_speedx = nobj_speedx:get_2d({x = time, y = 0}) -- -1 to 1
local n_speedz = nobj_speedz:get_2d({x = time, y = 0}) -- -1 to 1
for _, player in ipairs(minetest.get_connected_players()) do
local humid = minetest.get_humidity(player:get_pos())
-- Default and classic density value is 0.4, make this happen
-- at humidity midvalue 50 when n_density is at midvalue 0.5.
-- density_max = 0.25 at humid = 0.
-- density_max = 0.8 at humid = 50.
-- density_max = 1.35 at humid = 100.
local density_max = 0.8 + ((humid - 50) / 50) * 0.55
player:set_clouds({
density = rangelim(humid / 100, 0.25, 1.0) * n_density,
-- Range limit density_max to always have occasional
-- small scattered clouds at extreme low humidity.
density = rangelim(density_max, 0.2, 1.0) * n_density,
thickness = math.max(math.floor(
rangelim(32 * humid / 100, 8, 32) * n_thickness
), 1),
), 2),
speed = {x = n_speedx * 4, z = n_speedz * 4},
})
end

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"),
inventory_image = "xpanes_item_steel_bar.png",
protected = true,
groups = {cracky = 1, level = 2},
groups = {node = 1, cracky = 1, level = 2},
sounds = default.node_sound_metal_defaults(),
sound_open = "xpanes_steel_bar_door_open",
sound_close = "xpanes_steel_bar_door_close",
@ -241,7 +241,7 @@ if minetest.get_modpath("doors") then
tile_front = "xpanes_trapdoor_steel_bar.png",
tile_side = "xpanes_trapdoor_steel_bar_side.png",
protected = true,
groups = {cracky = 1, level = 2, door = 1},
groups = {node = 1, cracky = 1, level = 2, door = 1},
sounds = default.node_sound_metal_defaults(),
sound_open = "xpanes_steel_bar_door_open",
sound_close = "xpanes_steel_bar_door_close",

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