1
0
mirror of https://github.com/minetest/minetest_game.git synced 2025-06-28 20:56:02 +02:00

132 Commits

Author SHA1 Message Date
9875ef6240 Merge remote-tracking branch 'origin/stable-5' into HEAD 2023-12-17 17:10:25 +01:00
b9c089474c Update README.md for 5.8 2023-12-17 16:57:57 +01:00
05367552d1 Mapgen: Don't clear biomes, decorations and ores 2023-12-10 22:49:51 +01:00
33d90c2c45 Add min_minetest_version to game.conf
This is used by ContentDB to install the right version of a package for a given client version
2023-12-04 17:51:38 +00:00
4bb4a2a818 Update Malay translations
1. Added missing translation to the following files:
  beds.ms.tr, creative.ms.tr, default.ms.tr, farming.ms.tr,
  fire.ms.tr, sethome.ms.tr
2. Changes some translation as per following:
  a. beds.ms.tr
    - Leave Bed changed from Bangun (wake up) to Tinggalkan Katil
      (leave bed, in literal sense) just because the button would
      be interpreted by some people as 'wake up on next morning'
      (ie. skipping night) instead of 'wake up interrupting current
      sleep progress' which is the intended meaning.
  b. boats.ms.tr
    - Boat cruise mode changed from Mod bot layar makan angin to
      Mod jelajah bot, the original translation is more like direct
      translation, and this has been changed to more natural one
      to make sure player know that the mode is a cruise control.
    - Reset changed from Set semula to Tetap semula, this is for
      standardizing with existing term used in various places.
  c. default.ms.tr
    - Page \@1 of \@2 changed from the short form to the long form.
    - Mese Crystal Fragment had missing word 'Kristal' re-added.
  d. dye.ms.tr
    - Dark Grey changed from Kelabu Gelap to Kelabu Tua to make it
      standardized with the colour name elsewhere.
    - Dark Green changed from Hijau Gelap to Hijau Tua to make it
      standardized with the colour name elsewhere.
    - Magenta changed from Merah Lembayung to Magenta, because the
      colour Merah Lembayung is now used to refer to purplish red
      and no longer equal to magenta, the loanword is used instead.
  e. game_commands.ms.tr
    - respawn changed from lahir semula (reborn) to jelma semula
      (reappear), this is to make it consistent with the language
      used in multiple other games that had similar respawning
      system, and avoiding the religious context of life that is
      implied by the use of previous translation.
    - spawnpoint changed from titik permulaan (starting point) to
      titik jelma ((re)appear point), see previous point.
  f. tnt.ms.tr
    - Gun Powder changed from Serbuk Senjata Api (firearms powder)
      to Serbuk Letupan (explosion powder) because that is the
      proper translation, the latter is still the term used even
      when talking about actual firearm, the former didn't exist
  g. vessels.ms.tr
    - item changed from barang (thing) to item, this is mainly
      because some of the 'item' that could be stored are not
      some solid 'thing' where the word barang could be used for,
      so using the word item here keep it neutral.
  h. wool.ms.tr
    - Dark Grey changed from Kelabu Gelap to Kelabu Tua to make it
      standardized with the colour name elsewhere.
    - Dark Green changed from Hijau Gelap to Hijau Tua to make it
      standardized with the colour name elsewhere.
    - Magenta changed from Merah Lembayung to Magenta, because the
      colour Merah Lembayung is now used to refer to purplish red
      and no longer equal to magenta, the loanword is used instead.
