forked from minetest/minetest_game
Compare commits
132 Commits
nalc-1.4.0
...
stable-5
Author | SHA1 | Date | |
---|---|---|---|
9875ef6240 | |||
b9c089474c | |||
05367552d1 | |||
33d90c2c45 | |||
4bb4a2a818 | |||
829eb92ccf | |||
bff7596364 | |||
601ec6cd94 | |||
b58991d4f3 | |||
34942339c7 | |||
eba9012d05 | |||
59da46c80b | |||
03177f1584 | |||
a132872ad8 | |||
bbc70c95ef | |||
9e77e00c65 | |||
b26a787eb3 | |||
08e057bf1c | |||
83c10f59e1 | |||
960aff2f63 | |||
110c23560e | |||
d86435d86c | |||
16bf166902 | |||
cd6ea53a52 | |||
16b6bdde0a | |||
996fea7cd0 | |||
9a9df3a42e | |||
1e237b8d18 | |||
9050150464 | |||
833ed77620 | |||
4c6e19968a | |||
446e56a879 | |||
34c1d3242d | |||
f49707c973 | |||
8dee348d97 | |||
aeb27c4db6 | |||
6921c9bbd1 | |||
8d60e85dfc | |||
2c1d9e1330 | |||
ec2f57db0e | |||
fdcf458b56 | |||
97130f4c1c | |||
26b2da2c08 | |||
8eb4437ac8 | |||
792bc6f6e5 | |||
c4cf1a6004 | |||
99a7193095 | |||
2e8ac46120 | |||
508a9070a0 | |||
08057e8e0f | |||
aff9c28eed | |||
e903b1f6d0 | |||
b55329d3e1 | |||
2bdc7c8c7d | |||
c744829ce5 | |||
06daee4c6d | |||
697b028e43 | |||
e229236bc2 | |||
350c52319e | |||
b64868ef92 | |||
79d38078a5 | |||
986b65775f | |||
d7dd15782c | |||
b4392aeb1f | |||
54dc58ef1f | |||
b57700a75b | |||
b0cf061360 | |||
33650c8c2e | |||
e86d0dff94 | |||
5549b9585d | |||
d294ef757e | |||
0ad8222b97 | |||
38307da22a | |||
0c2ee1e41d | |||
edd033b708 | |||
9528c0f8b9 | |||
638099c999 | |||
659895c3ed | |||
ce82241ab2 | |||
0110e01826 | |||
268a8844b6 | |||
f665382017 | |||
a6f3b89596 | |||
240f9a6a85 | |||
a840ac0a4d | |||
584a6a2102 | |||
e02e55fafd | |||
a23819f4fe | |||
cc3e7be429 | |||
172b62f802 | |||
a5547a3a76 | |||
c8a1454e2b | |||
bcd1ee048e | |||
fff3b98ab0 | |||
40861c9e4f | |||
0c1252bcf5 | |||
760581b330 | |||
acc918436a | |||
6623dec567 | |||
75f9575557 | |||
78de12d6b4 | |||
d775a9bdae | |||
60389a1539 | |||
3aaabce7a4 | |||
ad183c48ee | |||
2361987421 | |||
5875820542 | |||
31f7d57889 | |||
02ec133392 | |||
1309953da6 | |||
5273fcb3ad | |||
f2bc5e2c67 | |||
4b8b33587c | |||
953fcfe09e | |||
21e5f68292 | |||
92701885d0 | |||
c96cc55c40 | |||
70500943f3 | |||
ddebdeccb1 | |||
71ea0c65ea | |||
642fde44f1 | |||
1c78666c56 | |||
8158926862 | |||
4945f4bf9a | |||
79e63a8496 | |||
c6171a8f29 | |||
dd7eed952e | |||
cb2c416b51 | |||
dcb3df0a38 | |||
0a9e24622f | |||
8678265125 | |||
df387e2394 |
16
.github/workflows/build.yml
vendored
Normal file
16
.github/workflows/build.yml
vendored
Normal file
@ -0,0 +1,16 @@
|
||||
name: build
|
||||
on: [push, pull_request]
|
||||
|
||||
jobs:
|
||||
luacheck:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- name: Install Luarocks
|
||||
run: |
|
||||
sudo apt-get update -qyy
|
||||
sudo apt-get install luarocks -qyy
|
||||
- name: Install Luacheck
|
||||
run: luarocks install --local luacheck
|
||||
- name: Run Luacheck
|
||||
run: $HOME/.luarocks/bin/luacheck mods
|
@ -1,6 +1,10 @@
|
||||
unused_args = false
|
||||
allow_defined_top = true
|
||||
|
||||
globals = {
|
||||
"default"
|
||||
}
|
||||
|
||||
read_globals = {
|
||||
"DIR_DELIM",
|
||||
"minetest",
|
||||
|
11
.travis.yml
11
.travis.yml
@ -1,11 +0,0 @@
|
||||
language: generic
|
||||
addons:
|
||||
apt:
|
||||
packages:
|
||||
- luarocks
|
||||
before_install:
|
||||
- luarocks install --local luacheck
|
||||
script:
|
||||
- $HOME/.luarocks/bin/luacheck ./mods
|
||||
notifications:
|
||||
email: false
|
40
README.md
40
README.md
@ -1,31 +1,43 @@
|
||||
# Minetest Game
|
||||
|
||||
The default game bundled in the Minetest engine.
|
||||
[](https://content.minetest.net/packages/Minetest/minetest_game/)
|
||||
|
||||
For further information, check
|
||||
[this forum topic](https://forum.minetest.net/viewtopic.php?f=15&t=9724).
|
||||
Also see the [Minetest Wiki](https://wiki.minetest.net/Subgames/Minetest_Game)
|
||||
for more information.
|
||||
Minetest Game (abbreviated MTG) is a simple and peaceful sandbox game, with no
|
||||
real goals or built-in enemy mobs.
|
||||
|
||||
While it provides a basic gameplay experience out of the box, it is best played
|
||||
with mods.
|
||||
|
||||
Minetest Game is currently in maintenance-only mode, meaning it will not see new
|
||||
gameplay features or anything else that breaks compatibility (See
|
||||
[#2710](https://github.com/minetest/minetest_game/issues/2710)).
|
||||
|
||||
## Installation
|
||||
|
||||
- Unzip the archive, rename the folder to minetest_game and
|
||||
place it in .. minetest/games/
|
||||
### ContentDB
|
||||
|
||||
- GNU/Linux: If you use a system-wide installation place
|
||||
it in ~/.minetest/games/.
|
||||
* Content > Browse Online Content
|
||||
* Search for Minetest Game
|
||||
* Click Install
|
||||
|
||||
### Manually
|
||||
|
||||
- Unzip the archive, rename the folder to `minetest_game` and
|
||||
place it in .. `minetest/games/`
|
||||
|
||||
- GNU/Linux: If you use a system-wide installation place it in `~/.minetest/games/`.
|
||||
|
||||
The Minetest engine can be found at [GitHub](https://github.com/minetest/minetest).
|
||||
|
||||
For further information or help, see:
|
||||
https://wiki.minetest.net/Installing_Mods
|
||||
For further information or help, see: [Installing Mods](https://wiki.minetest.net/Installing_Mods).
|
||||
|
||||
## Compatibility
|
||||
|
||||
The Minetest Game GitHub master HEAD is generally compatible with the GitHub
|
||||
master HEAD of the Minetest engine.
|
||||
The Minetest Game GitHub `master` `HEAD` is generally compatible with the GitHub
|
||||
`master` `HEAD` of the Minetest engine.
|
||||
|
||||
Additionally, when the Minetest engine is tagged to be a certain version (e.g.
|
||||
0.4.10), Minetest Game is tagged with the version too.
|
||||
`0.4.10`), Minetest Game is tagged with the version, too.
|
||||
|
||||
When stable releases are made, Minetest Game and the Minetest engine is packaged
|
||||
and made available at [www.minetest.net](https://www.minetest.net/downloads/).
|
||||
|
@ -1,3 +1,4 @@
|
||||
name = Minetest Game
|
||||
title = Minetest Game
|
||||
author = Minetest
|
||||
description = A basic exploration, mining, crafting and building sandbox game with no NPCs, monsters or animals. Minetest Game is usually used with mods added and many mods are available for this game. Reliably maintained by Minetest Engine core developers.
|
||||
description = A basic exploration, mining, crafting, and building, sandbox game with no NPCs, monsters, or animals. Minetest Game is usually used with mods added, and many mods are available for this game. Reliably maintained by Minetest Engine core developers.
|
||||
min_minetest_version = 5.8
|
||||
|
121
game_api.txt
121
game_api.txt
@ -49,6 +49,8 @@ Beds API
|
||||
* `beds.read_spawns() ` Returns a table containing players respawn positions
|
||||
* `beds.kick_players()` Forces all players to leave bed
|
||||
* `beds.skip_night()` Sets world time to morning and saves respawn position of all players currently sleeping
|
||||
* `beds.day_interval` Is a table with keys "start" and "finish". Allows you
|
||||
to set the period of the day (timeofday format). Default: `{ start = 0.2, finish = 0.805 }`.
|
||||
|
||||
### Bed definition
|
||||
|
||||
@ -218,6 +220,8 @@ The doors mod allows modders to register custom doors and trapdoors.
|
||||
description = "Door description",
|
||||
inventory_image = "mod_door_inv.png",
|
||||
groups = {choppy = 2},
|
||||
model = "mod_door", -- (optional)
|
||||
-- Model name without a suffix ("big_door" not "big_door_a.obj", "big_door_b.obj")
|
||||
tiles = {"mod_door.png"}, -- UV map.
|
||||
-- The front and back of the door must be identical in appearence as they swap on
|
||||
-- open/close.
|
||||
@ -225,14 +229,20 @@ The doors mod allows modders to register custom doors and trapdoors.
|
||||
sounds = default.node_sound_wood_defaults(), -- optional
|
||||
sound_open = sound play for open door, -- optional
|
||||
sound_close = sound play for close door, -- optional
|
||||
gain_open = 0.3, -- optional, defaults to 0.3
|
||||
gain_close = 0.3, -- optional, defaults to 0.3
|
||||
protected = false, -- If true, only placer can open the door (locked for others)
|
||||
on_rightclick = function(pos, node, clicker, itemstack, pointed_thing)
|
||||
on_rightclick = function(pos, node, clicker, itemstack, pointed_thing),
|
||||
-- optional function containing the on_rightclick callback, defaults to a doors.door_toggle-wrapper
|
||||
use_texture_alpha = "clip",
|
||||
|
||||
### Trapdoor definition
|
||||
|
||||
description = "Trapdoor description",
|
||||
inventory_image = "mod_trapdoor_inv.png",
|
||||
nodebox_closed = {} -- Nodebox for closed model
|
||||
nodebox_opened = {} -- Nodebox for opened model
|
||||
-- (optional) both nodeboxes must be used, not one only
|
||||
groups = {choppy = 2},
|
||||
tile_front = "doors_trapdoor.png", -- the texture for the front and back of the trapdoor
|
||||
tile_side = "doors_trapdoor_side.png",
|
||||
@ -244,11 +254,12 @@ The doors mod allows modders to register custom doors and trapdoors.
|
||||
sounds = default.node_sound_wood_defaults(), -- optional
|
||||
sound_open = sound play for open door, -- optional
|
||||
sound_close = sound play for close door, -- optional
|
||||
gain_open = 0.3, -- optional, defaults to 0.3
|
||||
gain_close = 0.3, -- optional, defaults to 0.3
|
||||
protected = false, -- If true, only placer can open the door (locked for others)
|
||||
on_rightclick = function(pos, node, clicker, itemstack, pointed_thing)
|
||||
-- function containing the on_rightclick callback
|
||||
on_rightclick = function(pos, node, clicker, itemstack, pointed_thing)
|
||||
on_rightclick = function(pos, node, clicker, itemstack, pointed_thing) ,
|
||||
-- function containing the on_rightclick callback
|
||||
use_texture_alpha = "clip",
|
||||
|
||||
### Fence gate definition
|
||||
|
||||
@ -431,6 +442,11 @@ Player API
|
||||
|
||||
The player API can register player models and update the player's appearance.
|
||||
|
||||
* `player_api.globalstep(dtime, ...)`
|
||||
* The function called by the globalstep that controls player animations.
|
||||
You can override this to replace the globalstep with your own implementation.
|
||||
* Receives all args that minetest.register_globalstep() passes
|
||||
|
||||
* `player_api.register_model(name, def)`
|
||||
* Register a new model to be used by players
|
||||
* `name`: model filename such as "character.x", "foo.b3d", etc.
|
||||
@ -445,19 +461,25 @@ The player API can register player models and update the player's appearance.
|
||||
* `player_api.set_model(player, model_name)`
|
||||
* Change a player's model
|
||||
* `player`: PlayerRef
|
||||
* `model_name`: model registered with player_api.register_model()
|
||||
* `model_name`: model registered with `player_api.register_model`
|
||||
|
||||
* `player_api.set_animation(player, anim_name, speed)`
|
||||
* Applies an animation to a player
|
||||
* Applies an animation to a player if speed or anim_name differ from the currently playing animation
|
||||
* `player`: PlayerRef
|
||||
* `anim_name`: name of the animation
|
||||
* `speed`: frames per second. If nil, the default from the model def is used
|
||||
* `speed`: keyframes per second. If nil, the default from the model def is used
|
||||
|
||||
* `player_api.set_textures(player, textures)`
|
||||
* Sets player textures
|
||||
* `player`: PlayerRef
|
||||
* `textures`: array of textures. If nil, the default from the model def is used
|
||||
|
||||
* `player_api.set_textures(player, index, texture)`
|
||||
* Sets one of the player textures
|
||||
* `player`: PlayerRef
|
||||
* `index`: Index into array of all textures
|
||||
* `texture`: the texture string
|
||||
|
||||
* `player_api.get_animation(player)`
|
||||
* Returns a table containing fields `model`, `textures` and `animation`
|
||||
* Any of the fields of the returned table may be nil
|
||||
@ -473,18 +495,25 @@ The player API can register player models and update the player's appearance.
|
||||
### Model Definition
|
||||
|
||||
{
|
||||
animation_speed = 30, -- Default animation speed, in FPS
|
||||
textures = {"character.png", }, -- Default array of textures
|
||||
visual_size = {x = 1, y = 1}, -- Used to scale the model
|
||||
animation_speed = 30, -- Default animation speed, in keyframes per second
|
||||
textures = {"character.png"}, -- Default array of textures
|
||||
animations = {
|
||||
-- <anim_name> = {x = <start_frame>, y = <end_frame>},
|
||||
foo = {x = 0, y = 19},
|
||||
bar = {x = 20, y = 39},
|
||||
-- ...
|
||||
-- [anim_name] = {
|
||||
-- x = <start_frame>,
|
||||
-- y = <end_frame>,
|
||||
-- collisionbox = <model collisionbox>, -- (optional)
|
||||
-- eye_height = <model eye height>, -- (optional)
|
||||
-- -- suspend client side animations while this one is active (optional)
|
||||
-- override_local = <true/false>
|
||||
-- },
|
||||
stand = ..., lay = ..., walk = ..., mine = ..., walk_mine = ..., -- required animations
|
||||
sit = ... -- used by boats and other MTG mods
|
||||
},
|
||||
collisionbox = {-0.3, 0.0, -0.3, 0.3, 1.7, 0.3}, -- In nodes from feet position
|
||||
stepheight = 0.6, -- In nodes
|
||||
eye_height = 1.47, -- In nodes above feet position
|
||||
-- Default object properties, see lua_api.txt
|
||||
visual_size = {x = 1, y = 1},
|
||||
collisionbox = {-0.3, 0.0, -0.3, 0.3, 1.7, 0.3},
|
||||
stepheight = 0.6,
|
||||
eye_height = 1.47
|
||||
}
|
||||
|
||||
|
||||
@ -719,6 +748,12 @@ Stairs API
|
||||
The stairs API lets you register stairs and slabs and ensures that they are registered the same way as those
|
||||
delivered with Minetest Game, to keep them compatible with other mods.
|
||||
|
||||
The following node attributes are sourced from the recipeitem:
|
||||
* use_texture_alpha
|
||||
* sunlight_propagates
|
||||
* light_source
|
||||
* If the recipeitem is a fuel, the stair/slab is also registered as a fuel of proportionate burntime.
|
||||
|
||||
`stairs.register_stair(subname, recipeitem, groups, images, description, sounds, worldaligntex)`
|
||||
|
||||
* Registers a stair
|
||||
@ -993,6 +1028,27 @@ Trees
|
||||
* `default.grow_blueberry_bush(pos)`
|
||||
* Grows a blueberry bush at pos
|
||||
|
||||
* `default.on_grow_failed(pos)`
|
||||
* Reset the node timer to 300 seconds, used as default callback when the growth of a sapling fails
|
||||
|
||||
* `default.sapling_growth_defs`
|
||||
* Table that contains all the definitions for the growable saplings, see `default.register_sapling_growth`
|
||||
|
||||
* `default.register_sapling_growth(name, def)`
|
||||
* Register a new sapling growth configuration. Useful to add custom sapling and trees to the game in a compact way.
|
||||
default.register_sapling_growth(
|
||||
"default:sapling", -- Name of the sapling
|
||||
{
|
||||
can_grow = default.can_grow, -- Function called to determine whether the sapling can grow, should return a boolean
|
||||
on_grow_failed = default.on_grow_failed, -- Function called when the growth fails
|
||||
grow = function(pos) -- Function called when the growth has success. This should replace the sapling with a tree.
|
||||
}
|
||||
)
|
||||
|
||||
* `default.grow_sapling(pos)`
|
||||
* Attempt to grow a sapling at the given position. Useful as on_timer callback.
|
||||
|
||||
|
||||
|
||||
Carts
|
||||
-----
|
||||
@ -1082,3 +1138,34 @@ This function registers a shapeless recipe that takes `ingredient`
|
||||
and `result` as input and outputs `result`.
|
||||
|
||||
The metadata of the input `result` is copied to the output `result`.
|
||||
|
||||
|
||||
Log API
|
||||
-------
|
||||
|
||||
Logs action of the player with a node at a certain position.
|
||||
By default only actions of real players are logged.
|
||||
Actions of non-players (usually machines) are logged only when
|
||||
setting `log_non_player_actions` is enabled.
|
||||
A player is considered non-player if `player:is_player()` returns
|
||||
`false` or `player.is_fake_player` is truthy. The use of
|
||||
`is_fake_player` is an unofficial standard between mods.
|
||||
These non-players are marked by the content of `is_fake_player`
|
||||
(if it is a string) or a "*" in brackets after the player name in
|
||||
the log.
|
||||
|
||||
`default.log_player_action(player, ...)`
|
||||
|
||||
* `player` The player who performed the action
|
||||
* `message_parts` Any mumber of message parts describing the action
|
||||
in 3rd person singular present tense. It can also
|
||||
contain a `pos` which is logged as "(X,Y,Z)"
|
||||
|
||||
`default.set_inventory_action_loggers(def, name)`
|
||||
|
||||
* hooks the callbacks `on_metadata_inventory_move`,
|
||||
`on_metadata_inventory_put` and `on_metadata_inventory_take`
|
||||
that log corresponding actions
|
||||
* after logging the action, the original callback (if any) is called
|
||||
* `def` See [Node definition]
|
||||
* `name` Description of the node in the log message
|
||||
|
@ -72,6 +72,9 @@ default:torch 99,default:cobble 99
|
||||
# Helps rivers create more sound, especially on level sections.
|
||||
#river_source_sounds = false
|
||||
|
||||
# Enable cloud variation by the 'weather' mod.
|
||||
# Enable cloud and shadow intensity variation by the 'weather' mod.
|
||||
# Non-functional in V6 or Singlenode mapgens.
|
||||
#enable_weather = true
|
||||
|
||||
# If enabled, non-player actions are logged
|
||||
#log_non_player_actions = false
|
||||
|
@ -115,8 +115,8 @@ function beds.register_bed(name, def)
|
||||
local dir = minetest.facedir_to_dir(node.param2)
|
||||
local p = vector.add(pos, dir)
|
||||
local node2 = minetest.get_node_or_nil(p)
|
||||
if not node2 or not minetest.get_item_group(node2.name, "bed") == 2 or
|
||||
not node.param2 == node2.param2 then
|
||||
if not node2 or minetest.get_item_group(node2.name, "bed") ~= 2 or
|
||||
node.param2 ~= node2.param2 then
|
||||
return false
|
||||
end
|
||||
if minetest.is_protected(p, user:get_player_name()) then
|
||||
|
@ -65,7 +65,7 @@ beds.register_bed("beds:bed", {
|
||||
"beds_bed_top_bottom.png^[transformR90",
|
||||
"beds_bed_under.png",
|
||||
"beds_bed_side_bottom_r.png",
|
||||
"beds_bed_side_bottom_r.png^[transformfx",
|
||||
"beds_bed_side_bottom_r.png^[transformFX",
|
||||
"beds_transparent.png",
|
||||
"beds_bed_side_bottom.png"
|
||||
},
|
||||
@ -73,7 +73,7 @@ beds.register_bed("beds:bed", {
|
||||
"beds_bed_top_top.png^[transformR90",
|
||||
"beds_bed_under.png",
|
||||
"beds_bed_side_top_r.png",
|
||||
"beds_bed_side_top_r.png^[transformfx",
|
||||
"beds_bed_side_top_r.png^[transformFX",
|
||||
"beds_bed_side_top.png",
|
||||
"beds_transparent.png",
|
||||
}
|
||||
|
@ -102,6 +102,11 @@ local function lay_down(player, pos, bed_pos, state, skip)
|
||||
return false
|
||||
end
|
||||
|
||||
-- Check if player is attached to an object
|
||||
if player:get_attach() then
|
||||
return false
|
||||
end
|
||||
|
||||
if beds.player[name] then
|
||||
-- player already in bed, do nothing
|
||||
return false
|
||||
@ -111,8 +116,6 @@ local function lay_down(player, pos, bed_pos, state, skip)
|
||||
beds.bed_position[name] = bed_pos
|
||||
beds.player[name] = {physics_override = player:get_physics_override()}
|
||||
|
||||
-- physics, eye_offset, etc
|
||||
player:set_eye_offset({x = 0, y = -13, z = 0}, {x = 0, y = 0, z = 0})
|
||||
local yaw, param2 = get_look_yaw(bed_pos)
|
||||
player:set_look_horizontal(yaw)
|
||||
local dir = minetest.facedir_to_dir(param2)
|
||||
@ -178,12 +181,32 @@ function beds.skip_night()
|
||||
minetest.set_timeofday(0.23)
|
||||
end
|
||||
|
||||
local update_scheduled = false
|
||||
local function schedule_update()
|
||||
if update_scheduled then
|
||||
-- there already is an update scheduled; don't schedule more to prevent races
|
||||
return
|
||||
end
|
||||
update_scheduled = true
|
||||
minetest.after(2, function()
|
||||
update_scheduled = false
|
||||
if not is_sp then
|
||||
update_formspecs(is_night_skip_enabled())
|
||||
end
|
||||
if is_night_skip_enabled() then
|
||||
-- skip the night and let all players stand up
|
||||
beds.skip_night()
|
||||
beds.kick_players()
|
||||
end
|
||||
end)
|
||||
end
|
||||
|
||||
function beds.on_rightclick(pos, player)
|
||||
local name = player:get_player_name()
|
||||
local ppos = player:get_pos()
|
||||
local tod = minetest.get_timeofday()
|
||||
|
||||
if tod > 0.2 and tod < 0.805 then
|
||||
if tod > beds.day_interval.start and tod < beds.day_interval.finish then
|
||||
if beds.player[name] then
|
||||
lay_down(player, nil, nil, false)
|
||||
end
|
||||
@ -203,17 +226,8 @@ function beds.on_rightclick(pos, player)
|
||||
update_formspecs(false)
|
||||
end
|
||||
|
||||
-- skip the night and let all players stand up
|
||||
if check_in_beds() then
|
||||
minetest.after(2, function()
|
||||
if not is_sp then
|
||||
update_formspecs(is_night_skip_enabled())
|
||||
end
|
||||
if is_night_skip_enabled() then
|
||||
beds.skip_night()
|
||||
beds.kick_players()
|
||||
end
|
||||
end)
|
||||
schedule_update()
|
||||
end
|
||||
end
|
||||
|
||||
@ -246,13 +260,7 @@ minetest.register_on_leaveplayer(function(player)
|
||||
lay_down(player, nil, nil, false, true)
|
||||
beds.player[name] = nil
|
||||
if check_in_beds() then
|
||||
minetest.after(2, function()
|
||||
update_formspecs(is_night_skip_enabled())
|
||||
if is_night_skip_enabled() then
|
||||
beds.skip_night()
|
||||
beds.kick_players()
|
||||
end
|
||||
end)
|
||||
schedule_update()
|
||||
end
|
||||
end)
|
||||
|
||||
|
@ -16,6 +16,11 @@ beds.formspec = "size[8,11;true]" ..
|
||||
"bgcolor[#080808BB;true]" ..
|
||||
"button_exit[2,10;4,0.75;leave;" .. esc(S("Leave Bed")) .. "]"
|
||||
|
||||
beds.day_interval = {
|
||||
start = 0.2,
|
||||
finish = 0.805,
|
||||
}
|
||||
|
||||
local modpath = minetest.get_modpath("beds")
|
||||
|
||||
-- Load files
|
||||
|
10
mods/beds/locale/beds.eo.tr
Normal file
10
mods/beds/locale/beds.eo.tr
Normal file
@ -0,0 +1,10 @@
|
||||
# textdomain: beds
|
||||
Fancy Bed=Luksa Lito
|
||||
Simple Bed=Simpla Lito
|
||||
This bed is already occupied!=Tiu lito jam estas okupata!
|
||||
You have to stop moving before going to bed!=Vi ĉesu moviĝi por enlitiĝi!
|
||||
Good morning.=Bonan matenon.
|
||||
@1 of @2 players are in bed=@1 el @2 ludantoj estas en lito
|
||||
Force night skip=Devigi noktan salton
|
||||
You can only sleep at night.=Vi povas dormi nur nokte.
|
||||
Leave Bed=Ellitiĝi
|
@ -1,8 +1,8 @@
|
||||
# textdomain: beds
|
||||
Fancy Bed=Lit chic
|
||||
Simple Bed=Lit simple
|
||||
This bed is already occupied!=
|
||||
You have to stop moving before going to bed!=
|
||||
This bed is already occupied!=Ce lit est déjà occupé !
|
||||
You have to stop moving before going to bed!=Vous devez arrêter de bouger avant de vous coucher !
|
||||
Good morning.=Bonjour.
|
||||
@1 of @2 players are in bed=@1 joueur(s) sur @2 sont au lit
|
||||
Force night skip=Forcer le passage de la nuit
|
||||
|
@ -1,10 +1,10 @@
|
||||
# textdomain: beds
|
||||
Fancy Bed=Ranjang Mewah
|
||||
Simple Bed=Ranjang Sederhana
|
||||
This bed is already occupied!=
|
||||
You have to stop moving before going to bed!=
|
||||
This bed is already occupied!=Ranjang telah terisi!
|
||||
You have to stop moving before going to bed!=Anda harus diam untuk tidur!
|
||||
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 dapat tidur pada waktu malam.
|
||||
You can only sleep at night.=Anda hanya bisa tidur pada waktu malam.
|
||||
Leave Bed=Tinggalkan Ranjang
|
||||
|
10
mods/beds/locale/beds.ja.tr
Normal file
10
mods/beds/locale/beds.ja.tr
Normal file
@ -0,0 +1,10 @@
|
||||
# textdomain: beds
|
||||
Fancy Bed=ファンシーなベッド
|
||||
Simple Bed=シンプルなベッド
|
||||
This bed is already occupied!=ベッドはすでに使われています!
|
||||
You have to stop moving before going to bed!=寝るときは動かないでください!
|
||||
Good morning.=おはようございます。
|
||||
@1 of @2 players are in bed=ベッドに@1 / @2人います
|
||||
Force night skip=強制的に夜をスキップします
|
||||
You can only sleep at night.=夜しか寝れません。
|
||||
Leave Bed=ベッドから出ます
|
@ -1,10 +1,10 @@
|
||||
# textdomain: beds
|
||||
Fancy Bed=Katil Beragam
|
||||
Simple Bed=Katil Biasa
|
||||
This bed is already occupied!=
|
||||
You have to stop moving before going to bed!=
|
||||
This bed is already occupied!=Katil ini sudah diduduki!
|
||||
You have to stop moving before going to bed!=Anda perlu berhenti bergerak sebelum tidur!
|
||||
Good morning.=Selamat pagi.
|
||||
@1 of @2 players are in bed=@1 daripada @2 pemain sedang tidur
|
||||
Force night skip=Paksa langkau malam
|
||||
You can only sleep at night.=Anda hanya boleh tidur pada waktu malam.
|
||||
Leave Bed=Bangun
|
||||
Leave Bed=Tinggalkan Katil
|
||||
|
10
mods/beds/locale/beds.pl.tr
Normal file
10
mods/beds/locale/beds.pl.tr
Normal file
@ -0,0 +1,10 @@
|
||||
# textdomain: beds
|
||||
Fancy Bed=Fantazyjne łóżko
|
||||
Simple Bed=Proste łóżko
|
||||
This bed is already occupied!=To łóżko jest już zajęte!
|
||||
You have to stop moving before going to bed!=Musisz się zatrzymać aby wejść do łóżka
|
||||
Good morning.=Dzień dobry.
|
||||
@1 of @2 players are in bed=@1 z @2 graczy śpią
|
||||
Force night skip=Wymuś pominięcie nocy
|
||||
You can only sleep at night.=Możesz spać tylko w nocy.
|
||||
Leave Bed=Opuść łóżko
|
@ -1,8 +1,8 @@
|
||||
# textdomain: beds
|
||||
Fancy Bed=Детализированная Кровать
|
||||
Simple Bed=Обычная Кровать
|
||||
This bed is already occupied!=
|
||||
You have to stop moving before going to bed!=
|
||||
This bed is already occupied!=Эта кровать уже занята!
|
||||
You have to stop moving before going to bed!=Нельзя воспользоваться кроватью на ходу!
|
||||
Good morning.=Доброе утро.
|
||||
@1 of @2 players are in bed=@1 из @2 игроков в кровати
|
||||
Force night skip=Пропустить ночь
|
||||
|
@ -1,10 +0,0 @@
|
||||
# textdomain: beds
|
||||
Fancy Bed=Fin säng
|
||||
Simple Bed=Enkel Säng
|
||||
This bed is already occupied!=
|
||||
You have to stop moving before going to bed!=
|
||||
Good morning.= God morgon.
|
||||
@1 of @2 players are in bed=@1 av @2 spelar försöker sover.
|
||||
Force night skip=Tvinga över natten
|
||||
You can only sleep at night.=Du kan bara sova på natten.
|
||||
Leave Bed=Lämna Säng
|
@ -1,8 +1,8 @@
|
||||
# textdomain: beds
|
||||
Fancy Bed=Pekná posteľ
|
||||
Simple Bed=Jednoduchá posteľ
|
||||
This bed is already occupied!=
|
||||
You have to stop moving before going to bed!=
|
||||
This bed is already occupied!=Táto posteľ je už obsadená
|
||||
You have to stop moving before going to bed!=Predtým ako si ľahneš do postele, sa musíš prestať pohybovať!
|
||||
Good morning.=Dobré ráno.
|
||||
@1 of @2 players are in bed=@1 z @2 hráčov sú v posteli
|
||||
Force night skip=Nútene preskočiť noc
|
||||
|
10
mods/beds/locale/beds.sv.tr
Normal file
10
mods/beds/locale/beds.sv.tr
Normal file
@ -0,0 +1,10 @@
|
||||
# textdomain: beds
|
||||
Fancy Bed=Fin säng
|
||||
Simple Bed=Enkel säng
|
||||
This bed is already occupied!=Den här sängen används redan!
|
||||
You have to stop moving before going to bed!=Du måste stanna innan du kan lägga dig!
|
||||
Good morning.=God morgon.
|
||||
@1 of @2 players are in bed=@1 av @2 spelare försöker sova.
|
||||
Force night skip=Tvinga att hoppa över natt
|
||||
You can only sleep at night.=Du kan bara sova på natten.
|
||||
Leave Bed=Lämna säng
|
10
mods/beds/locale/beds.uk.tr
Normal file
10
mods/beds/locale/beds.uk.tr
Normal file
@ -0,0 +1,10 @@
|
||||
# textdomain: beds
|
||||
Fancy Bed=Гарне ліжко
|
||||
Simple Bed=Просте ліжко
|
||||
This bed is already occupied!=Це ліжко вже зайняте!
|
||||
You have to stop moving before going to bed!=Зупиніться перед тим як лягти!
|
||||
Good morning.=Доброго ранку.
|
||||
@1 of @2 players are in bed=@1 з @2 гравців(-я) у ліжку
|
||||
Force night skip=Пропустити ніч
|
||||
You can only sleep at night.=Ви можете спати лише вночі.
|
||||
Leave Bed=Встати з ліжка
|
@ -1,8 +1,8 @@
|
||||
# textdomain: beds
|
||||
Fancy Bed=花式床
|
||||
Simple Bed=简易床
|
||||
This bed is already occupied!=
|
||||
You have to stop moving before going to bed!=
|
||||
This bed is already occupied!=床上已有人!
|
||||
You have to stop moving before going to bed!=上床前要停止移动!
|
||||
Good morning.=早安!
|
||||
@1 of @2 players are in bed=@2位玩家中的@1位在床上
|
||||
Force night skip=强制跳过夜晚
|
||||
|
@ -1,8 +1,8 @@
|
||||
# textdomain: beds
|
||||
Fancy Bed=花式床
|
||||
Simple Bed=簡易床
|
||||
This bed is already occupied!=
|
||||
You have to stop moving before going to bed!=
|
||||
This bed is already occupied!=這個床已經被占據了!
|
||||
You have to stop moving before going to bed!=你必須在上床前停止移動!
|
||||
Good morning.=早安!
|
||||
@1 of @2 players are in bed=@2位玩家中的@1位在床上
|
||||
Force night skip=強制跳過夜晚
|
||||
|
@ -53,6 +53,7 @@ minetest.register_craftitem("binoculars:binoculars", {
|
||||
description = S("Binoculars") .. "\n" .. S("Use with 'Zoom' key"),
|
||||
inventory_image = "binoculars_binoculars.png",
|
||||
stack_max = 1,
|
||||
groups = {tool = 1},
|
||||
|
||||
on_use = function(itemstack, user, pointed_thing)
|
||||
binoculars.update_player_property(user)
|
||||
|
3
mods/binoculars/locale/binoculars.eo.tr
Normal file
3
mods/binoculars/locale/binoculars.eo.tr
Normal file
@ -0,0 +1,3 @@
|
||||
# textdomain: binoculars
|
||||
Binoculars=Binoklo
|
||||
Use with 'Zoom' key=Uzi per 'Zomo' klavo
|
@ -1,3 +1,3 @@
|
||||
# textdomain: binoculars
|
||||
Binoculars=Teropong
|
||||
Use with 'Zoom' key=Pakai dengan tombol 'Zoom'
|
||||
Use with 'Zoom' key=Gunakan dengan tombol 'Zum'
|
||||
|
3
mods/binoculars/locale/binoculars.ja.tr
Normal file
3
mods/binoculars/locale/binoculars.ja.tr
Normal file
@ -0,0 +1,3 @@
|
||||
# textdomain: binoculars
|
||||
Binoculars=双眼鏡
|
||||
Use with 'Zoom' key=ズームキーで使います
|
3
mods/binoculars/locale/binoculars.pl.tr
Normal file
3
mods/binoculars/locale/binoculars.pl.tr
Normal file
@ -0,0 +1,3 @@
|
||||
# textdomain: binoculars
|
||||
Binoculars=Lornetka
|
||||
Use with 'Zoom' key=Aby użyć naciśnij 'Zoom'
|
@ -1,3 +0,0 @@
|
||||
# textdomain: binoculars
|
||||
Binoculars=Kikare
|
||||
Use with 'Zoom' key=Används med 'Zoom' knappen
|
3
mods/binoculars/locale/binoculars.sv.tr
Normal file
3
mods/binoculars/locale/binoculars.sv.tr
Normal file
@ -0,0 +1,3 @@
|
||||
# textdomain: binoculars
|
||||
Binoculars=Kikare
|
||||
Use with 'Zoom' key=Använd med 'Zoom'-knappen
|
3
mods/binoculars/locale/binoculars.uk.tr
Normal file
3
mods/binoculars/locale/binoculars.uk.tr
Normal file
@ -0,0 +1,3 @@
|
||||
# textdomain: binoculars
|
||||
Binoculars=Бінокль
|
||||
Use with 'Zoom' key=Використовується клавішею 'Наближення'
|
@ -53,31 +53,24 @@ function boat.on_rightclick(self, clicker)
|
||||
end
|
||||
local name = clicker:get_player_name()
|
||||
if self.driver and name == self.driver then
|
||||
self.driver = nil
|
||||
self.auto = false
|
||||
-- Cleanup happens in boat.on_detach_child
|
||||
clicker:set_detach()
|
||||
player_api.player_attached[name] = false
|
||||
player_api.set_animation(clicker, "stand" , 30)
|
||||
|
||||
player_api.set_animation(clicker, "stand", 30)
|
||||
local pos = clicker:get_pos()
|
||||
pos = {x = pos.x, y = pos.y + 0.2, z = pos.z}
|
||||
minetest.after(0.1, function()
|
||||
clicker:set_pos(pos)
|
||||
end)
|
||||
elseif not self.driver then
|
||||
local attach = clicker:get_attach()
|
||||
if attach and attach:get_luaentity() then
|
||||
local luaentity = attach:get_luaentity()
|
||||
if luaentity.driver then
|
||||
luaentity.driver = nil
|
||||
end
|
||||
clicker:set_detach()
|
||||
end
|
||||
self.driver = name
|
||||
clicker:set_attach(self.object, "",
|
||||
{x = 0.5, y = 1, z = -3}, {x = 0, y = 0, z = 0})
|
||||
|
||||
self.driver = name
|
||||
player_api.player_attached[name] = true
|
||||
|
||||
minetest.after(0.2, function()
|
||||
player_api.set_animation(clicker, "sit" , 30)
|
||||
player_api.set_animation(clicker, "sit", 30)
|
||||
end)
|
||||
clicker:set_look_horizontal(self.object:get_yaw())
|
||||
end
|
||||
@ -86,8 +79,12 @@ end
|
||||
|
||||
-- If driver leaves server while driving boat
|
||||
function boat.on_detach_child(self, child)
|
||||
if child and child:get_player_name() == self.driver then
|
||||
player_api.player_attached[child:get_player_name()] = false
|
||||
|
||||
self.driver = nil
|
||||
self.auto = false
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
|
4
mods/boats/locale/boats.eo.tr
Normal file
4
mods/boats/locale/boats.eo.tr
Normal file
@ -0,0 +1,4 @@
|
||||
# textdomain: boats
|
||||
Boat cruise mode on=La kroza maniero de la boato estas ŝaltita.
|
||||
Boat cruise mode off=La kroza maniero de la boato estas malŝaltita.
|
||||
Boat=Boato
|
4
mods/boats/locale/boats.ja.tr
Normal file
4
mods/boats/locale/boats.ja.tr
Normal file
@ -0,0 +1,4 @@
|
||||
# textdomain: boats
|
||||
Boat cruise mode on=クルージングモード・オン
|
||||
Boat cruise mode off=クルージングモード・オフ
|
||||
Boat=ボート
|
@ -1,4 +1,4 @@
|
||||
# textdomain: boats
|
||||
Boat cruise mode on=Mod bot layar makan angin dibolehkan
|
||||
Boat cruise mode off=Mod bot layar makan angin dilumpuhkan
|
||||
Boat cruise mode on=Mod jelajah bot dihidupkan
|
||||
Boat cruise mode off=Mod jelajah bot dimatikan
|
||||
Boat=Bot
|
||||
|
4
mods/boats/locale/boats.pl.tr
Normal file
4
mods/boats/locale/boats.pl.tr
Normal file
@ -0,0 +1,4 @@
|
||||
# textdomain: boats
|
||||
Boat cruise mode on=Tryb rejsu łodką włączony
|
||||
Boat cruise mode off=Tryb rejsu łodką wyłączony
|
||||
Boat=Łódka
|
@ -1,4 +1,4 @@
|
||||
# textdomain: boats
|
||||
Boat cruise mode on=Режим путешествия на лодке включен
|
||||
Boat cruise mode off=Режим путешествия на лодке выключен
|
||||
Boat cruise mode on=Автоход лодки включен
|
||||
Boat cruise mode off=Автоход лодки выключен
|
||||
Boat=Лодка
|
||||
|
@ -1,4 +1,4 @@
|
||||
# textdomain: boats
|
||||
Boat cruise mode on=Cestovný režim loďky zapnutý
|
||||
Boat cruise mode off=Cestovný režim loďky vypnutý
|
||||
Boat cruise mode on=Cestovný režim loďky je zapnutý
|
||||
Boat cruise mode off=Cestovný režim loďky je vypnutý
|
||||
Boat=Loďka
|
||||
|
4
mods/boats/locale/boats.uk.tr
Normal file
4
mods/boats/locale/boats.uk.tr
Normal file
@ -0,0 +1,4 @@
|
||||
# textdomain: boats
|
||||
Boat cruise mode on=Режим мандрування на човні увімкнено
|
||||
Boat cruise mode off=Режим мандрування на човні вимкнено
|
||||
Boat=Човен
|
@ -28,7 +28,7 @@ local bones_formspec =
|
||||
local share_bones_time = tonumber(minetest.settings:get("share_bones_time")) or 1200
|
||||
local share_bones_time_early = tonumber(minetest.settings:get("share_bones_time_early")) or share_bones_time / 4
|
||||
|
||||
minetest.register_node("bones:bones", {
|
||||
local bones_def = {
|
||||
description = S("Bones"),
|
||||
tiles = {
|
||||
"bones_top.png^[transform2",
|
||||
@ -130,7 +130,11 @@ minetest.register_node("bones:bones", {
|
||||
end,
|
||||
on_blast = function(pos)
|
||||
end,
|
||||
})
|
||||
}
|
||||
|
||||
default.set_inventory_action_loggers(bones_def, "bones")
|
||||
|
||||
minetest.register_node("bones:bones", bones_def)
|
||||
|
||||
local function may_replace(pos, player)
|
||||
local node_name = minetest.get_node(pos).name
|
||||
@ -224,7 +228,7 @@ minetest.register_on_dieplayer(function(player)
|
||||
-- check if it's possible to place bones, if not find space near player
|
||||
if bones_mode == "bones" and not may_replace(pos, player) then
|
||||
local air = minetest.find_node_near(pos, 1, {"air"})
|
||||
if air and not minetest.is_protected(air, player_name) then
|
||||
if air then
|
||||
pos = air
|
||||
else
|
||||
bones_mode = "drop"
|
||||
|
8
mods/bones/locale/bones.eo.tr
Normal file
8
mods/bones/locale/bones.eo.tr
Normal file
@ -0,0 +1,8 @@
|
||||
# textdomain: bones
|
||||
Bones=Ostoj
|
||||
@1's old bones=La malfreŝaj ostoj de @1
|
||||
@1 died at @2.=@1 mortis ĉe @2
|
||||
@1 died at @2, and dropped their inventory.=@1 mortis ĉe @2, kaj delasis sian stokon.
|
||||
@1 died at @2, and bones were placed.=@1 mortis ĉe @2, kaj ostoj estas demetitaj.
|
||||
@1's fresh bones=La freŝaj ostoj de @1
|
||||
@1's bones=La ostoj de @1
|
8
mods/bones/locale/bones.ja.tr
Normal file
8
mods/bones/locale/bones.ja.tr
Normal file
@ -0,0 +1,8 @@
|
||||
# textdomain: bones
|
||||
Bones=骨
|
||||
@1's old bones=@1の古い骨
|
||||
@1 died at @2.=@1は@2で死亡しました。
|
||||
@1 died at @2, and dropped their inventory.=@1は@2で死亡して持ち物を落としました。
|
||||
@1 died at @2, and bones were placed.=@1は@2で死亡して骨が残されました。
|
||||
@1's fresh bones=@1の新鮮な骨
|
||||
@1's bones=@1の骨
|
8
mods/bones/locale/bones.pl.tr
Normal file
8
mods/bones/locale/bones.pl.tr
Normal file
@ -0,0 +1,8 @@
|
||||
# textdomain: bones
|
||||
Bones=Kości
|
||||
@1's old bones=Stare kości @1
|
||||
@1 died at @2.=@1 umarł w @2.
|
||||
@1 died at @2, and dropped their inventory.=@1 umarł w @2, i upuścił swój ekwipunek.
|
||||
@1 died at @2, and bones were placed.=@1 umarł w @2, kości zostały położone.
|
||||
@1's fresh bones=Świeże kości @1
|
||||
@1's bones=Kości @1
|
@ -1,8 +1,8 @@
|
||||
# textdomain: bones
|
||||
Bones=Ben
|
||||
@1's old bones=@1s Gamla ben
|
||||
@1 died at @2.=@1 dog på @a.
|
||||
@1 died at @2, and dropped their inventory.=@1 dog på @a, och tappade deras saker.
|
||||
@1 died at @2.=@1 dog på @2.
|
||||
@1 died at @2, and dropped their inventory.=@1 dog på @2, och tappade deras saker.
|
||||
@1 died at @2, and bones were placed.=@1 dog på @2, och deras ben var placerade.
|
||||
@1's fresh bones=@1s färska ben
|
||||
@1's bones=@1s ben
|
8
mods/bones/locale/bones.uk.tr
Normal file
8
mods/bones/locale/bones.uk.tr
Normal file
@ -0,0 +1,8 @@
|
||||
# textdomain: bones
|
||||
Bones=Кістки
|
||||
@1's old bones=Старі кістки @1
|
||||
@1 died at @2.=@1 загинув на координатах @2.
|
||||
@1 died at @2, and dropped their inventory.=@1 загинув на координатах @2 та втратив вміст свого інвентарю.
|
||||
@1 died at @2, and bones were placed.=@1 загинув на координатах @2, було розміщено кістки.
|
||||
@1's fresh bones=Свіжі кістки @1
|
||||
@1's bones=Кістки @1
|
@ -2,7 +2,7 @@
|
||||
Bones=骨骸
|
||||
@1's old bones=@1的旧骨骸
|
||||
@1 died at @2.=@1在@2死亡。
|
||||
@1 died at @2, and dropped their inventory.=@1在@2死亡,丢掉了物品栏。
|
||||
@1 died at @2, and bones were placed.=@1在@2死亡,骨骸被放置。
|
||||
@1 died at @2, and dropped their inventory.=@1在@2死亡,丢掉了所有物品。
|
||||
@1 died at @2, and bones were placed.=@1在@2死亡,已放置骨骸。
|
||||
@1's fresh bones=@1的新鲜骨骸
|
||||
@1's bones=@1的骨骸
|
||||
|
5
mods/bucket/locale/bucket.eo.tr
Normal file
5
mods/bucket/locale/bucket.eo.tr
Normal file
@ -0,0 +1,5 @@
|
||||
# textdomain: bucket
|
||||
Empty Bucket=Malplena Sitelo
|
||||
Water Bucket=Sitelo da Akvo
|
||||
River Water Bucket=Sitelo da Rivera Akvo
|
||||
Lava Bucket=Sitelo da Lafo
|
5
mods/bucket/locale/bucket.ja.tr
Normal file
5
mods/bucket/locale/bucket.ja.tr
Normal file
@ -0,0 +1,5 @@
|
||||
# textdomain: bucket
|
||||
Empty Bucket=空のバケツ
|
||||
Water Bucket=水入りバケツ
|
||||
River Water Bucket=河川水入りバケツ
|
||||
Lava Bucket=溶岩入りバケツ
|
5
mods/bucket/locale/bucket.pl.tr
Normal file
5
mods/bucket/locale/bucket.pl.tr
Normal file
@ -0,0 +1,5 @@
|
||||
# textdomain: bucket
|
||||
Empty Bucket=Puste wiadro
|
||||
Water Bucket=Wiadro z wodą
|
||||
River Water Bucket=Wiadro z rzeczną wodą
|
||||
Lava Bucket=Wiadro z lawą
|
@ -1,5 +0,0 @@
|
||||
# textdomain: bucket
|
||||
Empty Bucket=Tom hink
|
||||
Water Bucket=Vatten hink
|
||||
River Water Bucket=Flodvatten hink
|
||||
Lava Bucket=Lava hink
|
5
mods/bucket/locale/bucket.sv.tr
Normal file
5
mods/bucket/locale/bucket.sv.tr
Normal file
@ -0,0 +1,5 @@
|
||||
# textdomain: bucket
|
||||
Empty Bucket=Tom hink
|
||||
Water Bucket=Vattenhink
|
||||
River Water Bucket=Flodvattenshink
|
||||
Lava Bucket=Lavahink
|
5
mods/bucket/locale/bucket.uk.tr
Normal file
5
mods/bucket/locale/bucket.uk.tr
Normal file
@ -0,0 +1,5 @@
|
||||
# textdomain: bucket
|
||||
Empty Bucket=Порожнє відро
|
||||
Water Bucket=Відро з водою
|
||||
River Water Bucket=Відро з річковою водою
|
||||
Lava Bucket=Відро з лавою
|
4
mods/butterflies/locale/butterflies.eo.tr
Normal file
4
mods/butterflies/locale/butterflies.eo.tr
Normal file
@ -0,0 +1,4 @@
|
||||
# textdomain: butterflies
|
||||
White Butterfly=Blanka Papilio
|
||||
Red Butterfly=Ruĝa Papilio
|
||||
Violet Butterfly=Violkolora Papilio
|
4
mods/butterflies/locale/butterflies.ja.tr
Normal file
4
mods/butterflies/locale/butterflies.ja.tr
Normal file
@ -0,0 +1,4 @@
|
||||
# textdomain: butterflies
|
||||
White Butterfly=白色の蝶
|
||||
Red Butterfly=赤色の蝶
|
||||
Violet Butterfly=紫色の蝶
|
4
mods/butterflies/locale/butterflies.pl.tr
Normal file
4
mods/butterflies/locale/butterflies.pl.tr
Normal file
@ -0,0 +1,4 @@
|
||||
# textdomain: butterflies
|
||||
White Butterfly=Biały motyl
|
||||
Red Butterfly=Czerwony motyl
|
||||
Violet Butterfly=Fioletowy motyl
|
4
mods/butterflies/locale/butterflies.uk.tr
Normal file
4
mods/butterflies/locale/butterflies.uk.tr
Normal file
@ -0,0 +1,4 @@
|
||||
# textdomain: butterflies
|
||||
White Butterfly=Білий метелик
|
||||
Red Butterfly=Червоний метелик
|
||||
Violet Butterfly=Фіолетовий метелик
|
@ -29,15 +29,10 @@ function cart_entity:on_rightclick(clicker)
|
||||
end
|
||||
local player_name = clicker:get_player_name()
|
||||
if self.driver and player_name == self.driver then
|
||||
self.driver = nil
|
||||
carts:manage_attachment(clicker, nil)
|
||||
elseif not self.driver then
|
||||
self.driver = player_name
|
||||
carts:manage_attachment(clicker, self.object)
|
||||
|
||||
-- player_api does not update the animation
|
||||
-- when the player is attached, reset to default animation
|
||||
player_api.set_animation(clicker, "stand")
|
||||
self.driver = player_name
|
||||
end
|
||||
end
|
||||
|
||||
@ -51,9 +46,7 @@ function cart_entity:on_activate(staticdata, dtime_s)
|
||||
return
|
||||
end
|
||||
self.railtype = data.railtype
|
||||
if data.old_dir then
|
||||
self.old_dir = data.old_dir
|
||||
end
|
||||
self.old_dir = data.old_dir or self.old_dir
|
||||
end
|
||||
|
||||
function cart_entity:get_staticdata()
|
||||
@ -66,8 +59,9 @@ end
|
||||
-- 0.5.x and later: When the driver leaves
|
||||
function cart_entity:on_detach_child(child)
|
||||
if child and child:get_player_name() == self.driver then
|
||||
self.driver = nil
|
||||
-- Clean up eye height
|
||||
carts:manage_attachment(child, nil)
|
||||
self.driver = nil
|
||||
end
|
||||
end
|
||||
|
||||
@ -134,7 +128,8 @@ function cart_entity:on_punch(puncher, time_from_last_punch, tool_capabilities,
|
||||
end
|
||||
|
||||
local punch_interval = 1
|
||||
if tool_capabilities and tool_capabilities.full_punch_interval then
|
||||
-- Faulty tool registrations may cause the interval to be set to 0 !
|
||||
if tool_capabilities and (tool_capabilities.full_punch_interval or 0) > 0 then
|
||||
punch_interval = tool_capabilities.full_punch_interval
|
||||
end
|
||||
time_from_last_punch = math.min(time_from_last_punch or punch_interval, punch_interval)
|
||||
@ -195,11 +190,11 @@ local function rail_on_step(self, dtime)
|
||||
end
|
||||
|
||||
local pos = self.object:get_pos()
|
||||
local cart_dir = carts:velocity_to_dir(vel)
|
||||
local same_dir = vector.equals(cart_dir, self.old_dir)
|
||||
local dir = carts:velocity_to_dir(vel)
|
||||
local dir_changed = not vector.equals(dir, self.old_dir)
|
||||
local update = {}
|
||||
|
||||
if self.old_pos and not self.punched and same_dir then
|
||||
if self.old_pos and not self.punched and not dir_changed then
|
||||
local flo_pos = vector.round(pos)
|
||||
local flo_old = vector.round(self.old_pos)
|
||||
if vector.equals(flo_pos, flo_old) then
|
||||
@ -219,7 +214,7 @@ local function rail_on_step(self, dtime)
|
||||
end
|
||||
|
||||
local stop_wiggle = false
|
||||
if self.old_pos and same_dir then
|
||||
if self.old_pos and not dir_changed then
|
||||
-- Detection for "skipping" nodes (perhaps use average dtime?)
|
||||
-- It's sophisticated enough to take the acceleration in account
|
||||
local acc = self.object:get_acceleration()
|
||||
@ -234,7 +229,7 @@ local function rail_on_step(self, dtime)
|
||||
-- No rail found: set to the expected position
|
||||
pos = new_pos
|
||||
update.pos = true
|
||||
cart_dir = new_dir
|
||||
dir = new_dir
|
||||
end
|
||||
elseif self.old_pos and self.old_dir.y ~= 1 and not self.punched then
|
||||
-- Stop wiggle
|
||||
@ -244,21 +239,27 @@ local function rail_on_step(self, dtime)
|
||||
local railparams
|
||||
|
||||
-- dir: New moving direction of the cart
|
||||
-- switch_keys: Currently pressed L/R key, used to ignore the key on the next rail node
|
||||
local dir, switch_keys = carts:get_rail_direction(
|
||||
pos, cart_dir, ctrl, self.old_switch, self.railtype
|
||||
-- switch_keys: Currently pressed L(1) or R(2) key,
|
||||
-- used to ignore the key on the next rail node
|
||||
local switch_keys
|
||||
dir, switch_keys = carts:get_rail_direction(
|
||||
pos, dir, ctrl, self.old_switch, self.railtype
|
||||
)
|
||||
local dir_changed = not vector.equals(dir, self.old_dir)
|
||||
dir_changed = not vector.equals(dir, self.old_dir)
|
||||
|
||||
local new_acc = {x=0, y=0, z=0}
|
||||
local acc = 0
|
||||
if stop_wiggle or vector.equals(dir, {x=0, y=0, z=0}) then
|
||||
dir = vector.new(self.old_dir)
|
||||
vel = {x = 0, y = 0, z = 0}
|
||||
local pos_r = vector.round(pos)
|
||||
if not carts:is_rail(pos_r, self.railtype)
|
||||
and self.old_pos then
|
||||
pos = self.old_pos
|
||||
elseif not stop_wiggle then
|
||||
-- End of rail: Smooth out.
|
||||
pos = pos_r
|
||||
dir_changed = false
|
||||
dir.y = 0
|
||||
else
|
||||
pos.y = math.floor(pos.y + 0.5)
|
||||
end
|
||||
@ -285,7 +286,7 @@ local function rail_on_step(self, dtime)
|
||||
end
|
||||
|
||||
-- Slow down or speed up..
|
||||
local acc = dir.y * -4.0
|
||||
acc = dir.y * -4.0
|
||||
|
||||
-- Get rail for corrected position
|
||||
railparams = get_railparams(pos)
|
||||
@ -303,25 +304,22 @@ local function rail_on_step(self, dtime)
|
||||
acc = acc - 0.4
|
||||
end
|
||||
end
|
||||
|
||||
new_acc = vector.multiply(dir, acc)
|
||||
end
|
||||
|
||||
-- Limits
|
||||
local max_vel = carts.speed_max
|
||||
for _, v in pairs({"x","y","z"}) do
|
||||
if math.abs(vel[v]) > max_vel then
|
||||
vel[v] = carts:get_sign(vel[v]) * max_vel
|
||||
new_acc[v] = 0
|
||||
-- Limit cart speed
|
||||
local vel_len = vector.length(vel)
|
||||
if vel_len > carts.speed_max then
|
||||
vel = vector.multiply(vel, carts.speed_max / vel_len)
|
||||
update.vel = true
|
||||
end
|
||||
if vel_len >= carts.speed_max and acc > 0 then
|
||||
acc = 0
|
||||
end
|
||||
|
||||
self.object:set_acceleration(new_acc)
|
||||
self.object:set_acceleration(vector.multiply(dir, acc))
|
||||
|
||||
self.old_pos = vector.round(pos)
|
||||
if not vector.equals(dir, {x=0, y=0, z=0}) and not stop_wiggle then
|
||||
self.old_dir = vector.new(dir)
|
||||
end
|
||||
self.old_switch = switch_keys
|
||||
|
||||
if self.punched then
|
||||
@ -347,11 +345,11 @@ local function rail_on_step(self, dtime)
|
||||
end
|
||||
|
||||
local yaw = 0
|
||||
if self.old_dir.x < 0 then
|
||||
if dir.x < 0 then
|
||||
yaw = 0.5
|
||||
elseif self.old_dir.x > 0 then
|
||||
elseif dir.x > 0 then
|
||||
yaw = 1.5
|
||||
elseif self.old_dir.z < 0 then
|
||||
elseif dir.z < 0 then
|
||||
yaw = 1
|
||||
end
|
||||
self.object:set_yaw(yaw * math.pi)
|
||||
@ -401,7 +399,7 @@ minetest.register_craftitem("carts:cart", {
|
||||
pointed_thing) or itemstack
|
||||
end
|
||||
|
||||
if not pointed_thing.type == "node" then
|
||||
if pointed_thing.type ~= "node" then
|
||||
return
|
||||
end
|
||||
if carts:is_rail(pointed_thing.under) then
|
||||
|
@ -12,7 +12,7 @@ function carts:manage_attachment(player, obj)
|
||||
end
|
||||
local status = obj ~= nil
|
||||
local player_name = player:get_player_name()
|
||||
if player_api.player_attached[player_name] == status then
|
||||
if obj and player:get_attach() == obj then
|
||||
return
|
||||
end
|
||||
player_api.player_attached[player_name] = status
|
||||
@ -20,6 +20,10 @@ function carts:manage_attachment(player, obj)
|
||||
if status then
|
||||
player:set_attach(obj, "", {x=0, y=-4.5, z=0}, {x=0, y=0, z=0})
|
||||
player:set_eye_offset({x=0, y=-4, z=0},{x=0, y=-4, z=0})
|
||||
|
||||
-- player_api does not update the animation
|
||||
-- when the player is attached, reset to default animation
|
||||
player_api.set_animation(player, "stand")
|
||||
else
|
||||
player:set_detach()
|
||||
player:set_eye_offset({x=0, y=0, z=0},{x=0, y=0, z=0})
|
||||
|
6
mods/carts/locale/carts.eo.tr
Normal file
6
mods/carts/locale/carts.eo.tr
Normal file
@ -0,0 +1,6 @@
|
||||
# textdomain: carts
|
||||
Cart=Ĉaro
|
||||
(Sneak+Click to pick up)=(Ŝteliri+Alklaki por reprini)
|
||||
Rail=Relo
|
||||
Powered Rail=Elektra Relo
|
||||
Brake Rail=Bremsa Relo
|
6
mods/carts/locale/carts.ja.tr
Normal file
6
mods/carts/locale/carts.ja.tr
Normal file
@ -0,0 +1,6 @@
|
||||
# textdomain: carts
|
||||
Cart=トロッコ
|
||||
(Sneak+Click to pick up)=(スニークキーとクリックで乗ります)
|
||||
Rail=レール
|
||||
Powered Rail=パワードレール
|
||||
Brake Rail=ブレーキレール
|
6
mods/carts/locale/carts.pl.tr
Normal file
6
mods/carts/locale/carts.pl.tr
Normal file
@ -0,0 +1,6 @@
|
||||
# textdomain: carts
|
||||
Cart=Wagonik
|
||||
(Sneak+Click to pick up)=(Skradanie+Naciśnij aby zebrać)
|
||||
Rail=Tory
|
||||
Powered Rail=Napędzane tory
|
||||
Brake Rail=Hamujące tory
|
@ -3,4 +3,4 @@ Cart=Vagn
|
||||
(Sneak+Click to pick up)=(Shift+Klicka för att plocka upp)
|
||||
Rail=Räls
|
||||
Powered Rail=Aktiverad räls
|
||||
Brake Rail=Broms räls
|
||||
Brake Rail=Bromsräls
|
6
mods/carts/locale/carts.uk.tr
Normal file
6
mods/carts/locale/carts.uk.tr
Normal file
@ -0,0 +1,6 @@
|
||||
# textdomain: carts
|
||||
Cart=Вагонетка
|
||||
(Sneak+Click to pick up)=(Пригніться та натисніть, щоби підібрати)
|
||||
Rail=Рейки
|
||||
Powered Rail=Електричні рейки
|
||||
Brake Rail=Гальмівні рейки
|
@ -46,6 +46,7 @@ end
|
||||
dofile(minetest.get_modpath("creative") .. "/inventory.lua")
|
||||
|
||||
if minetest.is_creative_enabled("") then
|
||||
minetest.register_on_mods_loaded(function()
|
||||
-- Dig time is modified according to difference (leveldiff) between tool
|
||||
-- 'maxlevel' and node 'level'. Digtime is divided by the larger of
|
||||
-- leveldiff and 1.
|
||||
@ -74,6 +75,7 @@ if minetest.is_creative_enabled("") then
|
||||
damage_groups = {fleshy = 10},
|
||||
}
|
||||
})
|
||||
end)
|
||||
end
|
||||
|
||||
-- Unlimited node placement
|
||||
|
@ -125,7 +125,7 @@ function creative.update_creative_inventory(player_name, tab_content)
|
||||
end
|
||||
|
||||
-- Create the trash field
|
||||
local trash = minetest.create_detached_inventory("creative_trash", {
|
||||
local trash = minetest.create_detached_inventory("trash", {
|
||||
-- Allow the stack to be placed and remove it in on_put()
|
||||
-- This allows the creative inventory to restore the stack
|
||||
allow_put = function(inv, listname, index, stack, player)
|
||||
@ -150,17 +150,18 @@ function creative.register_tab(name, title, items)
|
||||
creative.update_creative_inventory(player_name, items)
|
||||
local inv = player_inventory[player_name]
|
||||
local pagenum = math.floor(inv.start_i / (4*8) + 1)
|
||||
local pagemax = math.ceil(inv.size / (4*8))
|
||||
local pagemax = math.max(math.ceil(inv.size / (4*8)), 1)
|
||||
local esc = minetest.formspec_escape
|
||||
return sfinv.make_formspec(player, context,
|
||||
(inv.size == 0 and ("label[3,2;"..esc(S("No items to show.")).."]") or "") ..
|
||||
"label[5.8,4.15;" .. minetest.colorize("#FFFF00", tostring(pagenum)) .. " / " .. tostring(pagemax) .. "]" ..
|
||||
[[
|
||||
image[4.08,4.2;0.8,0.8;creative_trash_icon.png]
|
||||
listcolors[#00000069;#5A5A5A;#141318;#30434C;#FFF]
|
||||
list[detached:creative_trash;main;4.02,4.1;1,1;]
|
||||
list[detached:trash;main;4.02,4.1;1,1;]
|
||||
listring[]
|
||||
image_button[5,4.05;0.8,0.8;creative_prev_icon.png;creative_prev;]
|
||||
image_button[7.2,4.05;0.8,0.8;creative_next_icon.png;creative_next;]
|
||||
image_button[7.25,4.05;0.8,0.8;creative_next_icon.png;creative_next;]
|
||||
image_button[2.63,4.05;0.8,0.8;creative_search_icon.png;creative_search;]
|
||||
image_button[3.25,4.05;0.8,0.8;creative_clear_icon.png;creative_clear;]
|
||||
]] ..
|
||||
@ -191,10 +192,13 @@ function creative.register_tab(name, title, items)
|
||||
inv.start_i = 0
|
||||
inv.filter = ""
|
||||
sfinv.set_player_inventory_formspec(player, context)
|
||||
elseif fields.creative_search or
|
||||
fields.key_enter_field == "creative_filter" then
|
||||
elseif (fields.creative_search or
|
||||
fields.key_enter_field == "creative_filter")
|
||||
and fields.creative_filter then
|
||||
inv.start_i = 0
|
||||
inv.filter = fields.creative_filter:lower()
|
||||
inv.filter = fields.creative_filter:sub(1, 128) -- truncate to a sane length
|
||||
:gsub("[%z\1-\8\11-\31\127]", "") -- strip naughty control characters (keeps \t and \n)
|
||||
:lower() -- search is case insensitive
|
||||
sfinv.set_player_inventory_formspec(player, context)
|
||||
elseif not fields.quit then
|
||||
local start_i = inv.start_i or 0
|
||||
|
@ -1,5 +1,6 @@
|
||||
# textdomain: creative
|
||||
Allow player to use creative inventory=Spieler erlauben, das Kreativinventar zu benutzen
|
||||
No items to show.=Keine Gegenstände vorhanden.
|
||||
Search=Suchen
|
||||
Reset=Zurücksetzen
|
||||
Previous page=Vorherige Seite
|
||||
|
11
mods/creative/locale/creative.eo.tr
Normal file
11
mods/creative/locale/creative.eo.tr
Normal file
@ -0,0 +1,11 @@
|
||||
# textdomain: creative
|
||||
Allow player to use creative inventory=Permesi ke la ludanto uzu la kreeman stokon
|
||||
No items to show.=
|
||||
Search=Serĉi
|
||||
Reset=Rekomencigi
|
||||
Previous page=Antaŭa paĝo
|
||||
Next page=Sekva paĝo
|
||||
All=Ĉio
|
||||
Nodes=Nodoj
|
||||
Tools=Iloj
|
||||
Items=Objektoj
|
@ -1,7 +1,8 @@
|
||||
# textdomain: creative
|
||||
Allow player to use creative inventory=Permitir al jugador usar el inventario creativo
|
||||
No items to show.=Sin artículos que mostrar.
|
||||
Search=Buscar
|
||||
Reset=Resetear
|
||||
Reset=Reiniciar
|
||||
Previous page=Pág. siguiente
|
||||
Next page=Pág. anterior
|
||||
All=Todos
|
||||
|
@ -1,5 +1,6 @@
|
||||
# textdomain: creative
|
||||
Allow player to use creative inventory=Permettre aux joueurs d'utiliser l'inventaire du mode créatif
|
||||
No items to show.=
|
||||
Search=Rechercher
|
||||
Reset=Réinitialiser
|
||||
Previous page=Page précédente
|
||||
|
@ -1,5 +1,6 @@
|
||||
# textdomain: creative
|
||||
Allow player to use creative inventory=Bolehkan pemain memakai inventaris kreatif
|
||||
Allow player to use creative inventory=Bolehkan pemain menggunakan inventaris kreatif
|
||||
No items to show.=Tiada barang untuk ditampilkan.
|
||||
Search=Cari
|
||||
Reset=Atur ulang
|
||||
Previous page=Halaman sebelumnya
|
||||
|
@ -1,5 +1,6 @@
|
||||
# textdomain: creative
|
||||
Allow player to use creative inventory=Permette al giocatore di usare l'inventario creativo
|
||||
No items to show.=
|
||||
Search=Cerca
|
||||
Reset=Azzera
|
||||
Previous page=Pagina precedente
|
||||
|
11
mods/creative/locale/creative.ja.tr
Normal file
11
mods/creative/locale/creative.ja.tr
Normal file
@ -0,0 +1,11 @@
|
||||
# textdomain: creative
|
||||
Allow player to use creative inventory=プレーヤーにクリエイティブ インベントリーの使用を許可する
|
||||
No items to show.=
|
||||
Search=検索
|
||||
Reset=リセット
|
||||
Previous page=前のページ
|
||||
Next page=次のページ
|
||||
All=すべて
|
||||
Nodes=ブロック
|
||||
Tools=道具
|
||||
Items=アイテム
|
@ -1,5 +1,6 @@
|
||||
# textdomain: creative
|
||||
Allow player to use creative inventory=zifre le ka pilno le finti ke dacti liste
|
||||
No items to show.=
|
||||
Search=sisku
|
||||
Reset=kraga'igau
|
||||
Previous page=lidne
|
||||
|
@ -1,7 +1,8 @@
|
||||
# textdomain: creative
|
||||
Allow player to use creative inventory=Benarkan pemain menggunakan inventori kreatif
|
||||
No items to show.=Tiada item untuk ditunjukkan.
|
||||
Search=Cari
|
||||
Reset=Set semula
|
||||
Reset=Tetap semula
|
||||
Previous page=Halaman sebelumnya
|
||||
Next page=Halaman seterusnya
|
||||
All=Semua
|
||||
|
11
mods/creative/locale/creative.pl.tr
Normal file
11
mods/creative/locale/creative.pl.tr
Normal file
@ -0,0 +1,11 @@
|
||||
# textdomain: creative
|
||||
Allow player to use creative inventory=Zezwól graczom na używanie kreatywnego ekwipunku
|
||||
No items to show.=
|
||||
Search=Wyszukaj
|
||||
Reset=Zresetuj
|
||||
Previous page=Poprzednia strona
|
||||
Next page=Następna strona
|
||||
All=Wszystko
|
||||
Nodes=Bloki
|
||||
Tools=Narzędzia
|
||||
Items=Przedmioty
|
@ -1,5 +1,6 @@
|
||||
# textdomain: creative
|
||||
Allow player to use creative inventory=Permitir o jogador usar o inventário criativo
|
||||
No items to show.=
|
||||
Search=Pesquisar
|
||||
Reset=Redefinir
|
||||
Previous page=Página anterior
|
||||
|
@ -1,5 +1,6 @@
|
||||
# textdomain: creative
|
||||
Allow player to use creative inventory=Разрешить игроку использовать творческий инвентарь
|
||||
No items to show.=
|
||||
Search=Поиск
|
||||
Reset=Сброс
|
||||
Previous page=Предыдущая страница
|
||||
|
@ -1,10 +0,0 @@
|
||||
# textdomain: creative
|
||||
Allow player to use creative inventory=Tilllåt spelare att används kreativa saker
|
||||
Search=Sök
|
||||
Reset=Återställ
|
||||
Previous page=Förra sidan
|
||||
Next page=Nästa sidan
|
||||
All=Alla
|
||||
Nodes=Noder
|
||||
Tools=Verktyg
|
||||
Items=Saker
|
@ -1,5 +1,6 @@
|
||||
# textdomain: creative
|
||||
Allow player to use creative inventory=Povolí hráčovi použivať kreatívny inventár
|
||||
No items to show.=
|
||||
Search=Hľadaj
|
||||
Reset=Vrátiť späť
|
||||
Previous page=Predchádzajúca stránka
|
||||
|
11
mods/creative/locale/creative.sv.tr
Normal file
11
mods/creative/locale/creative.sv.tr
Normal file
@ -0,0 +1,11 @@
|
||||
# textdomain: creative
|
||||
Allow player to use creative inventory=Tillåt spelare att använda kreativa saker
|
||||
No items to show.=
|
||||
Search=Sök
|
||||
Reset=Återställ
|
||||
Previous page=Förra sida
|
||||
Next page=Nästa sida
|
||||
All=Alla
|
||||
Nodes=Noder
|
||||
Tools=Verktyg
|
||||
Items=Saker
|
11
mods/creative/locale/creative.uk.tr
Normal file
11
mods/creative/locale/creative.uk.tr
Normal file
@ -0,0 +1,11 @@
|
||||
# textdomain: creative
|
||||
Allow player to use creative inventory=Дозволити гравцю використовувати творчий інвентар
|
||||
No items to show.=Немає результатів.
|
||||
Search=Пошук
|
||||
Reset=Скинути
|
||||
Previous page=Попередня сторінка
|
||||
Next page=Наступна сторінка
|
||||
All=Все
|
||||
Nodes=Ноди
|
||||
Tools=Інструменти
|
||||
Items=Предмети
|
@ -1,5 +1,6 @@
|
||||
# textdomain: creative
|
||||
Allow player to use creative inventory=允许玩家使用创造模式物品栏
|
||||
No items to show.=
|
||||
Search=搜索
|
||||
Reset=重置
|
||||
Previous page=上一页
|
||||
|
@ -1,5 +1,6 @@
|
||||
# textdomain: creative
|
||||
Allow player to use creative inventory=允許玩家使用創造模式物品欄
|
||||
No items to show.=
|
||||
Search=搜索
|
||||
Reset=重置
|
||||
Previous page=上一頁
|
||||
|
@ -1,5 +1,6 @@
|
||||
# textdomain: creative
|
||||
Allow player to use creative inventory=
|
||||
No items to show.=
|
||||
Search=
|
||||
Reset=
|
||||
Previous page=
|
||||
|
@ -1,3 +1,3 @@
|
||||
name = creative
|
||||
description = Minetest Game mod: creative
|
||||
depends = default, sfinv
|
||||
depends = sfinv
|
||||
|
@ -178,7 +178,7 @@ Gambit (CC BY-SA 3.0):
|
||||
default_iron_lump.png
|
||||
default_gold_lump.png
|
||||
default_clay_lump.png
|
||||
default_coal.png
|
||||
default_coal_lump.png
|
||||
default_grass_*.png
|
||||
default_paper.png
|
||||
default_diamond_block.png
|
||||
@ -188,8 +188,6 @@ Gambit (CC BY-SA 3.0):
|
||||
default_snow.png
|
||||
default_snow_side.png
|
||||
default_snowball.png
|
||||
default_key.png
|
||||
default_key_skeleton.png
|
||||
default_book.png
|
||||
|
||||
asl97 (CC BY-SA 3.0):
|
||||
@ -299,7 +297,6 @@ https://www.freesound.org/people/AGFX/packs/1253/
|
||||
default_water_footstep.1.ogg
|
||||
default_water_footstep.2.ogg
|
||||
default_water_footstep.3.ogg
|
||||
(default_water_footstep.4.ogg is silent)
|
||||
|
||||
blukotek (CC0 1.0):
|
||||
https://www.freesound.org/people/blukotek/sounds/251660/
|
||||
|
@ -38,34 +38,44 @@ function default.chest.chest_lid_close(pn)
|
||||
|
||||
default.chest.open_chests[pn] = nil
|
||||
for k, v in pairs(default.chest.open_chests) do
|
||||
if v.pos.x == pos.x and v.pos.y == pos.y and v.pos.z == pos.z then
|
||||
if vector.equals(v.pos, pos) then
|
||||
-- another player is also looking at the chest
|
||||
return true
|
||||
end
|
||||
end
|
||||
|
||||
local node = minetest.get_node(pos)
|
||||
minetest.after(0.2, minetest.swap_node, pos, { name = swap,
|
||||
param2 = node.param2 })
|
||||
minetest.after(0.2, function()
|
||||
local current_node = minetest.get_node(pos)
|
||||
if current_node.name ~= swap .. "_open" then
|
||||
-- the chest has already been replaced, don't try to replace what's there.
|
||||
return
|
||||
end
|
||||
minetest.swap_node(pos, {name = swap, param2 = node.param2})
|
||||
minetest.sound_play(sound, {gain = 0.3, pos = pos,
|
||||
max_hear_distance = 10}, true)
|
||||
end)
|
||||
end
|
||||
|
||||
default.chest.open_chests = {}
|
||||
|
||||
minetest.register_on_player_receive_fields(function(player, formname, fields)
|
||||
if formname ~= "default:chest" then
|
||||
return
|
||||
end
|
||||
if not player or not fields.quit then
|
||||
return
|
||||
end
|
||||
local pn = player:get_player_name()
|
||||
|
||||
if not default.chest.open_chests[pn] then
|
||||
if formname ~= "default:chest" then
|
||||
if default.chest.open_chests[pn] then
|
||||
default.chest.chest_lid_close(pn)
|
||||
end
|
||||
|
||||
return
|
||||
end
|
||||
|
||||
if not (fields.quit and default.chest.open_chests[pn]) then
|
||||
return
|
||||
end
|
||||
|
||||
default.chest.chest_lid_close(pn)
|
||||
|
||||
return true
|
||||
end)
|
||||
|
||||
@ -129,6 +139,12 @@ function default.chest.register_chest(prefixed_name, d)
|
||||
return itemstack
|
||||
end
|
||||
|
||||
local cn = clicker:get_player_name()
|
||||
|
||||
if default.chest.open_chests[cn] then
|
||||
default.chest.chest_lid_close(cn)
|
||||
end
|
||||
|
||||
minetest.sound_play(def.sound_open, {gain = 0.3,
|
||||
pos = pos, max_hear_distance = 10}, true)
|
||||
if not default.chest.chest_lid_obstructed(pos) then
|
||||
@ -136,10 +152,9 @@ function default.chest.register_chest(prefixed_name, d)
|
||||
{ name = name .. "_open",
|
||||
param2 = node.param2 })
|
||||
end
|
||||
minetest.after(0.2, minetest.show_formspec,
|
||||
clicker:get_player_name(),
|
||||
minetest.after(0.2, minetest.show_formspec, cn,
|
||||
"default:chest", default.chest.get_chest_formspec(pos))
|
||||
default.chest.open_chests[clicker:get_player_name()] = { pos = pos,
|
||||
default.chest.open_chests[cn] = { pos = pos,
|
||||
sound = def.sound_close, swap = name }
|
||||
end
|
||||
def.on_blast = function() end
|
||||
@ -200,6 +215,12 @@ function default.chest.register_chest(prefixed_name, d)
|
||||
return inv:is_empty("main")
|
||||
end
|
||||
def.on_rightclick = function(pos, node, clicker)
|
||||
local cn = clicker:get_player_name()
|
||||
|
||||
if default.chest.open_chests[cn] then
|
||||
default.chest.chest_lid_close(cn)
|
||||
end
|
||||
|
||||
minetest.sound_play(def.sound_open, {gain = 0.3, pos = pos,
|
||||
max_hear_distance = 10}, true)
|
||||
if not default.chest.chest_lid_obstructed(pos) then
|
||||
@ -208,9 +229,9 @@ function default.chest.register_chest(prefixed_name, d)
|
||||
param2 = node.param2 })
|
||||
end
|
||||
minetest.after(0.2, minetest.show_formspec,
|
||||
clicker:get_player_name(),
|
||||
cn,
|
||||
"default:chest", default.chest.get_chest_formspec(pos))
|
||||
default.chest.open_chests[clicker:get_player_name()] = { pos = pos,
|
||||
default.chest.open_chests[cn] = { pos = pos,
|
||||
sound = def.sound_close, swap = name }
|
||||
end
|
||||
def.on_blast = function(pos)
|
||||
@ -222,21 +243,7 @@ function default.chest.register_chest(prefixed_name, d)
|
||||
end
|
||||
end
|
||||
|
||||
def.on_metadata_inventory_move = function(pos, from_list, from_index,
|
||||
to_list, to_index, count, player)
|
||||
minetest.log("action", player:get_player_name() ..
|
||||
" moves stuff in chest at " .. minetest.pos_to_string(pos))
|
||||
end
|
||||
def.on_metadata_inventory_put = function(pos, listname, index, stack, player)
|
||||
minetest.log("action", player:get_player_name() ..
|
||||
" moves " .. stack:get_name() ..
|
||||
" to chest at " .. minetest.pos_to_string(pos))
|
||||
end
|
||||
def.on_metadata_inventory_take = function(pos, listname, index, stack, player)
|
||||
minetest.log("action", player:get_player_name() ..
|
||||
" takes " .. stack:get_name() ..
|
||||
" from chest at " .. minetest.pos_to_string(pos))
|
||||
end
|
||||
default.set_inventory_action_loggers(def, "chest")
|
||||
|
||||
local def_opened = table.copy(def)
|
||||
local def_closed = table.copy(def)
|
||||
@ -288,6 +295,18 @@ function default.chest.register_chest(prefixed_name, d)
|
||||
end
|
||||
})
|
||||
end
|
||||
|
||||
-- close opened chests on load
|
||||
minetest.register_lbm({
|
||||
label = "close opened chests on load",
|
||||
name = "default:close_" .. prefixed_name:gsub(":", "_") .. "_open",
|
||||
nodenames = {prefixed_name .. "_open"},
|
||||
run_at_every_load = true,
|
||||
action = function(pos, node)
|
||||
node.name = prefixed_name
|
||||
minetest.swap_node(pos, node)
|
||||
end
|
||||
})
|
||||
end
|
||||
|
||||
default.chest.register_chest("default:chest", {
|
||||
|
@ -3,6 +3,52 @@
|
||||
-- support for MT game translation.
|
||||
local S = default.get_translator
|
||||
|
||||
local esc = minetest.formspec_escape
|
||||
local formspec_size = "size[8,8]"
|
||||
|
||||
local function formspec_core(tab)
|
||||
if tab == nil then tab = 1 else tab = tostring(tab) end
|
||||
return "tabheader[0,0;book_header;" ..
|
||||
esc(S("Write")) .. "," ..
|
||||
esc(S("Read")) .. ";" ..
|
||||
tab .. ";false;false]"
|
||||
end
|
||||
|
||||
local function formspec_write(title, text)
|
||||
return "field[0.5,1;7.5,0;title;" .. esc(S("Title:")) .. ";" ..
|
||||
esc(title) .. "]" ..
|
||||
"textarea[0.5,1.5;7.5,7;text;" .. esc(S("Contents:")) .. ";" ..
|
||||
esc(text) .. "]" ..
|
||||
"button_exit[2.5,7.5;3,1;save;" .. esc(S("Save")) .. "]"
|
||||
end
|
||||
|
||||
local function formspec_read(owner, title, string, text, page, page_max)
|
||||
return "label[0.5,0.5;" .. esc(S("by @1", owner)) .. "]" ..
|
||||
"tablecolumns[color;text]" ..
|
||||
"tableoptions[background=#00000000;highlight=#00000000;border=false]" ..
|
||||
"table[0.4,0;7,0.5;title;#FFFF00," .. esc(title) .. "]" ..
|
||||
"textarea[0.5,1.5;7.5,7;;" ..
|
||||
esc(string ~= "" and string or text) .. ";]" ..
|
||||
"button[2.4,7.6;0.8,0.8;book_prev;<]" ..
|
||||
"label[3.2,7.7;" .. esc(S("Page @1 of @2", page, page_max)) .. "]" ..
|
||||
"button[4.9,7.6;0.8,0.8;book_next;>]"
|
||||
end
|
||||
|
||||
local function formspec_string(lpp, page, lines, string)
|
||||
for i = ((lpp * page) - lpp) + 1, lpp * page do
|
||||
if not lines[i] then break end
|
||||
string = string .. lines[i] .. "\n"
|
||||
end
|
||||
return string
|
||||
end
|
||||
|
||||
local book_writers = {}
|
||||
|
||||
minetest.register_on_leaveplayer(function(player)
|
||||
book_writers[player:get_player_name()] = nil
|
||||
end)
|
||||
|
||||
local tab_number
|
||||
local lpp = 14 -- Lines per book's page
|
||||
local function book_on_use(itemstack, user)
|
||||
local player_name = user:get_player_name()
|
||||
@ -19,8 +65,8 @@ local function book_on_use(itemstack, user)
|
||||
local data = meta:to_table().fields
|
||||
|
||||
if data.owner then
|
||||
title = data.title
|
||||
text = data.text
|
||||
title = data.title or ""
|
||||
text = data.text or ""
|
||||
owner = data.owner
|
||||
|
||||
for str in (text .. "\n"):gmatch("([^\n]*)[\n]") do
|
||||
@ -30,37 +76,28 @@ local function book_on_use(itemstack, user)
|
||||
if data.page then
|
||||
page = data.page
|
||||
page_max = data.page_max
|
||||
|
||||
for i = ((lpp * page) - lpp) + 1, lpp * page do
|
||||
if not lines[i] then break end
|
||||
string = string .. lines[i] .. "\n"
|
||||
end
|
||||
string = formspec_string(lpp, page, lines, string)
|
||||
end
|
||||
end
|
||||
|
||||
local formspec
|
||||
local esc = minetest.formspec_escape
|
||||
if owner == player_name then
|
||||
formspec = "size[8,8]" ..
|
||||
"field[0.5,1;7.5,0;title;" .. esc(S("Title:")) .. ";" ..
|
||||
esc(title) .. "]" ..
|
||||
"textarea[0.5,1.5;7.5,7;text;" .. esc(S("Contents:")) .. ";" ..
|
||||
esc(text) .. "]" ..
|
||||
"button_exit[2.5,7.5;3,1;save;" .. esc(S("Save")) .. "]"
|
||||
if title == "" and text == "" then
|
||||
formspec = formspec_write(title, text)
|
||||
elseif owner == player_name then
|
||||
local tab = tab_number or 1
|
||||
if tab == 2 then
|
||||
formspec = formspec_core(tab) ..
|
||||
formspec_read(owner, title, string, text, page, page_max)
|
||||
else
|
||||
formspec = "size[8,8]" ..
|
||||
"label[0.5,0.5;" .. esc(S("by @1", owner)) .. "]" ..
|
||||
"tablecolumns[color;text]" ..
|
||||
"tableoptions[background=#00000000;highlight=#00000000;border=false]" ..
|
||||
"table[0.4,0;7,0.5;title;#FFFF00," .. esc(title) .. "]" ..
|
||||
"textarea[0.5,1.5;7.5,7;;" ..
|
||||
minetest.formspec_escape(string ~= "" and string or text) .. ";]" ..
|
||||
"button[2.4,7.6;0.8,0.8;book_prev;<]" ..
|
||||
"label[3.2,7.7;" .. esc(S("Page @1 of @2", page, page_max)) .. "]" ..
|
||||
"button[4.9,7.6;0.8,0.8;book_next;>]"
|
||||
formspec = formspec_core(tab) .. formspec_write(title, text)
|
||||
end
|
||||
else
|
||||
formspec = formspec_read(owner, title, string, text, page, page_max)
|
||||
end
|
||||
|
||||
minetest.show_formspec(player_name, "default:book", formspec)
|
||||
minetest.show_formspec(player_name, "default:book", formspec_size .. formspec)
|
||||
-- Store the wield index in case the user accidentally switches before the formspec is shown
|
||||
book_writers[player_name] = {wield_index = user:get_wield_index()}
|
||||
return itemstack
|
||||
end
|
||||
|
||||
@ -68,14 +105,56 @@ local max_text_size = 10000
|
||||
local max_title_size = 80
|
||||
local short_title_size = 35
|
||||
minetest.register_on_player_receive_fields(function(player, formname, fields)
|
||||
if formname ~= "default:book" then return end
|
||||
if formname ~= "default:book" then
|
||||
return
|
||||
end
|
||||
local player_name = player:get_player_name()
|
||||
local inv = player:get_inventory()
|
||||
local stack = player:get_wielded_item()
|
||||
if not book_writers[player_name] then
|
||||
return
|
||||
end
|
||||
local wield_index = book_writers[player_name].wield_index
|
||||
local wield_list = player:get_wield_list()
|
||||
local stack = inv:get_stack(wield_list, wield_index)
|
||||
local written = stack:get_name() == "default:book_written"
|
||||
if stack:get_name() ~= "default:book" and not written then
|
||||
-- No book in the wield slot, abort & inform the player
|
||||
minetest.chat_send_player(player_name, S("The book you were writing to mysteriously disappeared."))
|
||||
return
|
||||
end
|
||||
local data = stack:get_meta():to_table().fields
|
||||
|
||||
if fields.save and fields.title and fields.text
|
||||
and fields.title ~= "" and fields.text ~= "" then
|
||||
local new_stack, data
|
||||
if stack:get_name() ~= "default:book_written" then
|
||||
local title = data.title or ""
|
||||
local text = data.text or ""
|
||||
|
||||
if fields.book_header ~= nil and data.owner == player_name then
|
||||
local contents
|
||||
local tab = tonumber(fields.book_header)
|
||||
if tab == 1 then
|
||||
contents = formspec_core(tab) ..
|
||||
formspec_write(title, text)
|
||||
elseif tab == 2 then
|
||||
local lines, string = {}, ""
|
||||
for str in (text .. "\n"):gmatch("([^\n]*)[\n]") do
|
||||
lines[#lines+1] = str
|
||||
end
|
||||
string = formspec_string(lpp, data.page, lines, string)
|
||||
contents = formspec_read(player_name, title, string,
|
||||
text, data.page, data.page_max)
|
||||
end
|
||||
tab_number = tab
|
||||
local formspec = formspec_size .. formspec_core(tab) .. contents
|
||||
minetest.show_formspec(player_name, "default:book", formspec)
|
||||
return
|
||||
end
|
||||
|
||||
if fields.quit then
|
||||
book_writers[player_name] = nil
|
||||
end
|
||||
|
||||
if fields.save and fields.title and fields.text then
|
||||
local new_stack
|
||||
if not written then
|
||||
local count = stack:get_count()
|
||||
if count == 1 then
|
||||
stack:set_name("default:book_written")
|
||||
@ -83,11 +162,9 @@ minetest.register_on_player_receive_fields(function(player, formname, fields)
|
||||
stack:set_count(count - 1)
|
||||
new_stack = ItemStack("default:book_written")
|
||||
end
|
||||
else
|
||||
data = stack:get_meta():to_table().fields
|
||||
end
|
||||
|
||||
if data and data.owner and data.owner ~= player:get_player_name() then
|
||||
if data.owner ~= player_name and title ~= "" and text ~= "" then
|
||||
return
|
||||
end
|
||||
|
||||
@ -102,6 +179,7 @@ minetest.register_on_player_receive_fields(function(player, formname, fields)
|
||||
data.description = S("\"@1\" by @2", short_title, data.owner)
|
||||
data.text = fields.text:sub(1, max_text_size)
|
||||
data.text = data.text:gsub("\r\n", "\n"):gsub("\r", "\n")
|
||||
data.text = data.text:gsub("[%z\1-\8\11-\31\127]", "") -- strip naughty control characters (keeps \t and \n)
|
||||
data.page = 1
|
||||
data.page_max = math.ceil((#data.text:gsub("[^\n]", "") + 1) / lpp)
|
||||
|
||||
@ -117,8 +195,7 @@ minetest.register_on_player_receive_fields(function(player, formname, fields)
|
||||
end
|
||||
|
||||
elseif fields.book_next or fields.book_prev then
|
||||
local data = stack:get_meta():to_table().fields
|
||||
if not data or not data.page then
|
||||
if not data.page then
|
||||
return
|
||||
end
|
||||
|
||||
@ -142,64 +219,9 @@ minetest.register_on_player_receive_fields(function(player, formname, fields)
|
||||
end
|
||||
|
||||
-- Update stack
|
||||
player:set_wielded_item(stack)
|
||||
inv:set_stack(wield_list, wield_index, stack)
|
||||
end)
|
||||
|
||||
minetest.register_craftitem("default:skeleton_key", {
|
||||
description = S("Skeleton Key"),
|
||||
inventory_image = "default_key_skeleton.png",
|
||||
on_use = function(itemstack, user, pointed_thing)
|
||||
if pointed_thing.type ~= "node" then
|
||||
return itemstack
|
||||
end
|
||||
|
||||
local pos = pointed_thing.under
|
||||
local node = minetest.get_node(pos)
|
||||
|
||||
if not node then
|
||||
return itemstack
|
||||
end
|
||||
|
||||
local node_reg = minetest.registered_nodes[node.name]
|
||||
local on_skeleton_key_use = node_reg and node_reg.on_skeleton_key_use
|
||||
if not on_skeleton_key_use then
|
||||
return itemstack
|
||||
end
|
||||
|
||||
-- make a new key secret in case the node callback needs it
|
||||
local random = math.random
|
||||
local newsecret = string.format(
|
||||
"%04x%04x%04x%04x",
|
||||
random(2^16) - 1, random(2^16) - 1,
|
||||
random(2^16) - 1, random(2^16) - 1)
|
||||
|
||||
local secret, _, _ = on_skeleton_key_use(pos, user, newsecret)
|
||||
|
||||
if secret then
|
||||
local inv = minetest.get_inventory({type="player", name=user:get_player_name()})
|
||||
|
||||
-- update original itemstack
|
||||
itemstack:take_item()
|
||||
|
||||
-- finish and return the new key
|
||||
local new_stack = ItemStack("default:key")
|
||||
local meta = new_stack:get_meta()
|
||||
meta:set_string("secret", secret)
|
||||
meta:set_string("description", S("Key to @1's @2", user:get_player_name(),
|
||||
minetest.registered_nodes[node.name].description))
|
||||
|
||||
if itemstack:get_count() == 0 then
|
||||
itemstack = new_stack
|
||||
else
|
||||
if inv:add_item("main", new_stack):get_count() > 0 then
|
||||
minetest.add_item(user:get_pos(), new_stack)
|
||||
end -- else: added to inventory successfully
|
||||
end
|
||||
|
||||
return itemstack
|
||||
end
|
||||
end
|
||||
})
|
||||
|
||||
--
|
||||
-- Craftitem registry
|
||||
@ -428,13 +450,6 @@ minetest.register_craft({
|
||||
}
|
||||
})
|
||||
|
||||
minetest.register_craft({
|
||||
output = "default:skeleton_key",
|
||||
recipe = {
|
||||
{"default:gold_ingot"},
|
||||
}
|
||||
})
|
||||
|
||||
minetest.register_craft({
|
||||
output = "default:steel_ingot 9",
|
||||
recipe = {
|
||||
@ -478,19 +493,6 @@ minetest.register_craft({
|
||||
recipe = "default:gold_lump",
|
||||
})
|
||||
|
||||
minetest.register_craft({
|
||||
type = "cooking",
|
||||
output = "default:gold_ingot",
|
||||
recipe = "default:key",
|
||||
cooktime = 5,
|
||||
})
|
||||
|
||||
minetest.register_craft({
|
||||
type = "cooking",
|
||||
output = "default:gold_ingot",
|
||||
recipe = "default:skeleton_key",
|
||||
cooktime = 5,
|
||||
})
|
||||
|
||||
minetest.register_craft({
|
||||
type = "cooking",
|
||||
|
@ -16,7 +16,7 @@ end
|
||||
function default.node_sound_stone_defaults(table)
|
||||
table = table or {}
|
||||
table.footstep = table.footstep or
|
||||
{name = "default_hard_footstep", gain = 0.3}
|
||||
{name = "default_hard_footstep", gain = 0.2}
|
||||
table.dug = table.dug or
|
||||
{name = "default_hard_footstep", gain = 1.0}
|
||||
default.node_sound_defaults(table)
|
||||
@ -26,7 +26,9 @@ end
|
||||
function default.node_sound_dirt_defaults(table)
|
||||
table = table or {}
|
||||
table.footstep = table.footstep or
|
||||
{name = "default_dirt_footstep", gain = 0.4}
|
||||
{name = "default_dirt_footstep", gain = 0.25}
|
||||
table.dig = table.dig or
|
||||
{name = "default_dig_crumbly", gain = 0.4}
|
||||
table.dug = table.dug or
|
||||
{name = "default_dirt_footstep", gain = 1.0}
|
||||
table.place = table.place or
|
||||
@ -50,7 +52,7 @@ end
|
||||
function default.node_sound_gravel_defaults(table)
|
||||
table = table or {}
|
||||
table.footstep = table.footstep or
|
||||
{name = "default_gravel_footstep", gain = 0.1}
|
||||
{name = "default_gravel_footstep", gain = 0.25}
|
||||
table.dig = table.dig or
|
||||
{name = "default_gravel_dig", gain = 0.35}
|
||||
table.dug = table.dug or
|
||||
@ -64,7 +66,9 @@ end
|
||||
function default.node_sound_wood_defaults(table)
|
||||
table = table or {}
|
||||
table.footstep = table.footstep or
|
||||
{name = "default_wood_footstep", gain = 0.3}
|
||||
{name = "default_wood_footstep", gain = 0.15}
|
||||
table.dig = table.dig or
|
||||
{name = "default_dig_choppy", gain = 0.4}
|
||||
table.dug = table.dug or
|
||||
{name = "default_wood_footstep", gain = 1.0}
|
||||
default.node_sound_defaults(table)
|
||||
@ -98,7 +102,7 @@ end
|
||||
function default.node_sound_ice_defaults(table)
|
||||
table = table or {}
|
||||
table.footstep = table.footstep or
|
||||
{name = "default_ice_footstep", gain = 0.3}
|
||||
{name = "default_ice_footstep", gain = 0.15}
|
||||
table.dig = table.dig or
|
||||
{name = "default_ice_dig", gain = 0.5}
|
||||
table.dug = table.dug or
|
||||
@ -110,7 +114,7 @@ end
|
||||
function default.node_sound_metal_defaults(table)
|
||||
table = table or {}
|
||||
table.footstep = table.footstep or
|
||||
{name = "default_metal_footstep", gain = 0.4}
|
||||
{name = "default_metal_footstep", gain = 0.2}
|
||||
table.dig = table.dig or
|
||||
{name = "default_dig_metal", gain = 0.5}
|
||||
table.dug = table.dug or
|
||||
@ -155,7 +159,7 @@ default.cool_lava = function(pos, node)
|
||||
minetest.set_node(pos, {name = "default:stone"})
|
||||
end
|
||||
minetest.sound_play("default_cool_lava",
|
||||
{pos = pos, max_hear_distance = 16, gain = 0.25}, true)
|
||||
{pos = pos, max_hear_distance = 16, gain = 0.2}, true)
|
||||
end
|
||||
|
||||
if minetest.settings:get_bool("enable_lavacooling") ~= false then
|
||||
@ -711,6 +715,54 @@ function default.register_craft_metadata_copy(ingredient, result)
|
||||
end)
|
||||
end
|
||||
|
||||
--
|
||||
-- Log API / helpers
|
||||
--
|
||||
|
||||
local log_non_player_actions = minetest.settings:get_bool("log_non_player_actions", false)
|
||||
|
||||
local is_pos = function(v)
|
||||
return type(v) == "table" and
|
||||
type(v.x) == "number" and type(v.y) == "number" and type(v.z) == "number"
|
||||
end
|
||||
|
||||
function default.log_player_action(player, ...)
|
||||
local msg = player:get_player_name()
|
||||
if player.is_fake_player or not player:is_player() then
|
||||
if not log_non_player_actions then
|
||||
return
|
||||
end
|
||||
msg = msg .. "(" .. (type(player.is_fake_player) == "string"
|
||||
and player.is_fake_player or "*") .. ")"
|
||||
end
|
||||
for _, v in ipairs({...}) do
|
||||
-- translate pos
|
||||
local part = is_pos(v) and minetest.pos_to_string(v) or v
|
||||
-- no leading spaces before punctuation marks
|
||||
msg = msg .. (string.match(part, "^[;,.]") and "" or " ") .. part
|
||||
end
|
||||
minetest.log("action", msg)
|
||||
end
|
||||
|
||||
local nop = function() end
|
||||
function default.set_inventory_action_loggers(def, name)
|
||||
local on_move = def.on_metadata_inventory_move or nop
|
||||
def.on_metadata_inventory_move = function(pos, from_list, from_index,
|
||||
to_list, to_index, count, player)
|
||||
default.log_player_action(player, "moves stuff in", name, "at", pos)
|
||||
return on_move(pos, from_list, from_index, to_list, to_index, count, player)
|
||||
end
|
||||
local on_put = def.on_metadata_inventory_put or nop
|
||||
def.on_metadata_inventory_put = function(pos, listname, index, stack, player)
|
||||
default.log_player_action(player, "moves", stack:get_name(), stack:get_count(), "to", name, "at", pos)
|
||||
return on_put(pos, listname, index, stack, player)
|
||||
end
|
||||
local on_take = def.on_metadata_inventory_take or nop
|
||||
def.on_metadata_inventory_take = function(pos, listname, index, stack, player)
|
||||
default.log_player_action(player, "takes", stack:get_name(), stack:get_count(), "from", name, "at", pos)
|
||||
return on_take(pos, listname, index, stack, player)
|
||||
end
|
||||
end
|
||||
|
||||
--
|
||||
-- NOTICE: This method is not an official part of the API yet.
|
||||
|
@ -3,6 +3,9 @@
|
||||
-- support for MT game translation.
|
||||
local S = default.get_translator
|
||||
|
||||
-- List of sound handles for active furnace
|
||||
local furnace_fire_sounds = {}
|
||||
|
||||
--
|
||||
-- Formspecs
|
||||
--
|
||||
@ -91,6 +94,17 @@ local function allow_metadata_inventory_take(pos, listname, index, stack, player
|
||||
return stack:get_count()
|
||||
end
|
||||
|
||||
local function stop_furnace_sound(pos, fadeout_step)
|
||||
local hash = minetest.hash_node_position(pos)
|
||||
local sound_ids = furnace_fire_sounds[hash]
|
||||
if sound_ids then
|
||||
for _, sound_id in ipairs(sound_ids) do
|
||||
minetest.sound_fade(sound_id, -1, 0)
|
||||
end
|
||||
furnace_fire_sounds[hash] = nil
|
||||
end
|
||||
end
|
||||
|
||||
local function swap_node(pos, name)
|
||||
local node = minetest.get_node(pos)
|
||||
if node.name == name then
|
||||
@ -159,7 +173,7 @@ local function furnace_node_timer(pos, elapsed)
|
||||
end
|
||||
-- Play cooling sound
|
||||
minetest.sound_play("default_cool_lava",
|
||||
{pos = pos, max_hear_distance = 16, gain = 0.1}, true)
|
||||
{pos = pos, max_hear_distance = 16, gain = 0.07}, true)
|
||||
else
|
||||
-- Item could not be cooked: probably missing fuel
|
||||
update = true
|
||||
@ -176,9 +190,16 @@ local function furnace_node_timer(pos, elapsed)
|
||||
-- No valid fuel in fuel list
|
||||
fuel_totaltime = 0
|
||||
src_time = 0
|
||||
else
|
||||
-- prevent blocking of fuel inventory (for automatization mods)
|
||||
local is_fuel = minetest.get_craft_result({method = "fuel", width = 1, items = {afterfuel.items[1]:to_string()}})
|
||||
if is_fuel.time == 0 then
|
||||
table.insert(fuel.replacements, afterfuel.items[1])
|
||||
inv:set_stack("fuel", 1, "")
|
||||
else
|
||||
-- Take fuel from fuel list
|
||||
inv:set_stack("fuel", 1, afterfuel.items[1])
|
||||
end
|
||||
-- Put replacements in dst list or drop them on the furnace.
|
||||
local replacements = fuel.replacements
|
||||
if replacements[1] then
|
||||
@ -245,9 +266,30 @@ local function furnace_node_timer(pos, elapsed)
|
||||
result = true
|
||||
|
||||
-- Play sound every 5 seconds while the furnace is active
|
||||
if timer_elapsed == 0 or (timer_elapsed+1) % 5 == 0 then
|
||||
minetest.sound_play("default_furnace_active",
|
||||
{pos = pos, max_hear_distance = 16, gain = 0.5}, true)
|
||||
if timer_elapsed == 0 or (timer_elapsed + 1) % 5 == 0 then
|
||||
local sound_id = minetest.sound_play("default_furnace_active",
|
||||
{pos = pos, max_hear_distance = 16, gain = 0.25})
|
||||
local hash = minetest.hash_node_position(pos)
|
||||
furnace_fire_sounds[hash] = furnace_fire_sounds[hash] or {}
|
||||
table.insert(furnace_fire_sounds[hash], sound_id)
|
||||
-- Only remember the 3 last sound handles
|
||||
if #furnace_fire_sounds[hash] > 3 then
|
||||
table.remove(furnace_fire_sounds[hash], 1)
|
||||
end
|
||||
-- Remove the sound ID automatically from table after 11 seconds
|
||||
minetest.after(11, function()
|
||||
if not furnace_fire_sounds[hash] then
|
||||
return
|
||||
end
|
||||
for f=#furnace_fire_sounds[hash], 1, -1 do
|
||||
if furnace_fire_sounds[hash][f] == sound_id then
|
||||
table.remove(furnace_fire_sounds[hash], f)
|
||||
end
|
||||
end
|
||||
if #furnace_fire_sounds[hash] == 0 then
|
||||
furnace_fire_sounds[hash] = nil
|
||||
end
|
||||
end)
|
||||
end
|
||||
else
|
||||
if fuellist and not fuellist[1]:is_empty() then
|
||||
@ -258,6 +300,8 @@ local function furnace_node_timer(pos, elapsed)
|
||||
-- stop timer on the inactive furnace
|
||||
minetest.get_node_timer(pos):stop()
|
||||
meta:set_int("timer_elapsed", 0)
|
||||
|
||||
stop_furnace_sound(pos)
|
||||
end
|
||||
|
||||
|
||||
@ -362,6 +406,9 @@ minetest.register_node("default:furnace_active", {
|
||||
is_ground_content = false,
|
||||
sounds = default.node_sound_stone_defaults(),
|
||||
on_timer = furnace_node_timer,
|
||||
on_destruct = function(pos)
|
||||
stop_furnace_sound(pos)
|
||||
end,
|
||||
|
||||
can_dig = can_dig,
|
||||
|
||||
|
@ -12,6 +12,17 @@ default = {}
|
||||
default.LIGHT_MAX = 14
|
||||
default.get_translator = S
|
||||
|
||||
-- Check for engine features required by MTG
|
||||
-- This provides clear error behaviour when MTG is newer than the installed engine
|
||||
-- and avoids obscure, hard to debug runtime errors.
|
||||
-- This section should be updated before release and older checks can be dropped
|
||||
-- when newer ones are introduced.
|
||||
if ItemStack("").add_wear_by_uses == nil then
|
||||
error("\nThis version of Minetest Game is incompatible with your engine version "..
|
||||
"(which is too old). You should download a version of Minetest Game that "..
|
||||
"matches the installed engine version.\n")
|
||||
end
|
||||
|
||||
-- GUI related stuff
|
||||
minetest.register_on_joinplayer(function(player)
|
||||
-- Set formspec prepend
|
||||
|
@ -19,6 +19,7 @@ local item = {
|
||||
self.object:remove()
|
||||
minetest.sound_play("default_item_smoke", {
|
||||
pos = p,
|
||||
gain = 1.0,
|
||||
max_hear_distance = 8,
|
||||
}, true)
|
||||
minetest.add_particlespawner({
|
||||
|
@ -19,7 +19,7 @@ Licenses of media (textures, models and sounds)
|
||||
-----------------------------------------------
|
||||
|
||||
Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0)
|
||||
Copyright (C) 2010-2018:
|
||||
Copyright (C) 2010-2023:
|
||||
|
||||
celeron55, Perttu Ahola <celeron55@gmail.com>
|
||||
Cisoun
|
||||
@ -52,6 +52,7 @@ Copyright (C) 2010-2018:
|
||||
random-geek
|
||||
Extex101
|
||||
An0n3m0us
|
||||
Lopano
|
||||
|
||||
You are free to:
|
||||
Share — copy and redistribute the material in any medium or format.
|
||||
|
@ -4,14 +4,15 @@ Locked Chest (owned by @1)=Abgeschlossene Truhe (Eigentum von @1)
|
||||
You do not own this chest.=Ihnen gehört diese Truhe nicht.
|
||||
a locked chest=eine abgeschlossene Truhe
|
||||
Chest=Truhe
|
||||
Write=Schreiben
|
||||
Read=Lesen
|
||||
Title:=Titel:
|
||||
Contents:=Inhalt:
|
||||
Save=Speichern
|
||||
by @1=von @1
|
||||
Page @1 of @2=Seite @1 von @2
|
||||
The book you were writing to mysteriously disappeared.=Das Buch, an dem Sie geschrieben haben, ist auf mysteriöse Weise verschwunden.
|
||||
"@1" by @2=„@1“ von @2
|
||||
Skeleton Key=Skelettschlüssel
|
||||
Key to @1's @2=Schlüssel für @2 von @1
|
||||
Blueberries=Blaubeeren
|
||||
Book=Buch
|
||||
Book with Text=Buch mit Text
|
||||
@ -107,7 +108,7 @@ Acacia Tree Sapling=Akazienbaumsetzling
|
||||
Aspen Tree=Espenbaum
|
||||
Aspen Wood Planks=Espenholzplanken
|
||||
Aspen Tree Leaves=Espenbaumblätter
|
||||
Aspen Tree Sapling=Esepenbaumsetzling
|
||||
Aspen Tree Sapling=Espenbaumsetzling
|
||||
Coal Ore=Kohleerz
|
||||
Coal Block=Kohleblock
|
||||
Iron Ore=Eisenerz
|
||||
@ -210,7 +211,6 @@ Bronze Sword=Bronzeschwert
|
||||
Steel Sword=Stahlschwert
|
||||
Mese Sword=Meseschwert
|
||||
Diamond Sword=Diamantschwert
|
||||
Key=Schlüssel
|
||||
Torch=Fackel
|
||||
@1 will intersect protection on growth.=@1 wird bei Wachstum mit geschützter Zone überlappen.
|
||||
|
||||
|
220
mods/default/locale/default.eo.tr
Normal file
220
mods/default/locale/default.eo.tr
Normal file
@ -0,0 +1,220 @@
|
||||
# textdomain: default
|
||||
Locked Chest=Ŝlosita Kesto
|
||||
Locked Chest (owned by @1)=Ŝlosita Kesto (de @1)
|
||||
You do not own this chest.=Vi ne posedas ĉi tiun keston.
|
||||
a locked chest=ŝlosita kesto
|
||||
Chest=Kesto
|
||||
Write=Skribi
|
||||
Read=Legi
|
||||
Title:=Titolo:
|
||||
Contents:=Enhavo:
|
||||
Save=Konservi
|
||||
by @1=per @1
|
||||
Page @1 of @2=Paĝo @1 el @2
|
||||
The book you were writing to mysteriously disappeared.=La libro, kiun vi skribis, mistere malaperis.
|
||||
"@1" by @2="@1" per @2
|
||||
Blueberries=Mirteloj
|
||||
Book=Libro
|
||||
Book with Text=Libro kun Teksto
|
||||
Bronze Ingot=Bronza Ingoto
|
||||
Clay Brick=Argila Briko
|
||||
Clay Lump=Argila Bulo
|
||||
Coal Lump=Karba Bulo
|
||||
Copper Ingot=Kupra Ingoto
|
||||
Copper Lump=Kupra Bulo
|
||||
Diamond=Diamanto
|
||||
Flint=Siliko
|
||||
Gold Ingot=Ora Ingoto
|
||||
Gold Lump=Ora Bulo
|
||||
Iron Lump=Fera Bulo
|
||||
Mese Crystal=Mesea Kristalo
|
||||
Mese Crystal Fragment=Mesea Kristala Ero
|
||||
Obsidian Shard=Obsidiana Peceto
|
||||
Paper=Papero
|
||||
Steel Ingot=Ŝtala Ingoto
|
||||
Stick=Bastono
|
||||
Tin Ingot=Stana Ingoto
|
||||
Tin Lump=Stana Bulo
|
||||
Furnace is empty=Forno estas malplena
|
||||
100% (output full)=100% (plena eligo)
|
||||
@1%=@1%
|
||||
Not cookable=Nekuirebla
|
||||
Empty=Malplena
|
||||
Furnace active=Forno laboras
|
||||
Furnace inactive=Forno ne laboras
|
||||
(Item: @1; Fuel: @2)=(Objekto: @1; Brulaĵo: @2)
|
||||
Furnace=Forno
|
||||
Stone=Ŝtono
|
||||
Cobblestone=Pavimŝtono
|
||||
Stone Brick=Ŝtona Briko
|
||||
Stone Block=Ŝtona Bloko
|
||||
Mossy Cobblestone=Muska Pavimŝtono
|
||||
Desert Stone=Dezerta Ŝtono
|
||||
Desert Cobblestone=Dezerta Pavimŝtono
|
||||
Desert Stone Brick=Dezerta Ŝtona Briko
|
||||
Desert Stone Block=Dezerta Ŝtona Bloko
|
||||
Sandstone=Sablaŝtono
|
||||
Sandstone Brick=Sablaŝtono Briko
|
||||
Sandstone Block=Sablaŝtono Bloko
|
||||
Desert Sandstone=Dezerta Sablaŝtono
|
||||
Desert Sandstone Brick=Dezerta Sablaŝtono Briko
|
||||
Desert Sandstone Block=Dezerta Sablaŝtono Bloko
|
||||
Silver Sandstone=Arĝenta Sablaŝtono
|
||||
Silver Sandstone Brick=Arĝenta Sablaŝtono Briko
|
||||
Silver Sandstone Block=Arĝenta Sablaŝtono Bloko
|
||||
Obsidian=Obsidiano
|
||||
Obsidian Brick=Obsidiana Briko
|
||||
Obsidian Block=Obsidiana Bloko
|
||||
Dirt=Tero
|
||||
Dirt with Grass=Tero kun Herbo
|
||||
Dirt with Grass and Footsteps=Tero kun Herbo kaj Piedpaŝoj
|
||||
Dirt with Savanna Grass=Tero kun Savana Herbo
|
||||
Dirt with Snow=Tero kun Neĝo
|
||||
Dirt with Rainforest Litter=Tero kun Pluvarbara Folioj
|
||||
Dirt with Coniferous Litter=Tero kun Koniferaj Folioj
|
||||
Savanna Dirt=Savana Tero
|
||||
Savanna Dirt with Savanna Grass=Savana Tero kun Savana Herbo
|
||||
Permafrost=Ĉiamfrosto
|
||||
Permafrost with Stones=Ĉiamfrosto kun Ŝtonoj
|
||||
Permafrost with Moss=Ĉiamfrosto kun Musko
|
||||
Sand=Sablo
|
||||
Desert Sand=Dezerta Sablo
|
||||
Silver Sand=Arĝenta Sablo
|
||||
Gravel=Gruzo
|
||||
Clay=Argilo
|
||||
Snow=Neĝo
|
||||
Snow Block=Neĝa Bloko
|
||||
Ice=Glacio
|
||||
Cave Ice=Kaverna Glacio
|
||||
Apple Tree=Pomarbo
|
||||
Apple Wood Planks=Pomarbaj Lignaj Tabuloj
|
||||
Apple Tree Sapling=Pomarba Arbido
|
||||
Apple Tree Leaves=Pomarbaj Folioj
|
||||
Apple=Pomo
|
||||
Apple Marker=Poma Marko
|
||||
Jungle Tree=Ĝangala Arbo
|
||||
Jungle Wood Planks=Ĝangalaj Lignaj Tabuloj
|
||||
Jungle Tree Leaves=Ĝangalaj Arbaj Folioj
|
||||
Jungle Tree Sapling=Ĝangala Arba Arbido
|
||||
Emergent Jungle Tree Sapling=Nova Ĝangala Arba Arbido
|
||||
Pine Tree=Pino
|
||||
Pine Wood Planks=Pinaj Lignaj Tabuloj
|
||||
Pine Needles=Pinpingloj
|
||||
Pine Tree Sapling=Pina Arbido
|
||||
Acacia Tree=Akacio
|
||||
Acacia Wood Planks=Akaciaj Lignaj Tabuloj
|
||||
Acacia Tree Leaves=Akaciaj Folioj
|
||||
Acacia Tree Sapling=Akacia Arbido
|
||||
Aspen Tree=Tremolo
|
||||
Aspen Wood Planks=Tremolaj Lignaj Tabuloj
|
||||
Aspen Tree Leaves=Tremolaj Folioj
|
||||
Aspen Tree Sapling=Tremola Arbido
|
||||
Coal Ore=Karba Minaĵo
|
||||
Coal Block=Karba Bloko
|
||||
Iron Ore=Fera Minaĵo
|
||||
Steel Block=Ŝtala Bloko
|
||||
Copper Ore=Kupra Minaĵo
|
||||
Copper Block=Kupra Bloko
|
||||
Tin Ore=Stana Minaĵo
|
||||
Tin Block=Stana Bloko
|
||||
Bronze Block=Bronza Bloko
|
||||
Mese Ore=Mesea Minaĵo
|
||||
Mese Block=Mesea Bloko
|
||||
Gold Ore=Ora Minaĵo
|
||||
Gold Block=Ora Bloko
|
||||
Diamond Ore=Diamanta Minaĵo
|
||||
Diamond Block=Diamanta Bloko
|
||||
Cactus=Kakto
|
||||
Large Cactus Seedling=Granda Kakta Kreskaĵo
|
||||
Papyrus=Papiruso
|
||||
Dry Shrub=Seka Arbetaĵo
|
||||
Jungle Grass=Ĝangala Herbo
|
||||
Grass=Herbo
|
||||
Savanna Grass=Savana Herbo
|
||||
Fern=Filiko
|
||||
Marram Grass=Amofilo
|
||||
Bush Stem=Arbateĵa Tubo
|
||||
Bush Leaves=Arbateĵaj Folioj
|
||||
Bush Sapling=Arbateĵa Arbido
|
||||
Blueberry Bush Leaves with Berries=Mirtelaj Arbateĵaj Folioj kaj Beroj
|
||||
Blueberry Bush Leaves=Mirtelaj Arbateĵaj Folioj
|
||||
Blueberry Bush Sapling=Mirtela Arbateĵa Arbido
|
||||
Acacia Bush Stem=Akacia Arbateĵa Tubo
|
||||
Acacia Bush Leaves=Akaciaj Arbateĵaj Folioj
|
||||
Acacia Bush Sapling=Akacia Arbateĵa Arbido
|
||||
Pine Bush Stem=Pina Arbateĵa Tubo
|
||||
Pine Bush Needles=Pinaj Arbateĵaj Pingloj
|
||||
Pine Bush Sapling=Pina Arbateĵa Arbido
|
||||
Kelp=Fuko
|
||||
Green Coral=Verda Koralo
|
||||
Pink Coral=Rozkolora Koralo
|
||||
Cyan Coral=Bluverda Koralo
|
||||
Brown Coral=Bruna Koralo
|
||||
Orange Coral=Oranĝkolora Koralo
|
||||
Coral Skeleton=Korala Framo
|
||||
Water Source=Akva Fonto
|
||||
Flowing Water=Flua Akvo
|
||||
River Water Source=Rivera Akva Fonto
|
||||
Flowing River Water=Flua Rivera Akvo
|
||||
Lava Source=Lafa Fonto
|
||||
Flowing Lava=Flua Lafa
|
||||
Empty Bookshelf=Malplena Librobreto
|
||||
Bookshelf (@1 written, @2 empty books)=Librobreto (@1 skriba(j), @2 malplena(j) libro(j))
|
||||
Bookshelf=Librobreto
|
||||
Text too long=Tro longa teksto
|
||||
"@1"=
|
||||
Wooden Sign=Ligna Signo
|
||||
Steel Sign=Ŝtala Signo
|
||||
Wooden Ladder=Ligna Ŝtupetaro
|
||||
Steel Ladder=Ŝtala Ŝtupetaro
|
||||
Apple Wood Fence=Poma Ligna Barilo
|
||||
Acacia Wood Fence=Akacia Ligna Barilo
|
||||
Jungle Wood Fence=Ĝangala Ligna Barilo
|
||||
Pine Wood Fence=Pina Ligna Barilo
|
||||
Aspen Wood Fence=Tremola Ligna Barilo
|
||||
Apple Wood Fence Rail=Poma Ligna Barila Relo
|
||||
Acacia Wood Fence Rail=Akacia Ligna Barila Relo
|
||||
Jungle Wood Fence Rail=Ĝangala Ligna Barila Relo
|
||||
Pine Wood Fence Rail=Pina Ligna Barila Relo
|
||||
Aspen Wood Fence Rail=Tremola Ligna Barila Relo
|
||||
Glass=Vitro
|
||||
Obsidian Glass=Obsidiana Vitro
|
||||
Brick Block=Brika Bloko
|
||||
Mese Lamp=Mesea Lampo
|
||||
Apple Wood Mese Post Light=Poma Ligna Mesea Fosta Lampo
|
||||
Acacia Wood Mese Post Light=Akacia Ligna Mesea Fosta Lampo
|
||||
Jungle Wood Mese Post Light=Ĝangala Ligna Mesea Fosta Lampo
|
||||
Pine Wood Mese Post Light=Pina Ligna Mesea Fosta Lampo
|
||||
Aspen Wood Mese Post Light=Tremola Ligna Mesea Fosta Lampo
|
||||
Cloud=Nubo
|
||||
Wooden Pickaxe=Ligna Pioĉo
|
||||
Stone Pickaxe=Ŝtona Pioĉo
|
||||
Bronze Pickaxe=Bronza Pioĉo
|
||||
Steel Pickaxe=Ŝtala Pioĉo
|
||||
Mese Pickaxe=Mesea Pioĉo
|
||||
Diamond Pickaxe=Diamanta Pioĉo
|
||||
Wooden Shovel=Ligna Fosilo
|
||||
Stone Shovel=Ŝtona Fosilo
|
||||
Bronze Shovel=Bronza Fosilo
|
||||
Steel Shovel=Ŝtala Fosilo
|
||||
Mese Shovel=Mesea Fosilo
|
||||
Diamond Shovel=Diamanta Fosilo
|
||||
Wooden Axe=Ligna Hakilo
|
||||
Stone Axe=Ŝtona Hakilo
|
||||
Bronze Axe=Bronza Hakilo
|
||||
Steel Axe=Ŝtala Hakilo
|
||||
Mese Axe=Mesea Hakilo
|
||||
Diamond Axe=Diamanta Hakilo
|
||||
Wooden Sword=Ligna Glavo
|
||||
Stone Sword=Ŝtona Glavo
|
||||
Bronze Sword=Bronza Glavo
|
||||
Steel Sword=Ŝtala Glavo
|
||||
Mese Sword=Mesea Glavo
|
||||
Diamond Sword=Diamanta Glavo
|
||||
Torch=Torĉo
|
||||
@1 will intersect protection on growth.=@1 sekcos protekton dum kresko.
|
||||
|
||||
|
||||
##### not used anymore #####
|
||||
|
||||
Mese Post Light=Mesea Fosta Lampo
|
@ -1,18 +1,18 @@
|
||||
# textdomain: default
|
||||
|
||||
Locked Chest=Cofre cerrado
|
||||
Locked Chest (owned by @1)=Cofre cerrado (propiedad de @1)
|
||||
You do not own this chest.=Este cofre no te pertenece.
|
||||
a locked chest=un cofre cerrado
|
||||
Chest=Cofre
|
||||
Write=
|
||||
Read=
|
||||
Title:=Título:
|
||||
Contents:=Contenidos:
|
||||
Save=Guardar
|
||||
by @1=por @1
|
||||
Page @1 of @2=Página @1 de @2
|
||||
The book you were writing to mysteriously disappeared.=
|
||||
"@1" by @2="@1" por @2
|
||||
Skeleton Key=Llave esqueleto
|
||||
Key to @1's @2=Llave para @2 de @1
|
||||
Blueberries=Arándanos
|
||||
Book=Libro
|
||||
Book with Text=Libro escrito
|
||||
@ -211,7 +211,6 @@ Bronze Sword=Espada de bronce
|
||||
Steel Sword=Espada de acero
|
||||
Mese Sword=Espada de mese
|
||||
Diamond Sword=Espada de diamante
|
||||
Key=Llave
|
||||
Torch=Antorcha
|
||||
@1 will intersect protection on growth.=@1 intersectará con protección cuando crezca.
|
||||
|
||||
|
@ -4,14 +4,15 @@ Locked Chest (owned by @1)=Coffre verrouillé (possédé par @1)
|
||||
You do not own this chest.=Ce coffre ne vous appartient pas.
|
||||
a locked chest=un coffre verrouillé
|
||||
Chest=Coffre
|
||||
Write=Écrire
|
||||
Read=Lire
|
||||
Title:=Titre :
|
||||
Contents:=Contenu :
|
||||
Save=Sauvegarder
|
||||
by @1=de @1
|
||||
Page @1 of @2=Page @1 sur @2
|
||||
The book you were writing to mysteriously disappeared.=
|
||||
"@1" by @2=« @1 » de @2
|
||||
Skeleton Key=Squelette
|
||||
Key to @1's @2=Clé pour @2 de @1
|
||||
Blueberries=Myrtille
|
||||
Book=Livre
|
||||
Book with Text=Livre avec du texte
|
||||
@ -63,16 +64,16 @@ Silver Sandstone Brick=Brique de grès argenté
|
||||
Silver Sandstone Block=Bloc de grès argenté
|
||||
Obsidian=Obsidienne
|
||||
Obsidian Brick=Brique d'obsidienne
|
||||
Obsidian Block=Block d'obsidienne
|
||||
Obsidian Block=Bloc d'obsidienne
|
||||
Dirt=Terre
|
||||
Dirt with Grass=Terre avec de l'herbe
|
||||
Dirt with Grass and Footsteps=Terre avec de l'herbe et des traces de pas
|
||||
Dirt with Savanna Grass=
|
||||
Dirt with Savanna Grass=Terre avec de l'herbe de savane
|
||||
Dirt with Snow=Terre avec de la neige
|
||||
Dirt with Rainforest Litter=Terre avec sol de forêt humide
|
||||
Dirt with Coniferous Litter=Terre avec sol de forêt de conifère
|
||||
Savanna Dirt=
|
||||
Savanna Dirt with Savanna Grass=
|
||||
Savanna Dirt=Terre de la savane
|
||||
Savanna Dirt with Savanna Grass=Terre de la savane avec son herbe
|
||||
Permafrost=Pergélisol
|
||||
Permafrost with Stones=Pergélisol avec de la pierre
|
||||
Permafrost with Moss=Pergélisol avec de la mousse
|
||||
@ -110,7 +111,7 @@ Aspen Tree Leaves=Feuilles de tremble
|
||||
Aspen Tree Sapling=Pousse de tremble
|
||||
Coal Ore=Minerai de charbon
|
||||
Coal Block=Bloc de charbon
|
||||
Iron Ore=Bloc de fer
|
||||
Iron Ore=Minerai de fer
|
||||
Steel Block=Bloc d'acier
|
||||
Copper Ore=Minerai de cuivre
|
||||
Copper Block=Bloc de cuivre
|
||||
@ -129,7 +130,7 @@ Papyrus=Papyrus
|
||||
Dry Shrub=Arbuste sec
|
||||
Jungle Grass=Herbe de la jungle
|
||||
Grass=Herbe
|
||||
Savanna Grass=
|
||||
Savanna Grass=Herbe de la savane
|
||||
Fern=Fougère
|
||||
Marram Grass=Ammophile
|
||||
Bush Stem=Tige de buisson
|
||||
@ -152,11 +153,11 @@ Brown Coral=Corail marron
|
||||
Orange Coral=Corail orange
|
||||
Coral Skeleton=Squelette de corail
|
||||
Water Source=Source d'eau
|
||||
Flowing Water=Ecoulement d'eau
|
||||
Flowing Water=Écoulement d'eau
|
||||
River Water Source=Source d'eau de rivière
|
||||
Flowing River Water=Ecoulement d'eau de rivière
|
||||
Flowing River Water=Écoulement d'eau de rivière
|
||||
Lava Source=Source de lave
|
||||
Flowing Lava=Ecoulement de lave
|
||||
Flowing Lava=Écoulement de lave
|
||||
Empty Bookshelf=Bibliothèque vide
|
||||
Bookshelf (@1 written, @2 empty books)=Bibliothèque (@1 écrits, @2 livres vides)
|
||||
Bookshelf=Bibliothèque
|
||||
@ -164,8 +165,8 @@ Text too long=Texte trop longue
|
||||
"@1"=« @1 »
|
||||
Wooden Sign=Panneau en bois
|
||||
Steel Sign=Panneau en acier
|
||||
Wooden Ladder=Echelle en bois
|
||||
Steel Ladder=Echelle en acier
|
||||
Wooden Ladder=Échelle en bois
|
||||
Steel Ladder=Échelle en acier
|
||||
Apple Wood Fence=Barrière de bois de pommier
|
||||
Acacia Wood Fence=Barrière de bois d'acacia
|
||||
Jungle Wood Fence=Barrière de bois de la jungle
|
||||
@ -180,11 +181,11 @@ Glass=Verre
|
||||
Obsidian Glass=Verre d'obsidienne
|
||||
Brick Block=Bloc de brique
|
||||
Mese Lamp=Lampe de Mese
|
||||
Apple Wood Mese Post Light=
|
||||
Acacia Wood Mese Post Light=
|
||||
Jungle Wood Mese Post Light=
|
||||
Pine Wood Mese Post Light=
|
||||
Aspen Wood Mese Post Light=
|
||||
Apple Wood Mese Post Light=Réverbère de Mese en bois de pommier
|
||||
Acacia Wood Mese Post Light=Réverbère de Mese en bois d'acacia
|
||||
Jungle Wood Mese Post Light=Réverbère de Mese en bois de la jungle
|
||||
Pine Wood Mese Post Light=Réverbère de Mese en bois de pin
|
||||
Aspen Wood Mese Post Light=Réverbère de Mese en bois de tremble
|
||||
Cloud=Nuage
|
||||
Wooden Pickaxe=Pioche en bois
|
||||
Stone Pickaxe=Pioche en pierre
|
||||
@ -205,12 +206,11 @@ Steel Axe=Hache en acier
|
||||
Mese Axe=Hache en Mese
|
||||
Diamond Axe=Hache en diamant
|
||||
Wooden Sword=Epée en bois
|
||||
Stone Sword=Epée en pierre
|
||||
Bronze Sword=Epée en bronze
|
||||
Steel Sword=Epée en acier
|
||||
Mese Sword=Epée en Mese
|
||||
Diamond Sword=Epée en diamant
|
||||
Key=Clé
|
||||
Stone Sword=Épée en pierre
|
||||
Bronze Sword=Épée en bronze
|
||||
Steel Sword=Épée en acier
|
||||
Mese Sword=Épée en Mese
|
||||
Diamond Sword=Épée en diamant
|
||||
Torch=Torche
|
||||
@1 will intersect protection on growth.=@1 chevauchera la zone protégée avec la croissance.
|
||||
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user