1
0
mirror of https://github.com/minetest/minetest_game.git synced 2025-06-29 05:10:25 +02:00

Compare commits

..

66 Commits

Author SHA1 Message Date
bb2876eebf Merge remote-tracking branch 'upstream/master' into experimental 2021-04-08 22:50:46 +02:00
41c2045fb0 Remove some obsolete sounds 2021-04-04 15:06:10 +02:00
250ef99721 Merge tag '5.4.0' into nalc-dev
5.4.0
2021-02-25 22:19:07 +01:00
5e35fdc2a9 Ajoute paramètres dans minetest.conf 2020-11-14 17:00:32 +01:00
3f064d5ed4 Merge remote-tracking branch 'upstream/stable-5' into nalc-dev 2020-07-18 11:48:46 +02:00
b3e660e897 Merge tag '5.3.0' into nalc-dev
5.3.0
2020-07-12 13:11:07 +02:00
cb2c416b51 Merge remote-tracking branch 'origin/stable-5' into HEAD 2020-07-09 22:15:23 +02:00
2fc9a68aa6 Merge remote-tracking branch 'upstream/stable-5' into nalc-dev 2020-05-09 01:07:25 +02:00
dcb3df0a38 Merge remote-tracking branch 'origin/stable-5' into HEAD 2020-04-05 18:48:33 +02:00
19d903e8b3 Met à jour les sons des pas dans la neige 2019-12-23 19:32:05 +01:00
721c598fbd Merge branch 'stable-5' of yunohost.local:minetest/minetest_game into nalc-dev 2019-12-23 19:08:11 +01:00
0a9e24622f Merge branch 'master' of https://github.com/minetest/minetest_game into stable-5 2019-10-12 15:53:20 +02:00
a0c658f4d1 Merge branch 'stable-5' into nalc-dev 2019-04-07 17:57:18 +02:00
9585eef042 Merge branch 'stable-5' of https://github.com/minetest/minetest_game into stable-5 2019-04-07 17:38:55 +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
2db0287652 Merge remote-tracking branch 'github/stable-5' into nalc-1.1-dev 2019-03-24 15:53:23 +01:00
806b29c2a1 Add food groups to blueberries (#2335) 2019-03-22 19:20:36 +00:00
3aa1117f4a Changements des bruitages du mod default par ceux de MFF. 2018-09-21 22:17:19 +02:00
630f24e747 Remplacement du nom du jeux. 2018-09-21 20:27:20 +02:00
d6a66860af Prevent divide by zero (#2106)
This forces all explosions to damage entities within the 1 node
range. If that needs to be disabled, the damage_radius needs to
be set to 0.
2018-05-18 12:50:47 +02:00
6d850f23a5 Flower spread ABM: Optimise
Match maximum spread density to maximum mapgen density for flowers.
Place 3 flora nodes at once instead of 1.
Change ABM chance value to 300 to match previous spread rate.
ABM becomes 3 times less intensive.
2018-05-18 12:50:47 +02:00
2c1af0861f Doors: Avoid crash on nil player in 'can dig door' 2018-05-18 12:50:47 +02:00
d2ae721235 Stairs: unbind table groups (#2036)
Unbind table groups for base block, stairs, slabs.
2018-05-18 12:50:18 +02:00
01db55cee5 default:dirt_with_snow: Re-add to soil group
Previously, saplings were not growing if the dirt they are on turned to
'dirt with snow' before growth.
Also for consistency with other dirt nodes.
2018-05-06 20:44:30 +02:00
4ba2b5179e Furnace: Fix being able to cook items without enough fuel
This was triggered when too much time had elapsed when timer was called.
Also, fix timer resolution giving free fuel time.
2018-05-06 20:44:30 +02:00
a5092c0df6 creative: Add missing tooltips. 2018-05-06 20:44:30 +02:00
575c098bae Book textures: Reset colour profiles to remove warnings 2018-05-06 20:44:22 +02:00
cddd59b578 Book textures: Replace with more original textures 2018-05-06 20:40:45 +02:00
7a4b1e0ce1 Default: Make burntimes more rational and consistent 2017-12-05 21:24:02 +01:00
0216fa08ec Add nil checks for placer 2017-11-19 23:03:38 +01:00
ca3e807d35 Creative: Make the placenode registration check for non-player placers 2017-11-19 23:03:38 +01:00
ca38bb2390 Creative: Make handle_node_drops override work for non-player diggers 2017-11-19 23:03:38 +01:00
7d07c52d09 Books: Convert \r to \n
Some files or editors may use \r instand of \n like notepad++. If you copy
text written in notepad++ and pasted into the book. The book will only have
one page.
2017-11-19 23:03:38 +01:00
532013a032 Creative: Cache inventory items on load 2017-11-19 23:03:38 +01:00
a52622669f TNT: Add tnt.boom defaults
This adds def, def.radius and def.damage_radius defaults to the
tnt.boom() function if they aren't specified on call.
2017-11-19 23:03:38 +01:00
ce5e668681 Bones: Return bones when taking the last ItemStack 2017-11-19 23:03:38 +01:00
6530fa914b Flowers: Add waterlily right-click checks
Check for on_rightclick functions of nodes when holding a waterlily.
2017-11-19 23:03:38 +01:00
86eb0e1617 Sfinv: Remove possibility of infinite loop when homepage doesn't exist 2017-11-19 23:03:38 +01:00
93fb9b36ce Sfinv: Rename navigation tabs to reduce chance of a conflict 2017-11-19 23:03:38 +01:00
09e3505ea1 Chests: Fix locked chest protection against explosions (#1886)
Fixes #1885
2017-11-19 23:03:38 +01:00
cecbfc1676 Chests: Fix open chest after player leave (#1884)
This should fix the chest staying open when a player disconnects while inside.
2017-11-19 23:03:38 +01:00
fba6f6a4cf TNT: Add explode_center flag
Add 'explode_centre' flag which when false explodes as normal and when true runs on_blast on centre node as well as dropping items.
2017-11-19 23:03:38 +01:00
6053456af1 Mushroom spread: Optimise and make overridable
Move mushroom spread ABM action into a global and overridable function.
Optimise spread code.
Reduce spread range to reduce spread through walls.
2017-11-19 23:03:38 +01:00
cc2f75b2f9 Register fence: Allow setting nodedefs to 'false' 2017-11-19 23:03:38 +01:00
b6ef71c92e TNT's tnt:boom cleanup (#1868)
The tnt:boom node doesn't actually need the on_construct and on_timer functions to remove the node after 0.4 seconds as the tnt_explode function already does this beforehand.
2017-11-19 23:03:38 +01:00
876da2fbc6 Beds: Do not crash when placing in an unknown node 2017-11-19 23:03:38 +01:00
ea45ca57a5 Lava cooling: Increase interval to 2
An excessive load has been reported caused by the node searching, so even
when no lava is present.
2017-11-19 23:03:34 +01:00
6fa3ebfa75 Carts: Check for last pathfinder predition too Minor fix to reduce cart jitter slightly 2017-11-19 22:57:28 +01:00
efe6fb6dfb TNT: Only burn visually connected powder (#1857) 2017-11-19 22:57:28 +01:00
1aeb2baa91 Creative: Prevent unauthorized item access (#1840) 2017-11-19 22:57:28 +01:00
e4d6425846 Correct farming/stairs dependency (#1838) 2017-11-19 22:57:28 +01:00
81f885795d Crafting: Remove duplicate reversed recipes (#1777)
For axes and hoes only use one recipe that matches the appearance of the texture and in inventory.
2017-11-19 22:53:53 +01:00
f3e29bc2cc Saplings: Reduce grow time to ABM equivalent
Previous times were chosen using statistical maths, but reports suggested
this was too long.
I tested by timing an ABM acting on 100 nodes, with interval and chance equal
to the old sapling ABM.
50 at 4m59s.
99 at 24m58s.
100 at 26m58s.
So choose a grow time between 5 and 25 min for tree and bush saplings.
If 'can grow' is false at grow time the timer is reset to 5 min.
2017-11-19 22:53:53 +01:00
3a72f7b84b Add backface_culling to open chests and fencegates 2017-11-19 22:53:53 +01:00
Foz
20bd4560f8 TNT: Track TNT owner in metadata for protection mods
It is useful for protection mods to know who owns an exploding
TNT block. This allows the blocks destroyed by the TNT to be
limited to the same ones the owner could destroy without using
TNT.

TNT placed within a protected area by the area owner, and later
ignited by another player will destroy within the protected area
nodes the igniter may not otherwise be able to interact with. Any
player could significantly increase the size of an explosion by
placing more TNT in an adjacent unprotected area if the original
TNT block was placed withing 1 node of such a boundary. This
feature sounds dangerous, but we are talking about TNT. Players
should use it carefully.
2017-11-19 22:53:53 +01:00
8991b9fe54 Carts: Do not connect rails with gunpowder (#1812) 2017-11-19 22:53:53 +01:00
aea6c5dd1d Stairs: Add backface culling to stair meshes
If backface culling is not specified for a tile in 'images' it is set to true.
Slabs already have backface culling due to being defined as nodeboxes (which
are then converted to meshnodes).
2017-11-19 22:53:53 +01:00
da41caca66 Chests: Check 'def' of node above chest to avoid crash
In 'chest_lid_obstructed(pos)' check for nil 'def' to avoid a crash caused by
an unknown node above the chest.
2017-11-19 22:53:14 +01:00
103af98864 Books: Also limit the max size of the title
This limits the max size of the full title of the book to `80` letters and
the size of the part thats displayed in the tooltip to `35` letters.
2017-11-19 22:53:14 +01:00
26606b0520 Books: Limit the size of books
Really large books just waste hard drive space and the engine is not designed to
handle that much data in item metadata, this can cause strange things to happen.
2017-11-19 22:52:00 +01:00
706844e8bf Books: Add nil value checks to the book formspec handler 2017-11-19 22:52:00 +01:00
a56274c230 Stairs: Use one recipe matching inventory appearence
No longer have 2 recipes for stairs, choose the one that matches the appearence
in inventory (stair rising toward the right).
Helps to reduce recipe count now that an increasing number of stairs are
being registered.
2017-11-19 22:52:00 +01:00
3512226867 Default: Revert "Default: Shorter and better ABMs"
This reverts commit e523c3a296 to re-enable
the overriding and redefinition of these global functions.
2017-11-19 17:16:32 +01:00
d5b9fee6fe Merge 0.4.16 into stable-0.4 2017-06-03 17:22:59 -04:00
437860feff Merge tag '0.4.15' into stable-0.4
0.4.15
2016-12-22 23:00:57 +01:00
393 changed files with 1807 additions and 4798 deletions

View File

@ -1,16 +0,0 @@
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,10 +1,6 @@
unused_args = false unused_args = false
allow_defined_top = true allow_defined_top = true
globals = {
"default"
}
read_globals = { read_globals = {
"DIR_DELIM", "DIR_DELIM",
"minetest", "minetest",

11
.travis.yml Normal file
View File

@ -0,0 +1,11 @@
language: generic
addons:
apt:
packages:
- luarocks
before_install:
- luarocks install --local luacheck
script:
- $HOME/.luarocks/bin/luacheck ./mods
notifications:
email: false

View File

@ -1,43 +1,31 @@
# Minetest Game # Minetest Game
[![ContentDB](https://content.minetest.net/packages/Minetest/minetest_game/shields/title/)](https://content.minetest.net/packages/Minetest/minetest_game/) The default game bundled in the Minetest engine.
Minetest Game (abbreviated MTG) is a simple and peaceful sandbox game, with no For further information, check
real goals or built-in enemy mobs. [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)
While it provides a basic gameplay experience out of the box, it is best played for more information.
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 ## Installation
### ContentDB - Unzip the archive, rename the folder to minetest_game and
place it in .. minetest/games/
* Content > Browse Online Content - GNU/Linux: If you use a system-wide installation place
* Search for Minetest Game it in ~/.minetest/games/.
* 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). The Minetest engine can be found at [GitHub](https://github.com/minetest/minetest).
For further information or help, see: [Installing Mods](https://wiki.minetest.net/Installing_Mods). For further information or help, see:
https://wiki.minetest.net/Installing_Mods
## Compatibility ## Compatibility
The Minetest Game GitHub `master` `HEAD` is generally compatible with the GitHub The Minetest Game GitHub master HEAD is generally compatible with the GitHub
`master` `HEAD` of the Minetest engine. master HEAD of the Minetest engine.
Additionally, when the Minetest engine is tagged to be a certain version (e.g. Additionally, when the Minetest engine is tagged to be a certain version (e.g.
`0.4.10`), Minetest Game is tagged with the version, too. 0.4.10), Minetest Game is tagged with the version too.
When stable releases are made, Minetest Game and the Minetest engine is packaged 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/). and made available at [www.minetest.net](https://www.minetest.net/downloads/).

View File

@ -1,4 +1,3 @@
title = Minetest Game name = Notre Ami Le Cube 1.2
author = Minetest author = Minetest and Sys4
description = A basic exploration, mining, crafting, and building, sandbox game with no NPCs, monsters, or animals. Minetest Game is usually used with mods added, and many mods are available for this game. Reliably maintained by Minetest Engine core developers. description = Minetest game slightly modified by Sys4
min_minetest_version = 5.8

View File

@ -49,8 +49,6 @@ Beds API
* `beds.read_spawns() ` Returns a table containing players respawn positions * `beds.read_spawns() ` Returns a table containing players respawn positions
* `beds.kick_players()` Forces all players to leave bed * `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.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 ### Bed definition
@ -220,8 +218,6 @@ The doors mod allows modders to register custom doors and trapdoors.
description = "Door description", description = "Door description",
inventory_image = "mod_door_inv.png", inventory_image = "mod_door_inv.png",
groups = {choppy = 2}, 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. tiles = {"mod_door.png"}, -- UV map.
-- The front and back of the door must be identical in appearence as they swap on -- The front and back of the door must be identical in appearence as they swap on
-- open/close. -- open/close.
@ -229,20 +225,14 @@ The doors mod allows modders to register custom doors and trapdoors.
sounds = default.node_sound_wood_defaults(), -- optional sounds = default.node_sound_wood_defaults(), -- optional
sound_open = sound play for open door, -- optional sound_open = sound play for open door, -- optional
sound_close = sound play for close 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) 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 -- optional function containing the on_rightclick callback, defaults to a doors.door_toggle-wrapper
use_texture_alpha = "clip",
### Trapdoor definition ### Trapdoor definition
description = "Trapdoor description", description = "Trapdoor description",
inventory_image = "mod_trapdoor_inv.png", 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}, groups = {choppy = 2},
tile_front = "doors_trapdoor.png", -- the texture for the front and back of the trapdoor tile_front = "doors_trapdoor.png", -- the texture for the front and back of the trapdoor
tile_side = "doors_trapdoor_side.png", tile_side = "doors_trapdoor_side.png",
@ -254,12 +244,11 @@ The doors mod allows modders to register custom doors and trapdoors.
sounds = default.node_sound_wood_defaults(), -- optional sounds = default.node_sound_wood_defaults(), -- optional
sound_open = sound play for open door, -- optional sound_open = sound play for open door, -- optional
sound_close = sound play for close 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) 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)
-- function containing the on_rightclick callback
on_rightclick = function(pos, node, clicker, itemstack, pointed_thing)
-- function containing the on_rightclick callback -- function containing the on_rightclick callback
use_texture_alpha = "clip",
### Fence gate definition ### Fence gate definition
@ -442,11 +431,6 @@ Player API
The player API can register player models and update the player's appearance. 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)` * `player_api.register_model(name, def)`
* Register a new model to be used by players * Register a new model to be used by players
* `name`: model filename such as "character.x", "foo.b3d", etc. * `name`: model filename such as "character.x", "foo.b3d", etc.
@ -461,25 +445,19 @@ The player API can register player models and update the player's appearance.
* `player_api.set_model(player, model_name)` * `player_api.set_model(player, model_name)`
* Change a player's model * Change a player's model
* `player`: PlayerRef * `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)` * `player_api.set_animation(player, anim_name, speed)`
* Applies an animation to a player if speed or anim_name differ from the currently playing animation * Applies an animation to a player
* `player`: PlayerRef * `player`: PlayerRef
* `anim_name`: name of the animation * `anim_name`: name of the animation
* `speed`: keyframes per second. If nil, the default from the model def is used * `speed`: frames per second. If nil, the default from the model def is used
* `player_api.set_textures(player, textures)` * `player_api.set_textures(player, textures)`
* Sets player textures * Sets player textures
* `player`: PlayerRef * `player`: PlayerRef
* `textures`: array of textures. If nil, the default from the model def is used * `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)` * `player_api.get_animation(player)`
* Returns a table containing fields `model`, `textures` and `animation` * Returns a table containing fields `model`, `textures` and `animation`
* Any of the fields of the returned table may be nil * Any of the fields of the returned table may be nil
@ -495,25 +473,18 @@ The player API can register player models and update the player's appearance.
### Model Definition ### Model Definition
{ {
animation_speed = 30, -- Default animation speed, in keyframes per second animation_speed = 30, -- Default animation speed, in FPS
textures = {"character.png"}, -- Default array of textures textures = {"character.png", }, -- Default array of textures
visual_size = {x = 1, y = 1}, -- Used to scale the model
animations = { animations = {
-- [anim_name] = { -- <anim_name> = {x = <start_frame>, y = <end_frame>},
-- x = <start_frame>, foo = {x = 0, y = 19},
-- y = <end_frame>, bar = {x = 20, y = 39},
-- 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
}, },
-- Default object properties, see lua_api.txt collisionbox = {-0.3, 0.0, -0.3, 0.3, 1.7, 0.3}, -- In nodes from feet position
visual_size = {x = 1, y = 1}, stepheight = 0.6, -- In nodes
collisionbox = {-0.3, 0.0, -0.3, 0.3, 1.7, 0.3}, eye_height = 1.47, -- In nodes above feet position
stepheight = 0.6,
eye_height = 1.47
} }
@ -748,12 +719,6 @@ Stairs API
The stairs API lets you register stairs and slabs and ensures that they are registered the same way as those 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. 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)` `stairs.register_stair(subname, recipeitem, groups, images, description, sounds, worldaligntex)`
* Registers a stair * Registers a stair
@ -1028,27 +993,6 @@ Trees
* `default.grow_blueberry_bush(pos)` * `default.grow_blueberry_bush(pos)`
* Grows a blueberry bush at 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 Carts
----- -----
@ -1138,34 +1082,3 @@ This function registers a shapeless recipe that takes `ingredient`
and `result` as input and outputs `result`. and `result` as input and outputs `result`.
The metadata of the input `result` is copied to the output `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

@ -0,0 +1,76 @@
# This file contains settings of Minetest Game that can be changed in
# minetest.conf.
# By default, all the settings are commented and not functional.
# Uncomment settings by removing the preceding #.
# Whether creative mode (fast digging of all blocks, unlimited resources) should
# be enabled.
creative_mode = false
# Sets the behaviour of the inventory items when a player dies.
# bones: Store items in a bone node but drop items if inside protected area.
# drop: Drop items on the ground.
# keep: Player keeps items.
bones_mode = bones
# The time in seconds after which the bones of a dead player can be looted by
# everyone.
# 0 to disable.
share_bones_time = 1200
# How much earlier the bones of a dead player can be looted by
# everyone if the player dies in a protected area they don't own.
# 0 to disable. By default it is "share_bones_time" divide by four.
share_bones_time_early = 300
# Inform player of condition and location of new bones.
bones_position_message = true
# Whether fire should be enabled. If disabled, 'basic_flame' nodes will
# disappear.
# 'permanent_flame' nodes will remain with either setting.
enable_fire = false
# Enable flame sound.
flame_sound = true
# Whether lavacooling should be enabled.
enable_lavacooling = true
# Whether the stuff in initial_stuff should be given to new players.
give_initial_stuff = true
initial_stuff = default:axe_wood,default:torch 9,default:sapling 2,default:apple 5
# Whether the TNT mod should be enabled.
enable_tnt = true
# The radius of a TNT explosion.
tnt_radius = 3
# Enable the stairs mod ABM that replaces the old 'upside down'
# stair and slab nodes in old maps with the new param2 versions.
enable_stairs_replace_abm = false
# Whether to allow respawning in beds.
# Default value is true.
enable_bed_respawn = true
# Whether players can skip night by sleeping.
# Default value is true.
enable_bed_night_skip = true
# If enabled, fences and walls cannot be jumped over.
enable_fence_tall = true
# Whether the engine's spawn search, which does not check for a suitable
# starting biome, is used.
# Default value is false.
engine_spawn = false
# Whether river water source nodes create flowing sounds.
# Helps rivers create more sound, especially on level sections.
river_source_sounds = true
# Enable cloud variation by the 'weather' mod.
# Non-functional in V6 or Singlenode mapgens.
enable_weather = true

View File

@ -72,9 +72,6 @@ default:torch 99,default:cobble 99
# Helps rivers create more sound, especially on level sections. # Helps rivers create more sound, especially on level sections.
#river_source_sounds = false #river_source_sounds = false
# Enable cloud and shadow intensity variation by the 'weather' mod. # Enable cloud variation by the 'weather' mod.
# Non-functional in V6 or Singlenode mapgens. # Non-functional in V6 or Singlenode mapgens.
#enable_weather = true #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 dir = minetest.facedir_to_dir(node.param2)
local p = vector.add(pos, dir) local p = vector.add(pos, dir)
local node2 = minetest.get_node_or_nil(p) local node2 = minetest.get_node_or_nil(p)
if not node2 or minetest.get_item_group(node2.name, "bed") ~= 2 or if not node2 or not minetest.get_item_group(node2.name, "bed") == 2 or
node.param2 ~= node2.param2 then not node.param2 == node2.param2 then
return false return false
end end
if minetest.is_protected(p, user:get_player_name()) then 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_top_bottom.png^[transformR90",
"beds_bed_under.png", "beds_bed_under.png",
"beds_bed_side_bottom_r.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_transparent.png",
"beds_bed_side_bottom.png" "beds_bed_side_bottom.png"
}, },
@ -73,7 +73,7 @@ beds.register_bed("beds:bed", {
"beds_bed_top_top.png^[transformR90", "beds_bed_top_top.png^[transformR90",
"beds_bed_under.png", "beds_bed_under.png",
"beds_bed_side_top_r.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_bed_side_top.png",
"beds_transparent.png", "beds_transparent.png",
} }

View File

@ -102,11 +102,6 @@ local function lay_down(player, pos, bed_pos, state, skip)
return false return false
end end
-- Check if player is attached to an object
if player:get_attach() then
return false
end
if beds.player[name] then if beds.player[name] then
-- player already in bed, do nothing -- player already in bed, do nothing
return false return false
@ -116,6 +111,8 @@ local function lay_down(player, pos, bed_pos, state, skip)
beds.bed_position[name] = bed_pos beds.bed_position[name] = bed_pos
beds.player[name] = {physics_override = player:get_physics_override()} 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) local yaw, param2 = get_look_yaw(bed_pos)
player:set_look_horizontal(yaw) player:set_look_horizontal(yaw)
local dir = minetest.facedir_to_dir(param2) local dir = minetest.facedir_to_dir(param2)
@ -181,32 +178,12 @@ function beds.skip_night()
minetest.set_timeofday(0.23) minetest.set_timeofday(0.23)
end 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) function beds.on_rightclick(pos, player)
local name = player:get_player_name() local name = player:get_player_name()
local ppos = player:get_pos() local ppos = player:get_pos()
local tod = minetest.get_timeofday() local tod = minetest.get_timeofday()
if tod > beds.day_interval.start and tod < beds.day_interval.finish then if tod > 0.2 and tod < 0.805 then
if beds.player[name] then if beds.player[name] then
lay_down(player, nil, nil, false) lay_down(player, nil, nil, false)
end end
@ -226,8 +203,17 @@ function beds.on_rightclick(pos, player)
update_formspecs(false) update_formspecs(false)
end end
-- skip the night and let all players stand up
if check_in_beds() then if check_in_beds() then
schedule_update() 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)
end end
end end
@ -260,7 +246,13 @@ minetest.register_on_leaveplayer(function(player)
lay_down(player, nil, nil, false, true) lay_down(player, nil, nil, false, true)
beds.player[name] = nil beds.player[name] = nil
if check_in_beds() then if check_in_beds() then
schedule_update() minetest.after(2, function()
update_formspecs(is_night_skip_enabled())
if is_night_skip_enabled() then
beds.skip_night()
beds.kick_players()
end
end)
end end
end) end)

View File

@ -16,11 +16,6 @@ beds.formspec = "size[8,11;true]" ..
"bgcolor[#080808BB;true]" .. "bgcolor[#080808BB;true]" ..
"button_exit[2,10;4,0.75;leave;" .. esc(S("Leave Bed")) .. "]" "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") local modpath = minetest.get_modpath("beds")
-- Load files -- Load files

View File

@ -1,10 +0,0 @@
# 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 # textdomain: beds
Fancy Bed=Lit chic Fancy Bed=Lit chic
Simple Bed=Lit simple Simple Bed=Lit simple
This bed is already occupied!=Ce lit est déjà occupé ! This bed is already occupied!=
You have to stop moving before going to bed!=Vous devez arrêter de bouger avant de vous coucher ! You have to stop moving before going to bed!=
Good morning.=Bonjour. Good morning.=Bonjour.
@1 of @2 players are in bed=@1 joueur(s) sur @2 sont au lit @1 of @2 players are in bed=@1 joueur(s) sur @2 sont au lit
Force night skip=Forcer le passage de la nuit Force night skip=Forcer le passage de la nuit

View File

@ -1,10 +1,10 @@
# textdomain: beds # textdomain: beds
Fancy Bed=Ranjang Mewah Fancy Bed=Ranjang Mewah
Simple Bed=Ranjang Sederhana Simple Bed=Ranjang Sederhana
This bed is already occupied!=Ranjang telah terisi! This bed is already occupied!=
You have to stop moving before going to bed!=Anda harus diam untuk tidur! You have to stop moving before going to bed!=
Good morning.=Selamat pagi. Good morning.=Selamat pagi.
@1 of @2 players are in bed=@1 dari @2 pemain sedang tidur @1 of @2 players are in bed=@1 dari @2 pemain sedang tidur
Force night skip=Paksa lewati malam Force night skip=Paksa lewati malam
You can only sleep at night.=Anda hanya bisa tidur pada waktu malam. You can only sleep at night.=Anda hanya dapat tidur pada waktu malam.
Leave Bed=Tinggalkan Ranjang Leave Bed=Tinggalkan Ranjang

View File

@ -1,10 +0,0 @@
# 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 # textdomain: beds
Fancy Bed=Katil Beragam Fancy Bed=Katil Beragam
Simple Bed=Katil Biasa Simple Bed=Katil Biasa
This bed is already occupied!=Katil ini sudah diduduki! This bed is already occupied!=
You have to stop moving before going to bed!=Anda perlu berhenti bergerak sebelum tidur! You have to stop moving before going to bed!=
Good morning.=Selamat pagi. Good morning.=Selamat pagi.
@1 of @2 players are in bed=@1 daripada @2 pemain sedang tidur @1 of @2 players are in bed=@1 daripada @2 pemain sedang tidur
Force night skip=Paksa langkau malam Force night skip=Paksa langkau malam
You can only sleep at night.=Anda hanya boleh tidur pada waktu malam. You can only sleep at night.=Anda hanya boleh tidur pada waktu malam.
Leave Bed=Tinggalkan Katil Leave Bed=Bangun

View File

@ -1,10 +0,0 @@
# 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 # textdomain: beds
Fancy Bed=Детализированная Кровать Fancy Bed=Детализированная Кровать
Simple Bed=Обычная Кровать Simple Bed=Обычная Кровать
This bed is already occupied!=Эта кровать уже занята! This bed is already occupied!=
You have to stop moving before going to bed!=Нельзя воспользоваться кроватью на ходу! You have to stop moving before going to bed!=
Good morning.=Доброе утро. Good morning.=Доброе утро.
@1 of @2 players are in bed=@1 из @2 игроков в кровати @1 of @2 players are in bed=@1 из @2 игроков в кровати
Force night skip=Пропустить ночь Force night skip=Пропустить ночь

View File

@ -0,0 +1,10 @@
# 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 # textdomain: beds
Fancy Bed=Pekná posteľ Fancy Bed=Pekná posteľ
Simple Bed=Jednoduchá posteľ Simple Bed=Jednoduchá posteľ
This bed is already occupied!=Táto posteľ je už obsadená This bed is already occupied!=
You have to stop moving before going to bed!=Predtým ako si ľahneš do postele, sa musíš prestať pohybovať! You have to stop moving before going to bed!=
Good morning.=Dobré ráno. Good morning.=Dobré ráno.
@1 of @2 players are in bed=@1 z @2 hráčov sú v posteli @1 of @2 players are in bed=@1 z @2 hráčov sú v posteli
Force night skip=Nútene preskočiť noc Force night skip=Nútene preskočiť noc

View File

@ -1,10 +0,0 @@
# 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

@ -1,10 +0,0 @@
# 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 # textdomain: beds
Fancy Bed=花式床 Fancy Bed=花式床
Simple Bed=简易床 Simple Bed=简易床
This bed is already occupied!=床上已有人! This bed is already occupied!=
You have to stop moving before going to bed!=上床前要停止移动! You have to stop moving before going to bed!=
Good morning.=早安! Good morning.=早安!
@1 of @2 players are in bed=@2位玩家中的@1位在床上 @1 of @2 players are in bed=@2位玩家中的@1位在床上
Force night skip=强制跳过夜晚 Force night skip=强制跳过夜晚

View File

@ -1,8 +1,8 @@
# textdomain: beds # textdomain: beds
Fancy Bed=花式床 Fancy Bed=花式床
Simple Bed=簡易床 Simple Bed=簡易床
This bed is already occupied!=這個床已經被占據了! This bed is already occupied!=
You have to stop moving before going to bed!=你必須在上床前停止移動! You have to stop moving before going to bed!=
Good morning.=早安! Good morning.=早安!
@1 of @2 players are in bed=@2位玩家中的@1位在床上 @1 of @2 players are in bed=@2位玩家中的@1位在床上
Force night skip=強制跳過夜晚 Force night skip=強制跳過夜晚

View File

@ -53,7 +53,6 @@ minetest.register_craftitem("binoculars:binoculars", {
description = S("Binoculars") .. "\n" .. S("Use with 'Zoom' key"), description = S("Binoculars") .. "\n" .. S("Use with 'Zoom' key"),
inventory_image = "binoculars_binoculars.png", inventory_image = "binoculars_binoculars.png",
stack_max = 1, stack_max = 1,
groups = {tool = 1},
on_use = function(itemstack, user, pointed_thing) on_use = function(itemstack, user, pointed_thing)
binoculars.update_player_property(user) binoculars.update_player_property(user)

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -53,24 +53,31 @@ function boat.on_rightclick(self, clicker)
end end
local name = clicker:get_player_name() local name = clicker:get_player_name()
if self.driver and name == self.driver then if self.driver and name == self.driver then
-- Cleanup happens in boat.on_detach_child self.driver = nil
self.auto = false
clicker:set_detach() 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() local pos = clicker:get_pos()
pos = {x = pos.x, y = pos.y + 0.2, z = pos.z} pos = {x = pos.x, y = pos.y + 0.2, z = pos.z}
minetest.after(0.1, function() minetest.after(0.1, function()
clicker:set_pos(pos) clicker:set_pos(pos)
end) end)
elseif not self.driver then 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, "", clicker:set_attach(self.object, "",
{x = 0.5, y = 1, z = -3}, {x = 0, y = 0, z = 0}) {x = 0.5, y = 1, z = -3}, {x = 0, y = 0, z = 0})
self.driver = name
player_api.player_attached[name] = true player_api.player_attached[name] = true
minetest.after(0.2, function() minetest.after(0.2, function()
player_api.set_animation(clicker, "sit", 30) player_api.set_animation(clicker, "sit" , 30)
end) end)
clicker:set_look_horizontal(self.object:get_yaw()) clicker:set_look_horizontal(self.object:get_yaw())
end end
@ -79,12 +86,8 @@ end
-- If driver leaves server while driving boat -- If driver leaves server while driving boat
function boat.on_detach_child(self, child) function boat.on_detach_child(self, child)
if child and child:get_player_name() == self.driver then
player_api.player_attached[child:get_player_name()] = false
self.driver = nil self.driver = nil
self.auto = false self.auto = false
end
end end

View File

@ -1,4 +0,0 @@
# 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

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

View File

@ -1,4 +1,4 @@
# textdomain: boats # textdomain: boats
Boat cruise mode on=Mod jelajah bot dihidupkan Boat cruise mode on=Mod bot layar makan angin dibolehkan
Boat cruise mode off=Mod jelajah bot dimatikan Boat cruise mode off=Mod bot layar makan angin dilumpuhkan
Boat=Bot Boat=Bot

View File

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

View File

@ -1,4 +1,4 @@
# textdomain: boats # textdomain: boats
Boat cruise mode on=Cestovný režim loďky je zapnutý Boat cruise mode on=Cestovný režim loďky zapnutý
Boat cruise mode off=Cestovný režim loďky je vypnutý Boat cruise mode off=Cestovný režim loďky vypnutý
Boat=Loďka Boat=Loďka

View File

@ -1,4 +0,0 @@
# 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 = 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 local share_bones_time_early = tonumber(minetest.settings:get("share_bones_time_early")) or share_bones_time / 4
local bones_def = { minetest.register_node("bones:bones", {
description = S("Bones"), description = S("Bones"),
tiles = { tiles = {
"bones_top.png^[transform2", "bones_top.png^[transform2",
@ -130,11 +130,7 @@ local bones_def = {
end, end,
on_blast = function(pos) on_blast = function(pos)
end, end,
} })
default.set_inventory_action_loggers(bones_def, "bones")
minetest.register_node("bones:bones", bones_def)
local function may_replace(pos, player) local function may_replace(pos, player)
local node_name = minetest.get_node(pos).name local node_name = minetest.get_node(pos).name
@ -228,7 +224,7 @@ minetest.register_on_dieplayer(function(player)
-- check if it's possible to place bones, if not find space near 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 if bones_mode == "bones" and not may_replace(pos, player) then
local air = minetest.find_node_near(pos, 1, {"air"}) local air = minetest.find_node_near(pos, 1, {"air"})
if air then if air and not minetest.is_protected(air, player_name) then
pos = air pos = air
else else
bones_mode = "drop" bones_mode = "drop"

View File

@ -1,8 +0,0 @@
# 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

@ -1,8 +0,0 @@
# 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

@ -1,8 +0,0 @@
# 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 # textdomain: bones
Bones=Ben Bones=Ben
@1's old bones=@1s Gamla ben @1's old bones=@1s Gamla ben
@1 died at @2.=@1 dog på @2. @1 died at @2.=@1 dog på @a.
@1 died at @2, and dropped their inventory.=@1 dog på @2, och tappade deras saker. @1 died at @2, and dropped their inventory.=@1 dog på @a, och tappade deras saker.
@1 died at @2, and bones were placed.=@1 dog på @2, och deras ben var placerade. @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 fresh bones=@1s färska ben
@1's bones=@1s ben @1's bones=@1s ben

View File

@ -1,8 +0,0 @@
# 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=骨骸 Bones=骨骸
@1's old bones=@1的旧骨骸 @1's old bones=@1的旧骨骸
@1 died at @2.=@1在@2死亡。 @1 died at @2.=@1在@2死亡。
@1 died at @2, and dropped their inventory.=@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 bones were placed.=@1在@2死亡骨骸被放置
@1's fresh bones=@1的新鲜骨骸 @1's fresh bones=@1的新鲜骨骸
@1's bones=@1的骨骸 @1's bones=@1的骨骸

View File

@ -1,5 +0,0 @@
# 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

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

View File

@ -1,5 +0,0 @@
# 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

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -29,10 +29,15 @@ function cart_entity:on_rightclick(clicker)
end end
local player_name = clicker:get_player_name() local player_name = clicker:get_player_name()
if self.driver and player_name == self.driver then if self.driver and player_name == self.driver then
self.driver = nil
carts:manage_attachment(clicker, nil) carts:manage_attachment(clicker, nil)
elseif not self.driver then elseif not self.driver then
carts:manage_attachment(clicker, self.object)
self.driver = player_name 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")
end end
end end
@ -46,7 +51,9 @@ function cart_entity:on_activate(staticdata, dtime_s)
return return
end end
self.railtype = data.railtype self.railtype = data.railtype
self.old_dir = data.old_dir or self.old_dir if data.old_dir then
self.old_dir = data.old_dir
end
end end
function cart_entity:get_staticdata() function cart_entity:get_staticdata()
@ -59,9 +66,8 @@ end
-- 0.5.x and later: When the driver leaves -- 0.5.x and later: When the driver leaves
function cart_entity:on_detach_child(child) function cart_entity:on_detach_child(child)
if child and child:get_player_name() == self.driver then if child and child:get_player_name() == self.driver then
-- Clean up eye height
carts:manage_attachment(child, nil)
self.driver = nil self.driver = nil
carts:manage_attachment(child, nil)
end end
end end
@ -128,8 +134,7 @@ function cart_entity:on_punch(puncher, time_from_last_punch, tool_capabilities,
end end
local punch_interval = 1 local punch_interval = 1
-- Faulty tool registrations may cause the interval to be set to 0 ! if tool_capabilities and tool_capabilities.full_punch_interval then
if tool_capabilities and (tool_capabilities.full_punch_interval or 0) > 0 then
punch_interval = tool_capabilities.full_punch_interval punch_interval = tool_capabilities.full_punch_interval
end end
time_from_last_punch = math.min(time_from_last_punch or punch_interval, punch_interval) time_from_last_punch = math.min(time_from_last_punch or punch_interval, punch_interval)
@ -190,11 +195,11 @@ local function rail_on_step(self, dtime)
end end
local pos = self.object:get_pos() local pos = self.object:get_pos()
local dir = carts:velocity_to_dir(vel) local cart_dir = carts:velocity_to_dir(vel)
local dir_changed = not vector.equals(dir, self.old_dir) local same_dir = vector.equals(cart_dir, self.old_dir)
local update = {} local update = {}
if self.old_pos and not self.punched and not dir_changed then if self.old_pos and not self.punched and same_dir then
local flo_pos = vector.round(pos) local flo_pos = vector.round(pos)
local flo_old = vector.round(self.old_pos) local flo_old = vector.round(self.old_pos)
if vector.equals(flo_pos, flo_old) then if vector.equals(flo_pos, flo_old) then
@ -214,7 +219,7 @@ local function rail_on_step(self, dtime)
end end
local stop_wiggle = false local stop_wiggle = false
if self.old_pos and not dir_changed then if self.old_pos and same_dir then
-- Detection for "skipping" nodes (perhaps use average dtime?) -- Detection for "skipping" nodes (perhaps use average dtime?)
-- It's sophisticated enough to take the acceleration in account -- It's sophisticated enough to take the acceleration in account
local acc = self.object:get_acceleration() local acc = self.object:get_acceleration()
@ -229,7 +234,7 @@ local function rail_on_step(self, dtime)
-- No rail found: set to the expected position -- No rail found: set to the expected position
pos = new_pos pos = new_pos
update.pos = true update.pos = true
dir = new_dir cart_dir = new_dir
end end
elseif self.old_pos and self.old_dir.y ~= 1 and not self.punched then elseif self.old_pos and self.old_dir.y ~= 1 and not self.punched then
-- Stop wiggle -- Stop wiggle
@ -239,27 +244,21 @@ local function rail_on_step(self, dtime)
local railparams local railparams
-- dir: New moving direction of the cart -- dir: New moving direction of the cart
-- switch_keys: Currently pressed L(1) or R(2) key, -- switch_keys: Currently pressed L/R key, used to ignore the key on the next rail node
-- used to ignore the key on the next rail node local dir, switch_keys = carts:get_rail_direction(
local switch_keys pos, cart_dir, ctrl, self.old_switch, self.railtype
dir, switch_keys = carts:get_rail_direction(
pos, dir, ctrl, self.old_switch, self.railtype
) )
dir_changed = not vector.equals(dir, self.old_dir) local dir_changed = not vector.equals(dir, self.old_dir)
local acc = 0 local new_acc = {x=0, y=0, z=0}
if stop_wiggle or vector.equals(dir, {x=0, y=0, z=0}) then 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} vel = {x = 0, y = 0, z = 0}
local pos_r = vector.round(pos) local pos_r = vector.round(pos)
if not carts:is_rail(pos_r, self.railtype) if not carts:is_rail(pos_r, self.railtype)
and self.old_pos then and self.old_pos then
pos = self.old_pos pos = self.old_pos
elseif not stop_wiggle then elseif not stop_wiggle then
-- End of rail: Smooth out.
pos = pos_r pos = pos_r
dir_changed = false
dir.y = 0
else else
pos.y = math.floor(pos.y + 0.5) pos.y = math.floor(pos.y + 0.5)
end end
@ -286,7 +285,7 @@ local function rail_on_step(self, dtime)
end end
-- Slow down or speed up.. -- Slow down or speed up..
acc = dir.y * -4.0 local acc = dir.y * -4.0
-- Get rail for corrected position -- Get rail for corrected position
railparams = get_railparams(pos) railparams = get_railparams(pos)
@ -304,22 +303,25 @@ local function rail_on_step(self, dtime)
acc = acc - 0.4 acc = acc - 0.4
end end
end end
new_acc = vector.multiply(dir, acc)
end end
-- Limit cart speed -- Limits
local vel_len = vector.length(vel) local max_vel = carts.speed_max
if vel_len > carts.speed_max then for _, v in pairs({"x","y","z"}) do
vel = vector.multiply(vel, carts.speed_max / vel_len) if math.abs(vel[v]) > max_vel then
vel[v] = carts:get_sign(vel[v]) * max_vel
new_acc[v] = 0
update.vel = true update.vel = true
end end
if vel_len >= carts.speed_max and acc > 0 then
acc = 0
end end
self.object:set_acceleration(vector.multiply(dir, acc)) self.object:set_acceleration(new_acc)
self.old_pos = vector.round(pos) 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) self.old_dir = vector.new(dir)
end
self.old_switch = switch_keys self.old_switch = switch_keys
if self.punched then if self.punched then
@ -345,11 +347,11 @@ local function rail_on_step(self, dtime)
end end
local yaw = 0 local yaw = 0
if dir.x < 0 then if self.old_dir.x < 0 then
yaw = 0.5 yaw = 0.5
elseif dir.x > 0 then elseif self.old_dir.x > 0 then
yaw = 1.5 yaw = 1.5
elseif dir.z < 0 then elseif self.old_dir.z < 0 then
yaw = 1 yaw = 1
end end
self.object:set_yaw(yaw * math.pi) self.object:set_yaw(yaw * math.pi)
@ -399,7 +401,7 @@ minetest.register_craftitem("carts:cart", {
pointed_thing) or itemstack pointed_thing) or itemstack
end end
if pointed_thing.type ~= "node" then if not pointed_thing.type == "node" then
return return
end end
if carts:is_rail(pointed_thing.under) then if carts:is_rail(pointed_thing.under) then

View File

@ -12,7 +12,7 @@ function carts:manage_attachment(player, obj)
end end
local status = obj ~= nil local status = obj ~= nil
local player_name = player:get_player_name() local player_name = player:get_player_name()
if obj and player:get_attach() == obj then if player_api.player_attached[player_name] == status then
return return
end end
player_api.player_attached[player_name] = status player_api.player_attached[player_name] = status
@ -20,10 +20,6 @@ function carts:manage_attachment(player, obj)
if status then if status then
player:set_attach(obj, "", {x=0, y=-4.5, z=0}, {x=0, y=0, z=0}) 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: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 else
player:set_detach() player:set_detach()
player:set_eye_offset({x=0, y=0, z=0},{x=0, y=0, z=0}) player:set_eye_offset({x=0, y=0, z=0},{x=0, y=0, z=0})

View File

@ -1,6 +0,0 @@
# 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

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

View File

@ -1,6 +0,0 @@
# 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) (Sneak+Click to pick up)=(Shift+Klicka för att plocka upp)
Rail=Räls Rail=Räls
Powered Rail=Aktiverad räls Powered Rail=Aktiverad räls
Brake Rail=Bromsräls Brake Rail=Broms räls

View File

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

View File

@ -46,7 +46,6 @@ end
dofile(minetest.get_modpath("creative") .. "/inventory.lua") dofile(minetest.get_modpath("creative") .. "/inventory.lua")
if minetest.is_creative_enabled("") then if minetest.is_creative_enabled("") then
minetest.register_on_mods_loaded(function()
-- Dig time is modified according to difference (leveldiff) between tool -- Dig time is modified according to difference (leveldiff) between tool
-- 'maxlevel' and node 'level'. Digtime is divided by the larger of -- 'maxlevel' and node 'level'. Digtime is divided by the larger of
-- leveldiff and 1. -- leveldiff and 1.
@ -75,7 +74,6 @@ if minetest.is_creative_enabled("") then
damage_groups = {fleshy = 10}, damage_groups = {fleshy = 10},
} }
}) })
end)
end end
-- Unlimited node placement -- Unlimited node placement

View File

@ -125,7 +125,7 @@ function creative.update_creative_inventory(player_name, tab_content)
end end
-- Create the trash field -- Create the trash field
local trash = minetest.create_detached_inventory("trash", { local trash = minetest.create_detached_inventory("creative_trash", {
-- Allow the stack to be placed and remove it in on_put() -- Allow the stack to be placed and remove it in on_put()
-- This allows the creative inventory to restore the stack -- This allows the creative inventory to restore the stack
allow_put = function(inv, listname, index, stack, player) allow_put = function(inv, listname, index, stack, player)
@ -150,18 +150,17 @@ function creative.register_tab(name, title, items)
creative.update_creative_inventory(player_name, items) creative.update_creative_inventory(player_name, items)
local inv = player_inventory[player_name] local inv = player_inventory[player_name]
local pagenum = math.floor(inv.start_i / (4*8) + 1) local pagenum = math.floor(inv.start_i / (4*8) + 1)
local pagemax = math.max(math.ceil(inv.size / (4*8)), 1) local pagemax = math.ceil(inv.size / (4*8))
local esc = minetest.formspec_escape local esc = minetest.formspec_escape
return sfinv.make_formspec(player, context, 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) .. "]" .. "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] image[4.08,4.2;0.8,0.8;creative_trash_icon.png]
listcolors[#00000069;#5A5A5A;#141318;#30434C;#FFF] listcolors[#00000069;#5A5A5A;#141318;#30434C;#FFF]
list[detached:trash;main;4.02,4.1;1,1;] list[detached:creative_trash;main;4.02,4.1;1,1;]
listring[] listring[]
image_button[5,4.05;0.8,0.8;creative_prev_icon.png;creative_prev;] image_button[5,4.05;0.8,0.8;creative_prev_icon.png;creative_prev;]
image_button[7.25,4.05;0.8,0.8;creative_next_icon.png;creative_next;] image_button[7.2,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[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;] image_button[3.25,4.05;0.8,0.8;creative_clear_icon.png;creative_clear;]
]] .. ]] ..
@ -192,13 +191,10 @@ function creative.register_tab(name, title, items)
inv.start_i = 0 inv.start_i = 0
inv.filter = "" inv.filter = ""
sfinv.set_player_inventory_formspec(player, context) sfinv.set_player_inventory_formspec(player, context)
elseif (fields.creative_search or elseif fields.creative_search or
fields.key_enter_field == "creative_filter") fields.key_enter_field == "creative_filter" then
and fields.creative_filter then
inv.start_i = 0 inv.start_i = 0
inv.filter = fields.creative_filter:sub(1, 128) -- truncate to a sane length inv.filter = fields.creative_filter:lower()
: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) sfinv.set_player_inventory_formspec(player, context)
elseif not fields.quit then elseif not fields.quit then
local start_i = inv.start_i or 0 local start_i = inv.start_i or 0

View File

@ -1,6 +1,5 @@
# textdomain: creative # textdomain: creative
Allow player to use creative inventory=Spieler erlauben, das Kreativinventar zu benutzen Allow player to use creative inventory=Spieler erlauben, das Kreativinventar zu benutzen
No items to show.=Keine Gegenstände vorhanden.
Search=Suchen Search=Suchen
Reset=Zurücksetzen Reset=Zurücksetzen
Previous page=Vorherige Seite Previous page=Vorherige Seite

View File

@ -1,11 +0,0 @@
# 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,8 +1,7 @@
# textdomain: creative # textdomain: creative
Allow player to use creative inventory=Permitir al jugador usar el inventario creativo Allow player to use creative inventory=Permitir al jugador usar el inventario creativo
No items to show.=Sin artículos que mostrar.
Search=Buscar Search=Buscar
Reset=Reiniciar Reset=Resetear
Previous page=Pág. siguiente Previous page=Pág. siguiente
Next page=Pág. anterior Next page=Pág. anterior
All=Todos All=Todos

View File

@ -1,6 +1,5 @@
# textdomain: creative # textdomain: creative
Allow player to use creative inventory=Permettre aux joueurs d'utiliser l'inventaire du mode créatif Allow player to use creative inventory=Permettre aux joueurs d'utiliser l'inventaire du mode créatif
No items to show.=
Search=Rechercher Search=Rechercher
Reset=Réinitialiser Reset=Réinitialiser
Previous page=Page précédente Previous page=Page précédente

View File

@ -1,6 +1,5 @@
# textdomain: creative # textdomain: creative
Allow player to use creative inventory=Bolehkan pemain menggunakan inventaris kreatif Allow player to use creative inventory=Bolehkan pemain memakai inventaris kreatif
No items to show.=Tiada barang untuk ditampilkan.
Search=Cari Search=Cari
Reset=Atur ulang Reset=Atur ulang
Previous page=Halaman sebelumnya Previous page=Halaman sebelumnya

View File

@ -1,6 +1,5 @@
# textdomain: creative # textdomain: creative
Allow player to use creative inventory=Permette al giocatore di usare l'inventario creativo Allow player to use creative inventory=Permette al giocatore di usare l'inventario creativo
No items to show.=
Search=Cerca Search=Cerca
Reset=Azzera Reset=Azzera
Previous page=Pagina precedente Previous page=Pagina precedente

View File

@ -1,11 +0,0 @@
# 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,6 +1,5 @@
# textdomain: creative # textdomain: creative
Allow player to use creative inventory=zifre le ka pilno le finti ke dacti liste Allow player to use creative inventory=zifre le ka pilno le finti ke dacti liste
No items to show.=
Search=sisku Search=sisku
Reset=kraga'igau Reset=kraga'igau
Previous page=lidne Previous page=lidne

View File

@ -1,8 +1,7 @@
# textdomain: creative # textdomain: creative
Allow player to use creative inventory=Benarkan pemain menggunakan inventori kreatif Allow player to use creative inventory=Benarkan pemain menggunakan inventori kreatif
No items to show.=Tiada item untuk ditunjukkan.
Search=Cari Search=Cari
Reset=Tetap semula Reset=Set semula
Previous page=Halaman sebelumnya Previous page=Halaman sebelumnya
Next page=Halaman seterusnya Next page=Halaman seterusnya
All=Semua All=Semua

View File

@ -1,11 +0,0 @@
# 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,6 +1,5 @@
# textdomain: creative # textdomain: creative
Allow player to use creative inventory=Permitir o jogador usar o inventário criativo Allow player to use creative inventory=Permitir o jogador usar o inventário criativo
No items to show.=
Search=Pesquisar Search=Pesquisar
Reset=Redefinir Reset=Redefinir
Previous page=Página anterior Previous page=Página anterior

View File

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

View File

@ -0,0 +1,10 @@
# 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,6 +1,5 @@
# textdomain: creative # textdomain: creative
Allow player to use creative inventory=Povolí hráčovi použivať kreatívny inventár Allow player to use creative inventory=Povolí hráčovi použivať kreatívny inventár
No items to show.=
Search=Hľadaj Search=Hľadaj
Reset=Vrátiť späť Reset=Vrátiť späť
Previous page=Predchádzajúca stránka Previous page=Predchádzajúca stránka

View File

@ -1,11 +0,0 @@
# 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

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

View File

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

View File

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

View File

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

View File

@ -178,7 +178,7 @@ Gambit (CC BY-SA 3.0):
default_iron_lump.png default_iron_lump.png
default_gold_lump.png default_gold_lump.png
default_clay_lump.png default_clay_lump.png
default_coal_lump.png default_coal.png
default_grass_*.png default_grass_*.png
default_paper.png default_paper.png
default_diamond_block.png default_diamond_block.png
@ -188,6 +188,8 @@ Gambit (CC BY-SA 3.0):
default_snow.png default_snow.png
default_snow_side.png default_snow_side.png
default_snowball.png default_snowball.png
default_key.png
default_key_skeleton.png
default_book.png default_book.png
asl97 (CC BY-SA 3.0): asl97 (CC BY-SA 3.0):
@ -297,6 +299,7 @@ https://www.freesound.org/people/AGFX/packs/1253/
default_water_footstep.1.ogg default_water_footstep.1.ogg
default_water_footstep.2.ogg default_water_footstep.2.ogg
default_water_footstep.3.ogg default_water_footstep.3.ogg
(default_water_footstep.4.ogg is silent)
blukotek (CC0 1.0): blukotek (CC0 1.0):
https://www.freesound.org/people/blukotek/sounds/251660/ https://www.freesound.org/people/blukotek/sounds/251660/

View File

@ -38,44 +38,34 @@ function default.chest.chest_lid_close(pn)
default.chest.open_chests[pn] = nil default.chest.open_chests[pn] = nil
for k, v in pairs(default.chest.open_chests) do for k, v in pairs(default.chest.open_chests) do
if vector.equals(v.pos, pos) then if v.pos.x == pos.x and v.pos.y == pos.y and v.pos.z == pos.z then
-- another player is also looking at the chest
return true return true
end end
end end
local node = minetest.get_node(pos) local node = minetest.get_node(pos)
minetest.after(0.2, function() minetest.after(0.2, minetest.swap_node, pos, { name = swap,
local current_node = minetest.get_node(pos) param2 = node.param2 })
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, minetest.sound_play(sound, {gain = 0.3, pos = pos,
max_hear_distance = 10}, true) max_hear_distance = 10}, true)
end)
end end
default.chest.open_chests = {} default.chest.open_chests = {}
minetest.register_on_player_receive_fields(function(player, formname, fields) 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() local pn = player:get_player_name()
if formname ~= "default:chest" then if not default.chest.open_chests[pn] 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 return
end end
default.chest.chest_lid_close(pn) default.chest.chest_lid_close(pn)
return true return true
end) end)
@ -139,12 +129,6 @@ function default.chest.register_chest(prefixed_name, d)
return itemstack return itemstack
end 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, minetest.sound_play(def.sound_open, {gain = 0.3,
pos = pos, max_hear_distance = 10}, true) pos = pos, max_hear_distance = 10}, true)
if not default.chest.chest_lid_obstructed(pos) then if not default.chest.chest_lid_obstructed(pos) then
@ -152,9 +136,10 @@ function default.chest.register_chest(prefixed_name, d)
{ name = name .. "_open", { name = name .. "_open",
param2 = node.param2 }) param2 = node.param2 })
end end
minetest.after(0.2, minetest.show_formspec, cn, minetest.after(0.2, minetest.show_formspec,
clicker:get_player_name(),
"default:chest", default.chest.get_chest_formspec(pos)) "default:chest", default.chest.get_chest_formspec(pos))
default.chest.open_chests[cn] = { pos = pos, default.chest.open_chests[clicker:get_player_name()] = { pos = pos,
sound = def.sound_close, swap = name } sound = def.sound_close, swap = name }
end end
def.on_blast = function() end def.on_blast = function() end
@ -215,12 +200,6 @@ function default.chest.register_chest(prefixed_name, d)
return inv:is_empty("main") return inv:is_empty("main")
end end
def.on_rightclick = function(pos, node, clicker) 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, minetest.sound_play(def.sound_open, {gain = 0.3, pos = pos,
max_hear_distance = 10}, true) max_hear_distance = 10}, true)
if not default.chest.chest_lid_obstructed(pos) then if not default.chest.chest_lid_obstructed(pos) then
@ -229,9 +208,9 @@ function default.chest.register_chest(prefixed_name, d)
param2 = node.param2 }) param2 = node.param2 })
end end
minetest.after(0.2, minetest.show_formspec, minetest.after(0.2, minetest.show_formspec,
cn, clicker:get_player_name(),
"default:chest", default.chest.get_chest_formspec(pos)) "default:chest", default.chest.get_chest_formspec(pos))
default.chest.open_chests[cn] = { pos = pos, default.chest.open_chests[clicker:get_player_name()] = { pos = pos,
sound = def.sound_close, swap = name } sound = def.sound_close, swap = name }
end end
def.on_blast = function(pos) def.on_blast = function(pos)
@ -243,7 +222,21 @@ function default.chest.register_chest(prefixed_name, d)
end end
end end
default.set_inventory_action_loggers(def, "chest") 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
local def_opened = table.copy(def) local def_opened = table.copy(def)
local def_closed = table.copy(def) local def_closed = table.copy(def)
@ -295,18 +288,6 @@ function default.chest.register_chest(prefixed_name, d)
end end
}) })
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 end
default.chest.register_chest("default:chest", { default.chest.register_chest("default:chest", {

View File

@ -3,52 +3,6 @@
-- support for MT game translation. -- support for MT game translation.
local S = default.get_translator 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 lpp = 14 -- Lines per book's page
local function book_on_use(itemstack, user) local function book_on_use(itemstack, user)
local player_name = user:get_player_name() local player_name = user:get_player_name()
@ -65,8 +19,8 @@ local function book_on_use(itemstack, user)
local data = meta:to_table().fields local data = meta:to_table().fields
if data.owner then if data.owner then
title = data.title or "" title = data.title
text = data.text or "" text = data.text
owner = data.owner owner = data.owner
for str in (text .. "\n"):gmatch("([^\n]*)[\n]") do for str in (text .. "\n"):gmatch("([^\n]*)[\n]") do
@ -76,28 +30,37 @@ local function book_on_use(itemstack, user)
if data.page then if data.page then
page = data.page page = data.page
page_max = data.page_max page_max = data.page_max
string = 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
end end
end end
local formspec local formspec
if title == "" and text == "" then local esc = minetest.formspec_escape
formspec = formspec_write(title, text) if owner == player_name then
elseif owner == player_name then formspec = "size[8,8]" ..
local tab = tab_number or 1 "field[0.5,1;7.5,0;title;" .. esc(S("Title:")) .. ";" ..
if tab == 2 then esc(title) .. "]" ..
formspec = formspec_core(tab) .. "textarea[0.5,1.5;7.5,7;text;" .. esc(S("Contents:")) .. ";" ..
formspec_read(owner, title, string, text, page, page_max) esc(text) .. "]" ..
"button_exit[2.5,7.5;3,1;save;" .. esc(S("Save")) .. "]"
else else
formspec = formspec_core(tab) .. formspec_write(title, text) formspec = "size[8,8]" ..
end "label[0.5,0.5;" .. esc(S("by @1", owner)) .. "]" ..
else "tablecolumns[color;text]" ..
formspec = formspec_read(owner, title, string, text, page, page_max) "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;>]"
end end
minetest.show_formspec(player_name, "default:book", formspec_size .. formspec) minetest.show_formspec(player_name, "default:book", 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 return itemstack
end end
@ -105,56 +68,14 @@ local max_text_size = 10000
local max_title_size = 80 local max_title_size = 80
local short_title_size = 35 local short_title_size = 35
minetest.register_on_player_receive_fields(function(player, formname, fields) minetest.register_on_player_receive_fields(function(player, formname, fields)
if formname ~= "default:book" then if formname ~= "default:book" then return end
return
end
local player_name = player:get_player_name()
local inv = player:get_inventory() local inv = player:get_inventory()
if not book_writers[player_name] then local stack = player:get_wielded_item()
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
local title = data.title or "" if fields.save and fields.title and fields.text
local text = data.text or "" and fields.title ~= "" and fields.text ~= "" then
local new_stack, data
if fields.book_header ~= nil and data.owner == player_name then if stack:get_name() ~= "default:book_written" 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() local count = stack:get_count()
if count == 1 then if count == 1 then
stack:set_name("default:book_written") stack:set_name("default:book_written")
@ -162,9 +83,11 @@ minetest.register_on_player_receive_fields(function(player, formname, fields)
stack:set_count(count - 1) stack:set_count(count - 1)
new_stack = ItemStack("default:book_written") new_stack = ItemStack("default:book_written")
end end
else
data = stack:get_meta():to_table().fields
end end
if data.owner ~= player_name and title ~= "" and text ~= "" then if data and data.owner and data.owner ~= player:get_player_name() then
return return
end end
@ -179,7 +102,6 @@ minetest.register_on_player_receive_fields(function(player, formname, fields)
data.description = S("\"@1\" by @2", short_title, data.owner) data.description = S("\"@1\" by @2", short_title, data.owner)
data.text = fields.text:sub(1, max_text_size) 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("\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 = 1
data.page_max = math.ceil((#data.text:gsub("[^\n]", "") + 1) / lpp) data.page_max = math.ceil((#data.text:gsub("[^\n]", "") + 1) / lpp)
@ -195,7 +117,8 @@ minetest.register_on_player_receive_fields(function(player, formname, fields)
end end
elseif fields.book_next or fields.book_prev then elseif fields.book_next or fields.book_prev then
if not data.page then local data = stack:get_meta():to_table().fields
if not data or not data.page then
return return
end end
@ -219,9 +142,64 @@ minetest.register_on_player_receive_fields(function(player, formname, fields)
end end
-- Update stack -- Update stack
inv:set_stack(wield_list, wield_index, stack) player:set_wielded_item(stack)
end) 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 -- Craftitem registry
@ -450,6 +428,13 @@ minetest.register_craft({
} }
}) })
minetest.register_craft({
output = "default:skeleton_key",
recipe = {
{"default:gold_ingot"},
}
})
minetest.register_craft({ minetest.register_craft({
output = "default:steel_ingot 9", output = "default:steel_ingot 9",
recipe = { recipe = {
@ -493,6 +478,19 @@ minetest.register_craft({
recipe = "default:gold_lump", 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({ minetest.register_craft({
type = "cooking", type = "cooking",

View File

@ -16,7 +16,7 @@ end
function default.node_sound_stone_defaults(table) function default.node_sound_stone_defaults(table)
table = table or {} table = table or {}
table.footstep = table.footstep or table.footstep = table.footstep or
{name = "default_hard_footstep", gain = 0.2} {name = "default_hard_footstep", gain = 0.3}
table.dug = table.dug or table.dug = table.dug or
{name = "default_hard_footstep", gain = 1.0} {name = "default_hard_footstep", gain = 1.0}
default.node_sound_defaults(table) default.node_sound_defaults(table)
@ -26,9 +26,7 @@ end
function default.node_sound_dirt_defaults(table) function default.node_sound_dirt_defaults(table)
table = table or {} table = table or {}
table.footstep = table.footstep or table.footstep = table.footstep or
{name = "default_dirt_footstep", gain = 0.25} {name = "default_dirt_footstep", gain = 0.4}
table.dig = table.dig or
{name = "default_dig_crumbly", gain = 0.4}
table.dug = table.dug or table.dug = table.dug or
{name = "default_dirt_footstep", gain = 1.0} {name = "default_dirt_footstep", gain = 1.0}
table.place = table.place or table.place = table.place or
@ -52,7 +50,7 @@ end
function default.node_sound_gravel_defaults(table) function default.node_sound_gravel_defaults(table)
table = table or {} table = table or {}
table.footstep = table.footstep or table.footstep = table.footstep or
{name = "default_gravel_footstep", gain = 0.25} {name = "default_gravel_footstep", gain = 0.1}
table.dig = table.dig or table.dig = table.dig or
{name = "default_gravel_dig", gain = 0.35} {name = "default_gravel_dig", gain = 0.35}
table.dug = table.dug or table.dug = table.dug or
@ -66,9 +64,7 @@ end
function default.node_sound_wood_defaults(table) function default.node_sound_wood_defaults(table)
table = table or {} table = table or {}
table.footstep = table.footstep or table.footstep = table.footstep or
{name = "default_wood_footstep", gain = 0.15} {name = "default_wood_footstep", gain = 0.3}
table.dig = table.dig or
{name = "default_dig_choppy", gain = 0.4}
table.dug = table.dug or table.dug = table.dug or
{name = "default_wood_footstep", gain = 1.0} {name = "default_wood_footstep", gain = 1.0}
default.node_sound_defaults(table) default.node_sound_defaults(table)
@ -102,7 +98,7 @@ end
function default.node_sound_ice_defaults(table) function default.node_sound_ice_defaults(table)
table = table or {} table = table or {}
table.footstep = table.footstep or table.footstep = table.footstep or
{name = "default_ice_footstep", gain = 0.15} {name = "default_ice_footstep", gain = 0.3}
table.dig = table.dig or table.dig = table.dig or
{name = "default_ice_dig", gain = 0.5} {name = "default_ice_dig", gain = 0.5}
table.dug = table.dug or table.dug = table.dug or
@ -114,7 +110,7 @@ end
function default.node_sound_metal_defaults(table) function default.node_sound_metal_defaults(table)
table = table or {} table = table or {}
table.footstep = table.footstep or table.footstep = table.footstep or
{name = "default_metal_footstep", gain = 0.2} {name = "default_metal_footstep", gain = 0.4}
table.dig = table.dig or table.dig = table.dig or
{name = "default_dig_metal", gain = 0.5} {name = "default_dig_metal", gain = 0.5}
table.dug = table.dug or table.dug = table.dug or
@ -159,7 +155,7 @@ default.cool_lava = function(pos, node)
minetest.set_node(pos, {name = "default:stone"}) minetest.set_node(pos, {name = "default:stone"})
end end
minetest.sound_play("default_cool_lava", minetest.sound_play("default_cool_lava",
{pos = pos, max_hear_distance = 16, gain = 0.2}, true) {pos = pos, max_hear_distance = 16, gain = 0.25}, true)
end end
if minetest.settings:get_bool("enable_lavacooling") ~= false then if minetest.settings:get_bool("enable_lavacooling") ~= false then
@ -715,54 +711,6 @@ function default.register_craft_metadata_copy(ingredient, result)
end) end)
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. -- NOTICE: This method is not an official part of the API yet.

View File

@ -3,9 +3,6 @@
-- support for MT game translation. -- support for MT game translation.
local S = default.get_translator local S = default.get_translator
-- List of sound handles for active furnace
local furnace_fire_sounds = {}
-- --
-- Formspecs -- Formspecs
-- --
@ -94,17 +91,6 @@ local function allow_metadata_inventory_take(pos, listname, index, stack, player
return stack:get_count() return stack:get_count()
end 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 function swap_node(pos, name)
local node = minetest.get_node(pos) local node = minetest.get_node(pos)
if node.name == name then if node.name == name then
@ -173,7 +159,7 @@ local function furnace_node_timer(pos, elapsed)
end end
-- Play cooling sound -- Play cooling sound
minetest.sound_play("default_cool_lava", minetest.sound_play("default_cool_lava",
{pos = pos, max_hear_distance = 16, gain = 0.07}, true) {pos = pos, max_hear_distance = 16, gain = 0.1}, true)
else else
-- Item could not be cooked: probably missing fuel -- Item could not be cooked: probably missing fuel
update = true update = true
@ -190,16 +176,9 @@ local function furnace_node_timer(pos, elapsed)
-- No valid fuel in fuel list -- No valid fuel in fuel list
fuel_totaltime = 0 fuel_totaltime = 0
src_time = 0 src_time = 0
else
-- prevent blocking of fuel inventory (for automatization mods)
local is_fuel = minetest.get_craft_result({method = "fuel", width = 1, items = {afterfuel.items[1]:to_string()}})
if is_fuel.time == 0 then
table.insert(fuel.replacements, afterfuel.items[1])
inv:set_stack("fuel", 1, "")
else else
-- Take fuel from fuel list -- Take fuel from fuel list
inv:set_stack("fuel", 1, afterfuel.items[1]) inv:set_stack("fuel", 1, afterfuel.items[1])
end
-- Put replacements in dst list or drop them on the furnace. -- Put replacements in dst list or drop them on the furnace.
local replacements = fuel.replacements local replacements = fuel.replacements
if replacements[1] then if replacements[1] then
@ -266,30 +245,9 @@ local function furnace_node_timer(pos, elapsed)
result = true result = true
-- Play sound every 5 seconds while the furnace is active -- Play sound every 5 seconds while the furnace is active
if timer_elapsed == 0 or (timer_elapsed + 1) % 5 == 0 then if timer_elapsed == 0 or (timer_elapsed+1) % 5 == 0 then
local sound_id = minetest.sound_play("default_furnace_active", minetest.sound_play("default_furnace_active",
{pos = pos, max_hear_distance = 16, gain = 0.25}) {pos = pos, max_hear_distance = 16, gain = 0.5}, true)
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 end
else else
if fuellist and not fuellist[1]:is_empty() then if fuellist and not fuellist[1]:is_empty() then
@ -300,8 +258,6 @@ local function furnace_node_timer(pos, elapsed)
-- stop timer on the inactive furnace -- stop timer on the inactive furnace
minetest.get_node_timer(pos):stop() minetest.get_node_timer(pos):stop()
meta:set_int("timer_elapsed", 0) meta:set_int("timer_elapsed", 0)
stop_furnace_sound(pos)
end end
@ -406,9 +362,6 @@ minetest.register_node("default:furnace_active", {
is_ground_content = false, is_ground_content = false,
sounds = default.node_sound_stone_defaults(), sounds = default.node_sound_stone_defaults(),
on_timer = furnace_node_timer, on_timer = furnace_node_timer,
on_destruct = function(pos)
stop_furnace_sound(pos)
end,
can_dig = can_dig, can_dig = can_dig,

View File

@ -12,17 +12,6 @@ default = {}
default.LIGHT_MAX = 14 default.LIGHT_MAX = 14
default.get_translator = S 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 -- GUI related stuff
minetest.register_on_joinplayer(function(player) minetest.register_on_joinplayer(function(player)
-- Set formspec prepend -- Set formspec prepend

View File

@ -19,7 +19,6 @@ local item = {
self.object:remove() self.object:remove()
minetest.sound_play("default_item_smoke", { minetest.sound_play("default_item_smoke", {
pos = p, pos = p,
gain = 1.0,
max_hear_distance = 8, max_hear_distance = 8,
}, true) }, true)
minetest.add_particlespawner({ 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) Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0)
Copyright (C) 2010-2023: Copyright (C) 2010-2018:
celeron55, Perttu Ahola <celeron55@gmail.com> celeron55, Perttu Ahola <celeron55@gmail.com>
Cisoun Cisoun
@ -52,7 +52,6 @@ Copyright (C) 2010-2023:
random-geek random-geek
Extex101 Extex101
An0n3m0us An0n3m0us
Lopano
You are free to: You are free to:
Share — copy and redistribute the material in any medium or format. Share — copy and redistribute the material in any medium or format.

View File

@ -4,15 +4,14 @@ Locked Chest (owned by @1)=Abgeschlossene Truhe (Eigentum von @1)
You do not own this chest.=Ihnen gehört diese Truhe nicht. You do not own this chest.=Ihnen gehört diese Truhe nicht.
a locked chest=eine abgeschlossene Truhe a locked chest=eine abgeschlossene Truhe
Chest=Truhe Chest=Truhe
Write=Schreiben
Read=Lesen
Title:=Titel: Title:=Titel:
Contents:=Inhalt: Contents:=Inhalt:
Save=Speichern Save=Speichern
by @1=von @1 by @1=von @1
Page @1 of @2=Seite @1 von @2 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 "@1" by @2=„@1“ von @2
Skeleton Key=Skelettschlüssel
Key to @1's @2=Schlüssel für @2 von @1
Blueberries=Blaubeeren Blueberries=Blaubeeren
Book=Buch Book=Buch
Book with Text=Buch mit Text Book with Text=Buch mit Text
@ -108,7 +107,7 @@ Acacia Tree Sapling=Akazienbaumsetzling
Aspen Tree=Espenbaum Aspen Tree=Espenbaum
Aspen Wood Planks=Espenholzplanken Aspen Wood Planks=Espenholzplanken
Aspen Tree Leaves=Espenbaumblätter Aspen Tree Leaves=Espenbaumblätter
Aspen Tree Sapling=Espenbaumsetzling Aspen Tree Sapling=Esepenbaumsetzling
Coal Ore=Kohleerz Coal Ore=Kohleerz
Coal Block=Kohleblock Coal Block=Kohleblock
Iron Ore=Eisenerz Iron Ore=Eisenerz
@ -211,6 +210,7 @@ Bronze Sword=Bronzeschwert
Steel Sword=Stahlschwert Steel Sword=Stahlschwert
Mese Sword=Meseschwert Mese Sword=Meseschwert
Diamond Sword=Diamantschwert Diamond Sword=Diamantschwert
Key=Schlüssel
Torch=Fackel Torch=Fackel
@1 will intersect protection on growth.=@1 wird bei Wachstum mit geschützter Zone überlappen. @1 will intersect protection on growth.=@1 wird bei Wachstum mit geschützter Zone überlappen.

View File

@ -1,220 +0,0 @@
# 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 # textdomain: default
Locked Chest=Cofre cerrado Locked Chest=Cofre cerrado
Locked Chest (owned by @1)=Cofre cerrado (propiedad de @1) Locked Chest (owned by @1)=Cofre cerrado (propiedad de @1)
You do not own this chest.=Este cofre no te pertenece. You do not own this chest.=Este cofre no te pertenece.
a locked chest=un cofre cerrado a locked chest=un cofre cerrado
Chest=Cofre Chest=Cofre
Write=
Read=
Title:=Título: Title:=Título:
Contents:=Contenidos: Contents:=Contenidos:
Save=Guardar Save=Guardar
by @1=por @1 by @1=por @1
Page @1 of @2=Página @1 de @2 Page @1 of @2=Página @1 de @2
The book you were writing to mysteriously disappeared.=
"@1" by @2="@1" por @2 "@1" by @2="@1" por @2
Skeleton Key=Llave esqueleto
Key to @1's @2=Llave para @2 de @1
Blueberries=Arándanos Blueberries=Arándanos
Book=Libro Book=Libro
Book with Text=Libro escrito Book with Text=Libro escrito
@ -211,6 +211,7 @@ Bronze Sword=Espada de bronce
Steel Sword=Espada de acero Steel Sword=Espada de acero
Mese Sword=Espada de mese Mese Sword=Espada de mese
Diamond Sword=Espada de diamante Diamond Sword=Espada de diamante
Key=Llave
Torch=Antorcha Torch=Antorcha
@1 will intersect protection on growth.=@1 intersectará con protección cuando crezca. @1 will intersect protection on growth.=@1 intersectará con protección cuando crezca.

Some files were not shown because too many files have changed in this diff Show More