2023-12-01 03:46:21 +01:00
829eb92ccf Update Indonesian translations (#3077) 2023-11-24 18:48:38 +01:00
bff7596364 Update Ukrainian translation (#3070) 2023-11-04 16:40:07 +01:00
601ec6cd94 Fix not updating vessel shelf infotext 2023-11-03 10:03:39 +01:00
b58991d4f3 Fix typo in German translation 2023-10-08 18:11:44 +02:00
34942339c7 Fix bed night skip race condition (#3067) 2023-09-29 22:31:13 +02:00
eba9012d05 Fix coral and kelp duping with mesecons' sticky piston (#3062) 2023-09-16 14:52:07 +02:00
59da46c80b Add sapling growth APIs (#3053)
---------
Co-authored-by: Lars Müller <34514239+appgurueu@users.noreply.github.com>
Co-authored-by: sfan5 <sfan5@live.de>
2023-09-12 15:43:41 +02:00
03177f1584 Stairs: Add helper function for textures and simplify code (#3060) 2023-09-11 19:14:16 +02:00
a132872ad8 Update creative Spanish translation 2023-09-04 18:01:14 +02:00
bbc70c95ef Replace nonfree water textures
Reduced image size.

Ran `optipng -strip all FILENAME` on files and reduced file size.

Transparent(er) River water

Made the `default_river_water.png` and it's relatives more transparent.

Added my name to license.txt

Bump year to 2023

Corrected Hue.

Corrected a miss-alignment in hue between running and still non-river water.
2023-09-04 13:34:39 +02:00
9e77e00c65 Update German translation 2023-08-17 18:54:20 +02:00
b26a787eb3 Update locale template files 2023-08-17 18:54:20 +02:00
08e057bf1c Don't remove node above door if it's not a doors:hidden node (#3045) 2023-08-11 13:12:39 +02:00
83c10f59e1 chest_lid_close: don't replace a node if it's not the expected open chest 2023-08-11 13:00:22 +02:00
960aff2f63 Improve opaque leaves textures (#3013) 2023-07-18 22:28:01 +02:00
110c23560e Don't check protection of air when placing bones (#2964) 2023-07-06 10:17:35 +02:00
d86435d86c Extend inventory action logging to include bones (#3040) 2023-07-05 23:14:02 +02:00
16bf166902 Update bookshelf on inventory move (#3039)
Otherwise the empty book slot icon does not get replaced
2023-06-07 16:20:47 +02:00
cd6ea53a52 Update bookshelf infotext on put and take inv actions 2023-06-06 18:07:37 +02:00
16b6bdde0a default.set_inventory_action_loggers: Hook (instead of replace) callbacks 2023-06-06 18:07:37 +02:00
996fea7cd0 Fix texture modifiers relying on undocumented behavior 2023-05-27 22:11:45 +02:00
9a9df3a42e Fix logic error in bed rotation 2023-05-20 12:17:43 +02:00
xin
1e237b8d18 Minor improvements to the French translation (#3027) 2023-04-20 17:28:50 +02:00
9050150464 Merge remote-tracking branch 'origin/stable-5' into HEAD 2023-04-08 19:33:25 +02:00
833ed77620 Validate & sanitize formspec fields (#3022) 2023-04-08 18:13:45 +02:00
4c6e19968a Fix typo in german translation 2023-04-08 18:11:37 +02:00
446e56a879 Update German translation 2023-04-08 18:11:37 +02:00
34c1d3242d Update locale files 2023-04-08 18:11:37 +02:00
f49707c973 Minor creative UI fixes (#3023) 2023-04-04 11:43:59 +02:00
8dee348d97 Fix syntax errors in bones.sv.tr 2023-03-14 10:25:37 +01:00
aeb27c4db6 Fix 'boats' russian translation (#2974) 2023-03-10 20:27:15 +01:00
6921c9bbd1 Tweak MTG craftguide Russian translation (#2975) 2023-03-10 20:26:30 +01:00
8d60e85dfc Fix player_api.set_model not updating the animation 2023-01-31 15:31:52 +01:00
2c1d9e1330 Flip item textures of glass doors (#3009) 2023-01-26 17:32:03 +01:00
ec2f57db0e Ensure chests close properly (#2965)
Co-authored-by: sfan5 <sfan5@live.de>
2023-01-25 19:10:32 +01:00
fdcf458b56 creative: Override hand after mods loaded... (#2984)
Prevents other mods from overwriting changes
& removes dependence on default.
2023-01-21 09:44:47 +01:00
97130f4c1c Update Chinese translation (#3008)
+ template update
2023-01-21 09:44:35 +01:00
26b2da2c08 Update Japanese translation (#3007)
Add missing translations
 Corrected mistranslations
 Revised translation to match Mineclone2
2023-01-21 09:43:53 +01:00
8eb4437ac8 Fix crash if /home is executed with an invalid name (#3000) 2022-12-20 18:42:48 +01:00
792bc6f6e5 Fix wall craft registrations (#3004) 2022-12-02 19:54:46 +01:00
c4cf1a6004 Update Indonesian translation (#3003)
- Add missing translations
- Fix wrong terms/spellings
2022-11-27 21:24:35 +01:00
99a7193095 Teach screwdriver to rotate 4dir nodes (#2992) 2022-10-01 21:19:42 +02:00
2e8ac46120 Beds: Replace hardcoded values of day interval with constants (#2990) 2022-09-28 11:07:50 +02:00
508a9070a0 Add color_* groups to wool 2022-09-21 18:23:55 +02:00
08057e8e0f Merge remote-tracking branch 'origin/stable-5' into HEAD 2022-09-19 21:45:31 +02:00
aff9c28eed Improve stair placement rotation for bridging (#2979)
Co-authored-by: sfan5 <sfan5@live.de>
2022-08-18 11:02:24 +02:00
e903b1f6d0 Make default an optional dependency for the creative mod 2022-08-18 10:16:22 +02:00
b55329d3e1 Merge remote-tracking branch 'origin/stable-5' into HEAD 2022-08-04 22:14:33 +02:00
2bdc7c8c7d Update Russian translation 2022-07-29 22:03:06 +02:00
c744829ce5 Update Russian translation for mtg_craftguide (#2873) 2022-07-29 15:10:24 +02:00
06daee4c6d Correct some Esperanto translations (#2910) 2022-07-25 13:26:49 +02:00
697b028e43 Update Lojban translation 2022-07-22 21:28:31 +02:00
e229236bc2 Update German translation 2022-07-22 16:19:31 +02:00
350c52319e Update translation templates 2022-07-22 16:19:31 +02:00
b64868ef92 Move Japanese key translations to keys mod 2022-07-22 16:19:31 +02:00
79d38078a5 Remove paramtype2="glasslikeliquidlevel" from glass nodes (#2963) 2022-07-02 11:58:01 +02:00
986b65775f Update engine feature checks 2022-06-13 20:02:08 +02:00
d7dd15782c Use add_wear_by_uses to fix incorrect uses counts (#2959) 2022-06-04 18:43:21 +02:00
b4392aeb1f Fix book duplication: Remember wield index (#2957) 2022-06-01 20:54:16 +02:00
54dc58ef1f Fix furnace fire sound stopping too late (#2955)
Cleans fire sound IDs after a few seconds
2022-05-29 21:16:23 +02:00
b57700a75b Add polish translation (#2926) 2022-05-29 16:20:42 +02:00
b0cf061360 Fix TNT blowing up ignore nodes 2022-05-24 17:57:37 +02:00
33650c8c2e game.conf: Use title instead of deprecated name 2022-05-24 14:55:10 +02:00
e86d0dff94 TNT node drop particles: Only pick string tiles as fallback 2022-05-13 17:35:16 +02:00
5549b9585d Fix incorrectly negated comparisons 2022-05-13 17:35:07 +02:00
d294ef757e player_api: Fix crash for players without model 2022-05-13 17:34:58 +02:00
0ad8222b97 player_api - fix compatibility code
get_animation does not return the data if called from outside without this change
2022-05-13 17:34:49 +02:00
38307da22a Carts: Improve movement behaviour (#2951)
Backported various changes from boost_cart
Improved direction handling and code cleanup
Smoothed-out 'end of rail' animation
2022-05-09 20:44:06 +02:00
0c2ee1e41d Deduplicate player action logging, silence fake player actions (#2941) 2022-05-06 20:04:55 +02:00
edd033b708 TNT node drop particles: Only pick string tiles as fallback 2022-04-24 13:29:29 +02:00
9528c0f8b9 Adjust shadow intensity based on cloud density (#2938) 2022-04-02 09:35:36 +02:00
638099c999 Fix incorrectly negated comparisons 2022-03-26 19:58:07 +01:00
659895c3ed Update game_api.txt 2022-03-23 11:36:46 +01:00
ce82241ab2 Undo globalization 2022-03-23 11:36:46 +01:00
0110e01826 Fix bug and globalize players table 2022-03-23 11:36:46 +01:00
268a8844b6 Use a local for the globalstep function 2022-03-23 11:36:46 +01:00
f665382017 Allow mods to override animation globalstep 2022-03-23 11:36:46 +01:00
a6f3b89596 player_api: Fix crash for players without model 2022-03-13 00:02:40 +01:00
240f9a6a85 Fix translation of "cotton" for UK and RU locales 2022-02-15 20:29:34 +01:00
a840ac0a4d player_api - fix compatibility code 2022-02-03 09:15:14 +01:00
584a6a2102 player_api - fix compatibility code
get_animation does not return the data if called from outside without this change
2022-02-03 09:10:53 +01:00
e02e55fafd Minor translation refinement for UK and RU langs (Drinking Glass) (#2925) 2022-02-01 11:09:21 +01:00
a23819f4fe Merge remote-tracking branch 'origin/stable-5' into HEAD 2022-01-30 21:54:41 +01:00
cc3e7be429 Update Ukranian (uk) translation 2022-01-30 15:20:14 +01:00
172b62f802 Add trapdoor/door model specification (#2371) 2022-01-30 13:54:37 +01:00
a5547a3a76 Add ukrainian (uk) translation (#2921)
Co-authored-by: sfan5 <sfan5@live.de>
2022-01-30 00:35:28 +01:00
c8a1454e2b Fix and update Swedish translation (#2920) 2022-01-29 18:35:45 +01:00
bcd1ee048e Update french translations (#2922)
* Update french translations for beds, farming and fire

* Update french translations for mtg_craftguide

* Update french translations for default

* Correct typos

* Restore new line at end of file

* Shorten translation for better display

Co-authored-by: Hugo Locurcio <hugo.locurcio@hugo.pro>
2022-01-29 16:27:19 +01:00
fff3b98ab0 Make keys stackable if they contain the same secret (Fix #2714) 2022-01-23 18:12:09 +01:00
40861c9e4f Move keys to a separate mod (Fix #1490) 2022-01-23 18:12:09 +01:00
0c1252bcf5 Balance sounds, remove silent water footstep 2022-01-23 18:07:59 +01:00
Yad
760581b330 Copyedit README.md & game.conf (#2919) 2022-01-23 18:07:10 +01:00
acc918436a Override local_animation settings for certain animations
This makes the lay/sit animation work on the local client (in third-person).
2022-01-20 22:48:59 +01:00
6623dec567 Redo player_api (#2745) 2022-01-17 21:49:28 +01:00
75f9575557 Allow to set use_texture_alpha when registering a door
Co-Authored-By: Gregor Parzefall <gregor.parzefall@posteo.de>
2022-01-14 19:41:26 +01:00
78de12d6b4 Fix torch models so they render correctly in model[]
reported by @OgelGames
2022-01-09 22:57:57 +01:00
d775a9bdae Pull some parent node vars for stairs and slabs (#2911)
Fixes the sunlight propagation of glass stairs and slabs.

Co-authored-by: tenplus1 <tenplus1@users.noreply.github.com>
2021-12-12 16:38:54 +01:00
60389a1539 Slovak translation update (#2905) 2021-12-12 16:38:02 +01:00
3aaabce7a4 Convert door model to B3D (#2906)
Using a B3D model I worked out that it would be possible to have only two models (instead of the current four) for the doors and still keep all the mirroring correct when the door is open/closed.
2021-12-12 16:37:50 +01:00
ad183c48ee Update German translation 2021-12-10 12:24:48 +01:00
2361987421 Update locale files 2021-12-10 12:24:48 +01:00
5875820542 Use itemstack name when placing doors (#2888) 2021-10-31 19:17:31 +01:00
31f7d57889 Add and fix Japanese translation (#2904) 2021-10-31 19:17:21 +01:00
02ec133392 Prevent blocking of fuel inventory by fuel replacement (#2895) 2021-10-23 14:37:51 +02:00
1309953da6 Fix the creative trash slot for player 'trash'
By using the inventory named just 'trash' instead of 'creative_trash'
which overlaps when you name your player 'trash'.
2021-10-23 14:37:30 +02:00
5273fcb3ad Readd character.b3d normals (#2902) 2021-10-16 16:41:10 +02:00
f2bc5e2c67 Improve Russian translation (#2532) 2021-10-16 16:40:56 +02:00
4b8b33587c Fix misuse of nodedef custom fields in fence gates
Custom fields must start with an underscore, this is very relevant for `sound` which is already defined by the engine.
2021-09-24 21:03:49 +02:00
953fcfe09e Improve zh_CN translation (#2885) 2021-09-04 23:37:39 +02:00
21e5f68292 default: Improves reading and writing to books. (#2656)
* Allow anyone to write to a book without any text and title.
* Allows saving books without any text or title.
* Adds a "Read" and "Write" tab to written owned books.

Fixes #1743
2021-09-04 23:37:27 +02:00
92701885d0 Replace Travis CI with GitHub actions (#2661)
Co-authored-by: sfan5 <sfan5@live.de>
2021-07-08 11:47:37 +01:00
c96cc55c40 Fix incorrect documentation of "default_coal_lump.png" 2021-06-06 19:25:30 +02:00
70500943f3 Fix problem with sharing table in door nodes Lua definitions
closes #2882
2021-06-06 19:24:10 +02:00
ddebdeccb1 Add open/close sound gains to the Doors API, balance sound levels (#2768) 2021-05-31 20:43:33 +01:00
71ea0c65ea Attachments: Proper data cleanup in callbacks (#2865) 2021-05-11 21:15:47 +02:00
642fde44f1 Use group for mushroom spread ABM (#2863)
Have mushroom spread abm use group:mushroom to spread not only default red and brown but all defined shrooms.
2021-05-08 14:42:34 +02:00
1c78666c56 Reclassify some items 2021-05-08 14:42:16 +02:00
8158926862 Check for attachments before attaching player to bed (#2862) 2021-05-08 11:30:57 +02:00
4945f4bf9a Carts: Fix 0/0 condition on faulty tool capabilities 2021-05-02 14:59:22 +02:00
79e63a8496 Check for required engine features on startup 2021-04-27 11:50:32 +02:00
c6171a8f29 Add Esperanto translation (#2739)
Co-authored-by: Jason Cartwright <cartwrightjason49@gmail.com>
2021-04-17 15:08:37 +02:00
dd7eed952e Merge remote-tracking branch 'origin/stable-5' into HEAD 2021-02-23 20:21:20 +01:00
cb2c416b51 Merge remote-tracking branch 'origin/stable-5' into HEAD 2020-07-09 22:15:23 +02:00
dcb3df0a38 Merge remote-tracking branch 'origin/stable-5' into HEAD 2020-04-05 18:48:33 +02:00
0a9e24622f Merge branch 'master' of https://github.com/minetest/minetest_game into stable-5 2019-10-12 15:53:20 +02:00
8678265125 Dungeon loot: Avoid empty 'if' branch to satisfy lua check 2019-03-31 22:26:33 +02:00
df387e2394 Dungeon loot: Don't crash on unknown items
fixes #2228
2019-03-31 22:26:32 +02:00
344 changed files with 4801 additions and 1734 deletions

16
.github/workflows/build.yml vendored Normal file
View 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

View File

@ -1,6 +1,10 @@
unused_args = false
allow_defined_top = true
globals = {
"default"
}
read_globals = {
"DIR_DELIM",
"minetest",

View File

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

View File

@ -1,33 +1,45 @@
# Minetest Game
The default game bundled in the Minetest engine.
[![ContentDB](https://content.minetest.net/packages/Minetest/minetest_game/shields/title/)](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.
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.
The Minetest Game GitHub `master` `HEAD` is generally compatible with the GitHub
`master` `HEAD` of the Minetest engine.
When stable releases are made, Minetest Game and the Minetest engine is packaged
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.
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/).
## Licensing

View File

@ -1,3 +1,4 @@
name = 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.
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.
min_minetest_version = 5.8

View File

@ -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
@ -258,7 +269,7 @@ The doors mod allows modders to register custom doors and trapdoors.
material = "default:wood",
groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2},
sounds = default.node_sound_wood_defaults(), -- optional
on_rightclick = function(pos, node, clicker, itemstack, pointed_thing)
on_rightclick = function(pos, node, clicker, itemstack, pointed_thing)
-- function containing the on_rightclick callback
@ -431,11 +442,16 @@ 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.
* `def`: see [#Model definition]
* Saved to player_api.registered_models
* Saved to player_api.registered_models
* `player_api.registered_models[name]`
* Get a model's definition
@ -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

View File

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

View File

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

View File

@ -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",
}

View File

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

View File

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

View 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

View File

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

View File

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

View 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=ベッドから出ます

View File

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

View 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

View File

@ -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=Пропустить ночь

View File

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

View File

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

View 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

View 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=Встати з ліжка

View File

@ -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=强制跳过夜晚

View File

@ -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=強制跳過夜晚

View File

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

View File

@ -0,0 +1,3 @@
# textdomain: binoculars
Binoculars=Binoklo
Use with 'Zoom' key=Uzi per 'Zomo' klavo

View File

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

View File

@ -0,0 +1,3 @@
# textdomain: binoculars
Binoculars=双眼鏡
Use with 'Zoom' key=ズームキーで使います

View File

@ -0,0 +1,3 @@
# textdomain: binoculars
Binoculars=Lornetka
Use with 'Zoom' key=Aby użyć naciśnij 'Zoom'

View File

@ -1,3 +0,0 @@
# textdomain: binoculars
Binoculars=Kikare
Use with 'Zoom' key=Används med 'Zoom' knappen

View File

@ -0,0 +1,3 @@
# textdomain: binoculars
Binoculars=Kikare
Use with 'Zoom' key=Använd med 'Zoom'-knappen

View File

@ -0,0 +1,3 @@
# textdomain: binoculars
Binoculars=Бінокль
Use with 'Zoom' key=Використовується клавішею 'Наближення'

View File

@ -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)
self.driver = nil
self.auto = false
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

View 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

View File

@ -0,0 +1,4 @@
# textdomain: boats
Boat cruise mode on=クルージングモード・オン
Boat cruise mode off=クルージングモード・オフ
Boat=ボート

View File

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

View 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

View File

@ -1,4 +1,4 @@
# textdomain: boats
Boat cruise mode on=Режим путешествия на лодке включен
Boat cruise mode off=Режим путешествия на лодке выключен
Boat cruise mode on=Автоход лодки включен
Boat cruise mode off=Автоход лодки выключен
Boat=Лодка

View File

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

View File

@ -0,0 +1,4 @@
# textdomain: boats
Boat cruise mode on=Режим мандрування на човні увімкнено
Boat cruise mode off=Режим мандрування на човні вимкнено
Boat=Човен

View File

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

View 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

View File

@ -0,0 +1,8 @@
# textdomain: bones
Bones=骨
@1's old bones=@1の古い骨
@1 died at @2.=@1は@2で死亡しました。
@1 died at @2, and dropped their inventory.=@1は@2で死亡して持ち物を落としました。
@1 died at @2, and bones were placed.=@1は@2で死亡して骨が残されました。
@1's fresh bones=@1の新鮮な骨
@1's bones=@1の骨

View File

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

View File

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

View File

@ -0,0 +1,8 @@
# textdomain: bones
Bones=Кістки
@1's old bones=Старі кістки @1
@1 died at @2.=@1 загинув на координатах @2.
@1 died at @2, and dropped their inventory.=@1 загинув на координатах @2 та втратив вміст свого інвентарю.
@1 died at @2, and bones were placed.=@1 загинув на координатах @2, було розміщено кістки.
@1's fresh bones=Свіжі кістки @1
@1's bones=Кістки @1

View File

@ -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的骨骸

View 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

View File

@ -0,0 +1,5 @@
# textdomain: bucket
Empty Bucket=空のバケツ
Water Bucket=水入りバケツ
River Water Bucket=河川水入りバケツ
Lava Bucket=溶岩入りバケツ

View 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ą

View File

@ -1,5 +0,0 @@
# textdomain: bucket
Empty Bucket=Tom hink
Water Bucket=Vatten hink
River Water Bucket=Flodvatten hink
Lava Bucket=Lava hink

View File

@ -0,0 +1,5 @@
# textdomain: bucket
Empty Bucket=Tom hink
Water Bucket=Vattenhink
River Water Bucket=Flodvattenshink
Lava Bucket=Lavahink

View File

@ -0,0 +1,5 @@
# textdomain: bucket
Empty Bucket=Порожнє відро
Water Bucket=Відро з водою
River Water Bucket=Відро з річковою водою
Lava Bucket=Відро з лавою

View File

@ -0,0 +1,4 @@
# textdomain: butterflies
White Butterfly=Blanka Papilio
Red Butterfly=Ruĝa Papilio
Violet Butterfly=Violkolora Papilio

View File

@ -0,0 +1,4 @@
# textdomain: butterflies
White Butterfly=白色の蝶
Red Butterfly=赤色の蝶
Violet Butterfly=紫色の蝶

View File

@ -0,0 +1,4 @@
# textdomain: butterflies
White Butterfly=Biały motyl
Red Butterfly=Czerwony motyl
Violet Butterfly=Fioletowy motyl

View File

@ -0,0 +1,4 @@
# textdomain: butterflies
White Butterfly=Білий метелик
Red Butterfly=Червоний метелик
Violet Butterfly=Фіолетовий метелик

View File

@ -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
update.vel = true
end
-- 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_dir = vector.new(dir)
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

View File

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

View 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

View File

@ -0,0 +1,6 @@
# textdomain: carts
Cart=トロッコ
(Sneak+Click to pick up)=(スニークキーとクリックで乗ります)
Rail=レール
Powered Rail=パワードレール
Brake Rail=ブレーキレール

View 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

View File

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

View File

@ -0,0 +1,6 @@
# textdomain: carts
Cart=Вагонетка
(Sneak+Click to pick up)=(Пригніться та натисніть, щоби підібрати)
Rail=Рейки
Powered Rail=Електричні рейки
Brake Rail=Гальмівні рейки

View File

@ -46,34 +46,36 @@ end
dofile(minetest.get_modpath("creative") .. "/inventory.lua")
if minetest.is_creative_enabled("") then
-- Dig time is modified according to difference (leveldiff) between tool
-- 'maxlevel' and node 'level'. Digtime is divided by the larger of
-- leveldiff and 1.
-- To speed up digging in creative, hand 'maxlevel' and 'digtime' have been
-- increased such that nodes of differing levels have an insignificant
-- effect on digtime.
local digtime = 42
local caps = {times = {digtime, digtime, digtime}, uses = 0, maxlevel = 256}
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.
-- To speed up digging in creative, hand 'maxlevel' and 'digtime' have been
-- increased such that nodes of differing levels have an insignificant
-- effect on digtime.
local digtime = 42
local caps = {times = {digtime, digtime, digtime}, uses = 0, maxlevel = 256}
-- Override the hand tool
minetest.override_item("", {
range = 10,
tool_capabilities = {
full_punch_interval = 0.5,
max_drop_level = 3,
groupcaps = {
crumbly = caps,
cracky = caps,
snappy = caps,
choppy = caps,
oddly_breakable_by_hand = caps,
-- dig_immediate group doesn't use value 1. Value 3 is instant dig
dig_immediate =
{times = {[2] = digtime, [3] = 0}, uses = 0, maxlevel = 256},
},
damage_groups = {fleshy = 10},
}
})
-- Override the hand tool
minetest.override_item("", {
range = 10,
tool_capabilities = {
full_punch_interval = 0.5,
max_drop_level = 3,
groupcaps = {
crumbly = caps,
cracky = caps,
snappy = caps,
choppy = caps,
oddly_breakable_by_hand = caps,
-- dig_immediate group doesn't use value 1. Value 3 is instant dig
dig_immediate =
{times = {[2] = digtime, [3] = 0}, uses = 0, maxlevel = 256},
},
damage_groups = {fleshy = 10},
}
})
end)
end
-- Unlimited node placement

View File

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

View File

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

View 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

View File

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

View File

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

View File

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

View File

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

View 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=アイテム

View File

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

View File

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

View 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

View File

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

View File

@ -1,5 +1,6 @@
# textdomain: creative
Allow player to use creative inventory=Разрешить игроку использовать творческий инвентарь
No items to show.=
Search=Поиск
Reset=Сброс
Previous page=Предыдущая страница

View File

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

View File

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

View 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

View 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=Предмети

View File

@ -1,5 +1,6 @@
# textdomain: creative
Allow player to use creative inventory=允许玩家使用创造模式物品栏
No items to show.=
Search=搜索
Reset=重置
Previous page=上一页

View File

@ -1,5 +1,6 @@
# textdomain: creative
Allow player to use creative inventory=允許玩家使用創造模式物品欄
No items to show.=
Search=搜索
Reset=重置
Previous page=上一頁

View File

@ -1,5 +1,6 @@
# textdomain: creative
Allow player to use creative inventory=
No items to show.=
Search=
Reset=
Previous page=

View File

@ -1,3 +1,3 @@
name = creative
description = Minetest Game mod: creative
depends = default, sfinv
depends = sfinv

View File

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

View File

@ -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.sound_play(sound, {gain = 0.3, pos = pos,
max_hear_distance = 10}, true)
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", {

View File

@ -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 = formspec_core(tab) .. formspec_write(title, text)
end
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_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",

View File

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

View File

@ -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
@ -177,8 +191,15 @@ local function furnace_node_timer(pos, elapsed)
fuel_totaltime = 0
src_time = 0
else
-- Take fuel from fuel list
inv:set_stack("fuel", 1, afterfuel.items[1])
-- 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,

View File

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

View File

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

View File

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

View File

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

View 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

View File

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

View File

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