1
0
mirror of https://github.com/minetest/minetest_game.git synced 2024-11-15 14:30:18 +01:00

Compare commits

..

376 Commits

Author SHA1 Message Date
grorp
093cd28a27
Set bloom intensity 2024-10-16 14:12:25 +02:00
grorp
df8159436c Set volumetric lighting strength 2024-10-01 17:29:41 +02:00
1F616EMO~nya
b23c44d980
Get rid of recursive call in default.dig_up (#3133) 2024-09-08 22:09:30 +02:00
sfan5
7967f77f3b
Don't assert default biomes in spawn mod
fixes #3124
2024-09-08 22:07:20 +02:00
1F616EMO~nya
2ce8ff3306
Simplify Butterfly and Firefly code (#3125) 2024-08-31 11:43:07 +02:00
Gundul
4e402ec39f
Fix crash if bones punched by non-player (#3146) 2024-08-18 19:40:14 +02:00
sfan5
d89170c129
Simplify and fix docker test 2024-08-18 19:35:43 +02:00
sfan5
9bd1f24d36
Update README for release model 2024-08-14 13:53:04 +02:00
Niklp
88ecab34d9
Replace deprecated get_metadata() calls (#3142) 2024-07-27 14:42:08 +02:00
1F616EMO~nya
9cb57ae5f2
Log furnace inventory actions (#3141) 2024-07-27 14:41:16 +02:00
1F616EMO~nya
77bbcee0cd
Limit furnace sound volume on catch-up smelting (#3144) 2024-07-26 09:36:05 +02:00
Niklp
da0509c5bd Replace deprecated meta:set_string() call 2024-06-29 16:58:53 +02:00
Lunovox
599dedd927
translate to brazilian portuguese and portuguese of Portugal (#3104) 2024-06-24 12:23:50 +02:00
ssdaniel24
061f4e76dd
Added can_grow function to plant definition (#3131) 2024-06-23 18:03:36 +02:00
Andrii Nemchenko
f03c992864
Fix the possibility to put fire in a protected area (#3129) 2024-06-22 12:54:57 +02:00
1F616EMO~nya
91f6e5faec
Fix crafting for fences etc. starting with colon (#3132) 2024-06-22 12:54:27 +02:00
1F616EMO~nya
82b017af6b
Avoid using the global 'table' as a function argument name
Co-authored-by: José Douglas da Silva Souza <44056294+JoseDouglas26@users.noreply.github.com>
2024-06-16 20:08:42 +02:00
mruncreative
511619253f
Fix upside down nodes in large cactus schematic (#3123)
* Update schematic_tables.txt (large_cactus)
* Replace large_cactus with upside down nodes with fixed one
2024-06-02 19:38:35 +02:00
Lars
3ad8a6a473 Fix possible invalid object reference in TNT mod 2024-05-26 17:01:45 +02:00
sfan5
1ce48351ea Add random_mod_load_order to test config 2024-05-12 17:23:41 +02:00
sfan5
c60d8e4da0 Add API to control respawn logic and behavior 2024-05-12 14:46:12 +02:00
sfan5
d1ba7c3db3 Add API to weather mod
Co-authored-by: Till Affeldt <t.affeldt@tu-braunschweig.de>
2024-05-12 14:39:16 +02:00
sfan5
31133a371e Fix set_node(air) calls
In the fireflies case it can be replaced with remove_node.
In the beds case we fix the logic to do what it should. Coincidentally the end result was correct nonetheless.
2024-04-13 13:32:18 +02:00
1F616EMO~nya
0639681f9b
Log bucket liquid placement (#3108) 2024-04-13 13:07:13 +02:00
tour
a43a6bcdef fix crash from default.chest.register_chest 2024-04-07 13:51:51 +02:00
ROllerozxa
16c663f87e Replace beds_transparent.png with blank.png 2024-03-29 11:35:05 +01:00
sfan5
316c0c7224 Add workflow that runs simple test with the engine present 2024-03-27 22:00:03 +01:00
cx384
ef788d0307
Make bugs only pointable with Bug Net (#3099) 2024-03-10 17:57:22 +01:00
Gregor Parzefall
5a80084800 Set field_enter_after_edit for search fields 2024-02-26 01:31:33 +01:00
Jaidyn Ann
10799db4cf Tweak capitalization in Esperanto translation 2024-01-28 11:42:02 +01:00
David Leal
222afb0cf0
Allow overriding the loop flag on player_api.set_animation (#3097)
Co-authored-by: Lars Müller <34514239+appgurueu@users.noreply.github.com>
2024-01-28 11:41:12 +01:00
sfan5
472997b4aa Fix detecting mgv6 temples as 'desert' dungeon type 2024-01-24 08:48:42 +01:00
sfan5
70cf7a26fd
Fix some placer nil checks 2024-01-11 15:50:36 +01:00
Uwuewsky
a3b171e317
Update Russian translation (#3058) 2023-12-30 11:32:05 +01:00
sfan5
e9676fa632
Make cloud parameters deterministic across sessions 2023-12-30 11:30:46 +01:00
David Leal
c0200b0a01
Use a faster and newer LuaCheck (#3081) 2023-12-30 11:29:10 +01:00
Mantar
43185f19e3
Bed bugfix: Remove "reverse" toggle in favor of swap_node/set_node combo (#2976) 2023-12-24 13:41:26 +01:00
José Douglas da Silva Souza
ff755eed9c
Add brazilian portuguese translation for butterflies (#3085) 2023-12-22 23:51:14 +01:00
rubenwardy
b9c089474c Update README.md for 5.8 2023-12-17 16:57:57 +01:00
Lars Mueller
05367552d1 Mapgen: Don't clear biomes, decorations and ores 2023-12-10 22:49:51 +01:00
rubenwardy
33d90c2c45
Add min_minetest_version to game.conf
This is used by ContentDB to install the right version of a package for a given client version
2023-12-04 17:51:38 +00:00
Yaya - Nurul Azeera Hidayah @ Muhammad Nur Hidayat Yasuyoshi
4bb4a2a818 Update Malay translations
1. Added missing translation to the following files:
  beds.ms.tr, creative.ms.tr, default.ms.tr, farming.ms.tr,
  fire.ms.tr, sethome.ms.tr
2. Changes some translation as per following:
  a. beds.ms.tr
    - Leave Bed changed from Bangun (wake up) to Tinggalkan Katil
      (leave bed, in literal sense) just because the button would
      be interpreted by some people as 'wake up on next morning'
      (ie. skipping night) instead of 'wake up interrupting current
      sleep progress' which is the intended meaning.
  b. boats.ms.tr
    - Boat cruise mode changed from Mod bot layar makan angin to
      Mod jelajah bot, the original translation is more like direct
      translation, and this has been changed to more natural one
      to make sure player know that the mode is a cruise control.
    - Reset changed from Set semula to Tetap semula, this is for
      standardizing with existing term used in various places.
  c. default.ms.tr
    - Page \@1 of \@2 changed from the short form to the long form.
    - Mese Crystal Fragment had missing word 'Kristal' re-added.
  d. dye.ms.tr
    - Dark Grey changed from Kelabu Gelap to Kelabu Tua to make it
      standardized with the colour name elsewhere.
    - Dark Green changed from Hijau Gelap to Hijau Tua to make it
      standardized with the colour name elsewhere.
    - Magenta changed from Merah Lembayung to Magenta, because the
      colour Merah Lembayung is now used to refer to purplish red
      and no longer equal to magenta, the loanword is used instead.
  e. game_commands.ms.tr
    - respawn changed from lahir semula (reborn) to jelma semula
      (reappear), this is to make it consistent with the language
      used in multiple other games that had similar respawning
      system, and avoiding the religious context of life that is
      implied by the use of previous translation.
    - spawnpoint changed from titik permulaan (starting point) to
      titik jelma ((re)appear point), see previous point.
  f. tnt.ms.tr
    - Gun Powder changed from Serbuk Senjata Api (firearms powder)
      to Serbuk Letupan (explosion powder) because that is the
      proper translation, the latter is still the term used even
      when talking about actual firearm, the former didn't exist
  g. vessels.ms.tr
    - item changed from barang (thing) to item, this is mainly
      because some of the 'item' that could be stored are not
      some solid 'thing' where the word barang could be used for,
      so using the word item here keep it neutral.
  h. wool.ms.tr
    - Dark Grey changed from Kelabu Gelap to Kelabu Tua to make it
      standardized with the colour name elsewhere.
    - Dark Green changed from Hijau Gelap to Hijau Tua to make it
      standardized with the colour name elsewhere.
    - Magenta changed from Merah Lembayung to Magenta, because the
      colour Merah Lembayung is now used to refer to purplish red
      and no longer equal to magenta, the loanword is used instead.
2023-12-01 03:46:21 +01:00
Muhammad Rifqi Priyo Susanto
829eb92ccf
Update Indonesian translations (#3077) 2023-11-24 18:48:38 +01:00
Andriy
bff7596364
Update Ukrainian translation (#3070) 2023-11-04 16:40:07 +01:00
Niklp
601ec6cd94
Fix not updating vessel shelf infotext 2023-11-03 10:03:39 +01:00
sfan5
b58991d4f3 Fix typo in German translation 2023-10-08 18:11:44 +02:00
Lars Müller
34942339c7
Fix bed night skip race condition (#3067) 2023-09-29 22:31:13 +02:00
Zemtzov7
eba9012d05
Fix coral and kelp duping with mesecons' sticky piston (#3062) 2023-09-16 14:52:07 +02:00
Lorenzo
59da46c80b
Add sapling growth APIs (#3053)
---------
Co-authored-by: Lars Müller <34514239+appgurueu@users.noreply.github.com>
Co-authored-by: sfan5 <sfan5@live.de>
2023-09-12 15:43:41 +02:00
tenplus1
03177f1584
Stairs: Add helper function for textures and simplify code (#3060) 2023-09-11 19:14:16 +02:00
David Leal
a132872ad8 Update creative Spanish translation 2023-09-04 18:01:14 +02:00
Lopano
bbc70c95ef Replace nonfree water textures
Reduced image size.

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

Transparent(er) River water

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

Added my name to license.txt

Bump year to 2023

Corrected Hue.

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

* Update french translations for mtg_craftguide

* Update french translations for default

* Correct typos

* Restore new line at end of file

* Shorten translation for better display

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

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

Fixes #1743
2021-09-04 23:37:27 +02:00
David Leal
92701885d0
Replace Travis CI with GitHub actions (#2661)
Co-authored-by: sfan5 <sfan5@live.de>
2021-07-08 11:47:37 +01:00
Jordan Irwin
c96cc55c40
Fix incorrect documentation of "default_coal_lump.png" 2021-06-06 19:25:30 +02:00
sfence
70500943f3
Fix problem with sharing table in door nodes Lua definitions
closes #2882
2021-06-06 19:24:10 +02:00
Paramat
ddebdeccb1
Add open/close sound gains to the Doors API, balance sound levels (#2768) 2021-05-31 20:43:33 +01:00
SmallJoker
71ea0c65ea
Attachments: Proper data cleanup in callbacks (#2865) 2021-05-11 21:15:47 +02:00
tenplus1
642fde44f1
Use group for mushroom spread ABM (#2863)
Have mushroom spread abm use group:mushroom to spread not only default red and brown but all defined shrooms.
2021-05-08 14:42:34 +02:00
An0n3m0us
1c78666c56 Reclassify some items 2021-05-08 14:42:16 +02:00
ElCeejo
8158926862
Check for attachments before attaching player to bed (#2862) 2021-05-08 11:30:57 +02:00
SmallJoker
4945f4bf9a Carts: Fix 0/0 condition on faulty tool capabilities 2021-05-02 14:59:22 +02:00
sfan5
79e63a8496
Check for required engine features on startup 2021-04-27 11:50:32 +02:00
SmallJoker
c6171a8f29
Add Esperanto translation (#2739)
Co-authored-by: Jason Cartwright <cartwrightjason49@gmail.com>
2021-04-17 15:08:37 +02:00
An0n3m0us
42baede13f
Add specific groups to different types of grass (#2852) 2021-04-02 19:13:44 +02:00
An0n3m0us
0a90bd8a0e
Fix wield image for coral and kelp nodes (#2850) 2021-03-17 12:16:39 +01:00
Paul Ouellette
34bb232052 mtg_craftguide: Fix incorrect item tooltips
This happened when the same item was visible twice and one of them was a
group item. Fix it by ensuring that buttons that should have different
tooltips don't have the same element name.
2021-03-17 12:16:13 +01:00
Wuzzy
2c9733ac45
Add Lojban translation (#2835) 2021-02-23 20:00:46 +01:00
Ronoaldo Pereira
b6377a7c0e
Added Brazilian Portuguese translation (#2834)
Added the Brazilian Portuguese translation to all mods in the Minetest Game.
2021-02-23 20:00:02 +01:00
Nathaniel Freeman
73ea8e2e91
Update Spanish translation (#2824) 2021-02-15 21:54:48 +01:00
Wuzzy
46136bbf19
Update German translation (#2821) 2021-02-12 20:55:27 +01:00
ExeVirus
6bd059915c
Safe texture compression (#2808)
Only a single program was used to safely compress all textures in MTG.

 * `optipng -o7 -zm1-9 -nc -strip all -clobber %%f`

The key command used is -nc, which stops color mode changes. I.e. any RGBA textures will remain RGBA textures, with none being changes to 8-bit indexed mode.

utils/optimize_textures.sh performs this compression automatically, assuming optipng is installed.
2021-02-12 20:55:18 +01:00
Lars Müller
624dafc12b
Fix crash on exit of bed formspec if not sleeping (#2826) 2021-02-11 12:30:37 +01:00
An0n3m0us
3d95fceee8
Smoothen lava sounds at loop points (#2820)
Closes: #2818
2021-02-09 17:34:40 +01:00
sfan5
aa9cc39317 Update game APIs for use_texture_alpha deprecation 2021-02-07 11:48:05 +01:00
sfan5
08b13c9efb Fix deprecated alpha / use_texture_alpha use 2021-02-07 11:48:05 +01:00
SmallJoker
c1b236b4e3 weather: Fix error caused by missing biomes 2021-02-07 11:48:05 +01:00
Wuzzy
9d419bfac6
Update translation templates 2021-02-06 15:07:07 +01:00
Lars Müller
6a9cbcad82
Beds: Preserve player physics (#2789) 2021-02-01 23:00:05 +01:00
sfan5
ecfebe3c17 Revert "Correct door model dimensions (#2804)"
This introduces z-fighting so we'll just undo it. closes #2812
This reverts commit 3fdd5cdb5f.
2021-02-01 22:38:48 +01:00
An0n3m0us
3fdd5cdb5f
Correct door model dimensions (#2804) 2021-01-30 15:22:22 +01:00
An0n3m0us
e1e793d4da
Correct name of acacia mese postlight (#2800) 2021-01-30 15:20:40 +01:00
An0n3m0us
b648af479f
default: Add missing nodes to list (#2799) 2021-01-30 15:20:11 +01:00
Montandalar
87f6b941c4
Do not crash when a skeleton key is used on an unknown node (#2806) 2021-01-15 17:43:19 +01:00
The most random of all meshes
1ade8941b4
Fix boat floating in the air when water being drained away (#2788) 2020-12-28 15:56:04 +01:00
Maksim
e6aec880de
Use Minetest 5.3 'minetest.is_creative_enabled' API (#2795) 2020-12-13 18:59:19 +01:00
Richard Try
9c29019301
Improve Russian translation (carts) (#2794) 2020-12-13 18:59:07 +01:00
IFRFSX
a1a50673c8
Update zh_CN translation for mtg_craftguide and dye (#2796)
Co-authored-by: IFRFSX <1079092922@qq.com>
2020-12-13 18:58:54 +01:00
Rafsanjani Atallah
0232288d5e
Fix some mistakes in the Indonesian translations (#2758) 2020-12-13 18:58:37 +01:00
auouymous
7ae983b669
Don't replace protected liquids with bones (#2790) 2020-12-08 22:20:16 +01:00
The most random of all meshes
29866dbcb3
Fix minor bug in german translation 2020-11-29 17:43:15 +01:00
An0n3m0us
2e7b509a94
Move player model sitting and laying positions to above the ground (#2746) 2020-11-13 18:14:25 +00:00
DS
226e2d4c12
Add missing not_in_creative_inventory group where appropriate (#2764) 2020-11-11 15:29:43 +00:00
CyberDonk3y
0a950c9932
Improve Russian translation (#2761) 2020-11-05 19:48:15 +01:00
Daretmavi
2953bf2bd6
Slovak translations (#2772) 2020-11-05 19:47:48 +01:00
SmallJoker
331bbae058
Fix deprecated get_player_velocity and set_physics_override calls (#2770) 2020-11-04 21:42:35 +01:00
Paramat
720d4c8e3f
Do not apply waving shader to bush leaves (#2753) 2020-10-20 22:30:57 +01:00
Wuzzy
6605724fe1
Add icons for invisible nodes (#2718) 2020-09-30 16:41:04 +01:00
orbea
dd91a1bfe5
Furnace: Start the timer on on_metadata_inventory_take (#2639)
This fixes a cosmetic issue where if a player removes
items from the furnace it will not revert to showing that its
"Empty". The furnace would only show its empty when the the
items were used up by the smelting process.
2020-09-23 21:58:09 +01:00
sofar
5348d6e5bc
Fix builtin item metatable (#2328)
Co-authored-by: Alexander Weber <web.alexander@web.de>
2020-09-22 18:39:11 +02:00
Louis Royer
4c145bf9aa
Improve inner/outer stairs translation for external mods (#2584) 2020-09-21 23:38:49 +01:00
Paramat
63cffc4bd1
Improve player model credits, add contributors to license (#2741) 2020-09-21 23:36:59 +01:00
Paramat
1d3feba732
Update game description to manage expectations (#2740) 2020-09-20 00:40:49 +01:00
Paramat
8d0fb34fb0
Player_api: Various maintenance (#2737)
Clear 'player_sneak' and 'player_api.player_attached' table values
when player leaves.
Remove unnecessary commas and whitespace.
Fix table name in 'game_api.txt'.
Clean up documentation in 'game_api.txt'.
2020-09-09 19:11:25 +02:00
An0n3m0us
268f869e67
beds: Various bug fixes (#2566)
· Fixes players sleeping in an occupied bed (Wuzzys code)
· Fixes 'sleepwalking' by checking players velocity (Wuzzys code)
· Fixes sleeping player flying off the bed when damaged and flying far away from the bed after death
· Fixes sleeping player being immobilized and bed undiggable after death
2020-09-02 18:32:06 +02:00
IFRFSX
25bf3fdc9c
Update Chinese translation (#2730) 2020-09-02 18:30:38 +02:00
An0n3m0us
befed5525a
Replace some sounds with new sounds (#2605) 2020-08-29 01:16:36 +01:00
SmallJoker
1da168b3c3
Craftguide: Fix error caused by removing invalid recipes (#2732) 2020-08-23 14:35:12 +02:00
Paul Ouellette
5d0e4aef45
Add simplified version of 'craftguide' mod, named 'mtg_craftguide' (#2396) 2020-08-22 00:20:58 +01:00
An0n3m0us
686fdb5c06
Add different woods to mese posts (#2599) 2020-08-16 13:21:22 +02:00
An0n3m0us
0a96bac46d
Add furnace sounds (#2569)
Two sounds are played; one while the furnace is active (sound used is "fire_fire") and one after an item is cooked (sound used is "default_cool_lava").
2020-08-07 19:40:02 +02:00
tuedel
4858c2b3fb
sethome: Replace deprecated function calls (#2724) 2020-07-26 11:07:15 +02:00
An0n3m0us
12f75ab803
Add correct front texture to cart texture (#2720) 2020-07-24 17:59:42 +02:00
sfan5
e193f9fda3
Add lava environment sound (#2683) 2020-07-16 23:26:13 +02:00
Muhammad Rifqi Priyo Susanto
8c01a5b288
Add Indonesian translations (#2693) 2020-06-29 18:41:50 +02:00
tenplus1
7cac67f097
TNT centre node adheres to protection
Make sure tnt.boom() doesnt replace centre node when explode_centre is true and ignore_protection is false.

Fixes: https://github.com/minetest/minetest_game/issues/2663
2020-06-28 15:50:46 +02:00
Wuzzy
0648252056
Update German translation 2020-06-28 15:50:00 +02:00
updatepo.sh
8855490b7f Update translation templates 2020-06-26 14:41:30 +02:00
JDiaz
3257780b32
farming: Update Spanish translation (#2701) 2020-06-25 12:35:36 +02:00
Paramat
b2d0f0ac8d
Update nodes papyrus can grow on, include default:dry_dirt (#2705)
Fixes papyrus not growing on savanna dirt.
Also updates the nodes papyrus can grow on, which were incorrect for a long time.
2020-06-21 23:24:56 +01:00
Paramat
e8a7e75319
Make dry grass spread on default:dirt again (#2687) 2020-06-16 20:42:45 +01:00
Hooded Ice
d03d7e9bdc
Change brake rail to red (#2692) 2020-06-12 23:37:23 +02:00
sfan5
af045dcd8b sethome: Do not write empty homes file 2020-06-10 20:29:50 +02:00
sfan5
6d2a897e1b
creative: Update for compatibility with minetest.creative_is_enabled (#2691) 2020-06-07 00:15:35 +02:00
sfan5
b1ab8d5123
Implement searching for translated names in creative inventory (#2675) 2020-06-05 14:29:34 +02:00
sfan5
6e345cf136
Use node particles for TNT explosions (#2695) 2020-06-02 12:48:56 +02:00
sfan5
e849d54572
carts: Fix item collection (#2689) 2020-05-29 22:54:47 +02:00
An0n3m0us
0662f96284
Reduce hud icons size to 12x12 pixels (#2669) 2020-05-28 11:12:15 +02:00
sfan5
84da00acd4
Add node particles when leafdecay removes a node (#2686) 2020-05-25 15:56:23 +02:00
SmallJoker
3452938c76 Carts: Re-add erroneously removed driver reset
carts:manage_attachment does not handle the driver value of the cart,
hence carts could not be used by another player until it's replaced.
2020-05-16 19:26:28 +02:00
SmallJoker
b787fcf7e4 Carts: Reset player view and attachment table on death
Fixes #2681
2020-05-15 19:04:38 +02:00
Paramat
e5a7af1c4a
Add wild cotton plant in savanna as a source of cotton seeds (#2617)
Junglegrass is unchanged as a source of cotton seeds for now, but
probably should be removed as a source in future, as players get
used to the new source.
2020-05-14 23:49:17 +01:00
sfan5
b3d91a487d
Add new dry shrub texture by Extex101 (#2680) 2020-05-14 22:33:53 +01:00
Hamlet
16c950f688
doors: Update Italian translation (#2670) 2020-05-11 23:13:00 +02:00
sfan5
e5b54c6ead
Switch TNT explosions to use add_player_velocity (#2674) 2020-05-10 14:10:29 +02:00
Yaman Qalieh
3f42c6c243
Add oddly_breakable_by_hand to glass stairs and slabs 2020-05-10 13:37:37 +02:00
sfan5
ef45a8e148
doors: Remove unnecessary nodebox and empty texture (#2662) 2020-05-04 19:20:01 +02:00
Zughy
d88e551071
Fix cart inventory image rendering (#2666)
Before it was rendering the side on both the side and the front of the minetest.inventorycube
2020-04-30 19:51:39 +02:00
HybridDog
190f7fdac9
Add a missing article to the sign action message (#2651) 2020-04-29 21:11:21 +02:00
sfan5
33eb7cee2a
Fix flammable item entities crashing (#2659) 2020-04-24 21:12:40 +02:00
An0n3m0us
189d2d9fb1
Fix door model UV for open and close (#2372)
Introduce _c and _d door types to correctly render the texture faces for the open and closed state.
2020-04-24 21:04:00 +02:00
David Leal
81c5b6b399
beds: Use player_api functions instead of default (#2654) 2020-04-23 22:19:58 +02:00
Paramat
52c6921cb2
Make default:snow collisionbox half of nodebox height (#2647) 2020-04-14 19:09:24 +02:00
sfan5
bd64188ee5 Override builtin item entity the portable way 2020-04-14 13:31:25 +02:00
bell07
fb18a5b20d
Make default.chest.register_chest() usable for other mods (#2127) 2020-04-13 20:26:44 +02:00
Paul Ouellette
ea4ce80f7c
Make straw stairs usable as fuel (#2627) 2020-04-13 11:34:10 +02:00
IFRFSX
36b2bcb5f3
Add Basic Fire Description (#2568) 2020-04-11 20:50:49 +02:00
orbea
695f98f213
player_api: Remove local variable (#2640) 2020-04-08 20:40:19 +02:00
sfan5
545ec0741c Fix creative category sorting in certain cases 2020-04-08 17:25:09 +02:00
sfan5
c1f41720fc Fix crash on TNT explosions if tnt is disabled 2020-04-08 17:24:10 +02:00
orbea
14a385d68c
trees: Reduce local variables (#2637) 2020-04-07 19:36:03 +02:00
Maksim
03c9aed221
Fire mod: Code cleanup, compress textures 2020-04-06 21:09:39 +01:00
Paramat
720b24ed2d
Weather mod: Tune cloud density variation
Previously, cloud density was too low at medium humidity.
Tune cloud density variation to match the default/classic value at
humidity midvalue 50.
Tune the lower limit of cloud density that occurs at extreme low
humidity.
Increase minimum cloud thickness to 2 nodes.
Add comments.
2020-04-06 21:05:07 +01:00
Paramat
4243d28846
Clarify descriptions of dry grass, dry dirt 2020-04-06 21:03:57 +01:00
Maksim
7d230fdbf8
Enable player animation when Right Click (#2622) 2020-04-06 15:22:08 +02:00
An0n3m0us
7fc7fa4843
Transform brick top texture to align bricks correctly (#2607) 2020-04-06 15:19:52 +02:00
An0n3m0us
05fad37b3c
Sort items into correct categories (#2612) 2020-04-06 15:15:50 +02:00
sfan5
8863527bb6 Fix respawn not working at all when suitable position was not found
The player should always be teleported away when they die and
we can still fall back to the engine spawning code.
2020-04-04 13:06:40 +02:00
sfan5
fbbc7fc996 player_api: Prevent knockback when player is set as attached
This is not directly related to player models but fits well
as a convenience feature in player_api.
2020-03-17 22:08:36 +01:00
TumeniNodes
b9dc758fef
xpanes: fix code style (#2618) 2020-03-15 15:12:21 +01:00
TumeniNodes
8b3b92dfdf
xpanes: remove unused textures (#2614) 2020-03-07 20:25:43 +01:00
sfan5
07a8067348
Fix TNT mod crash when entities disappear during explosion (#2616) 2020-03-06 21:51:19 +01:00
sfan5
3a863053c0
Dungeon loot: Warn on unknown registered loot items (#2613) 2020-03-06 21:51:07 +01:00
IFRFSX
91ac075cff
Update Chinese Translation, Add Traditional Chinese Translation (#2596) 2020-03-02 21:53:12 +01:00
SmallJoker
fe9cdba0ec
Creative: Skip redundant refreshes, fix reset button (#2611)
Skips redundant calls to creative.update_creative_inventory and fixes the 'Reset' button which double-refreshed the filter cache.
2020-03-02 21:41:42 +01:00
An0n3m0us
8d9aa07752
Sort loot registration into respective mods (#2602) 2020-02-23 14:41:13 +01:00
Andrey2470T
34b410319e
Increase speed of flowing water/river water animations
To visually match the 1 node per second spread of flowing water.
2020-02-14 00:01:15 +00:00
An0n3m0us
3ea648f5bf
Disallow screwdriver rotating torches, to avoid bad torch rotations 2020-02-11 03:58:41 +00:00
An0n3m0us
232cc2bd1c
Add log for seeds on place 2020-02-10 22:00:40 +01:00
Paramat
db632b67bf
Fix missing papyrus in savanna, add a dry dirt version
Papyrus was missing from the dry dirt 'savanna_shore' biome due to
only being placed on dirt. A mistake made when changing savanna
dirt to dry dirt.

Rename existing papyrus schematic to 'papyrus_on_dirt' and only
place in the 'rainforest_swamp' biome.
Add a new papyrus schematic 'papyrus_on_dry_dirt', placed in the
'savanna' biome.
2020-02-09 01:34:17 +00:00
Louis Royer
1420376e32
Fix french translation of snow block slab 2020-02-08 21:06:17 +00:00
Paramat
9bf64b61c2
Fix simple bed height, make player lay down just above it, not inside it 2020-02-08 03:11:44 +00:00
IFRFSX
f255e36d78
Add traditional Chinese translation (#2579) 2020-02-06 20:15:13 +01:00
sfan5
d3e26dba18 Convert minetest.sound_play uses to ephemeral 2020-02-05 22:24:23 +01:00
DS
176ddba176 Reset spawn position on bed destruction 2020-01-26 18:59:44 +01:00
IFRFSX
eac4795326 Update Chinese translation (#2563)
rail = 轨道 / 栏杆
grass = 草

and, mese color is yellow, so i translate it to "黄石"。(Chinese words without MESE)
2020-01-25 16:55:14 +01:00
Zaoqi
da39bae50e Add zh_CN translation 2020-01-22 19:09:38 +01:00
Konstantin Ilyashenko
7e9a54abaf Replace Russian translation of Pickaxe (#2556) 2020-01-09 19:09:06 +01:00
Lejo
beb0aefa2d Make can_interact_with_node() check for key group instead of default:key 2020-01-06 21:16:33 +00:00
Thomas--S
1940961d63 Move duplicate recipe from books to default.register_craft_metadata_copy()
This allows mods to easily implement the same behaviour, e.g. for letters.
2020-01-04 00:09:58 +00:00
An0n3m0us
6e32287a42 Move crafting, cooking and fuel recipes into corresponding files 2020-01-01 01:38:06 +00:00
Zaoqi
1082466796 Rename core to minetest (#2552) 2019-12-29 12:28:30 +01:00
An0n3m0us
258332578a Player model: Add bobbing to walk animation, more subtle standing animation 2019-12-23 02:14:25 +00:00
Paramat
150122bfe7
Remove Mapgen V7 floatland biome code
In preparation for a new Mapgen V7 floatland implementation.
2019-12-18 23:59:45 +00:00
Paramat
d04b709181
Add missing 'weather' mod documentation to minetest.conf.example 2019-12-18 22:32:09 +00:00
Paramat
c0335e24c9
Convert grass footstep sounds from stereo to mono 2019-12-18 22:31:29 +00:00
Maksim
f176ba4873 Make tool crafting recipes more compact, move to tools.lua 2019-12-16 00:29:33 +00:00
Paramat
5b21d1de34
README: Use correct link, make link clickable 2019-12-04 20:38:01 +00:00
Muhammad Nur Hidayat Yasuyoshi (MNH48)
710605687b Add Malay translation 2019-11-30 17:31:40 +01:00
Aresiel
10dce79451 Add Swedish translation 2019-11-30 17:31:29 +01:00
OgelGames
0f764bf447 Coral 'on place': Pass node to 'on rightclick', not node name 2019-11-28 02:01:19 +00:00
Kevin Nel
00a8bd521a Fix popping sound in default_grass_footstep (#2538) 2019-11-25 10:50:20 +01:00
Andrey2470T
2f6d0bf267 Add 4th item row to creative inventory. Align search, trash, page navigation 2019-11-23 21:35:02 +00:00
An0n3m0us
d9f8c6cc43 Escape translated text in 'beds' mod formspec 2019-11-22 21:47:47 +00:00
Paramat
5b1875ef41
Papyrus: Add to the rainforest swamp biome
Previously, papyrus was limited to the savanna biome.
Rainforest is a suitable habitat for papyrus.
Makes papyrus a little less difficult to find.
Move swamp jungletrees into a separate registration, to allow
applying distribution by perlin noise to keep these away from
papyrus areas.

Fix error: Remove non-functional 'rainforest swamp' from the
biome list for the jungle log decoration. It is not placed in
swamps due to the 'y max/min' and 'place on' parameters.
2019-11-15 19:47:14 +00:00
SmallJoker
5017f3b614 Weather: Replace deprecated get2d with get_2d 2019-11-13 19:59:58 +01:00
Andrey2470T
6fea665fcc Add Russian translation (#2525) 2019-10-24 21:54:20 +02:00
Bartosz
dd71dcbcf6 boats: Improve physics by implementing drag and friction forces
Implement drag force according to the equation:
drag_force = drag_coefficient * speed ^2
Also add a small constant force to implement friction force.
2019-10-24 03:47:28 +01:00
sfan5
f9a9e87af6
Improve creative inventory search (#2523) 2019-10-22 22:46:19 +02:00
Paramat
7caa5d36f2
Move hotbar code/textures, and damage sound, from player_api to default
These are unrelated to the Player API and player object.
All other GUI/HUD code and textures are in default.
All other engine hardcoded sounds are in default.
The player_api mod is highly likely to be used unchanged in new games,
so logical grouping of content will help the creation of new games.
2019-10-18 02:43:06 +01:00
Paramat
7c1fd9c24e
Add initial 'weather' mod to vary cloud density, thickness, velocity 2019-10-15 00:38:41 +01:00
luk3yx
ef7df329d2 Fix duplicate background in formspec prepend (#2524) 2019-10-14 22:53:57 +02:00
Lars Hofhansl
6042e963f7 Increase (ocean) water opacity to 191 2019-10-12 18:35:56 +02:00
Hamlet
93a49f082c Italian translation (#2491) 2019-10-12 14:30:37 +02:00
JDiaz
a00ff24df9 Spanish Translation (#2505) 2019-10-10 21:19:20 +02:00
DrHackberry
0f369b43fe French translation (#2514) 2019-10-10 21:18:25 +02:00
sfan5
f87c3d05ae player_api: Set correct visual size for legacy player model 2019-10-06 14:06:02 +02:00
SmallJoker
1c413ede9a Use background9 for backwards compatibility 2019-10-05 17:55:42 +02:00
Wuzzy
8c9821b227 Update translation templates and German (#2512) 2019-10-03 18:44:34 +02:00
SnicklePickles
ce1eaeebbe Grammar updates README.txt 2019-10-01 21:47:58 +02:00
TumeniNodes
f2a07b0a51 Xpanes: Add new steel bar door/trapdoor sounds
No longer use the unsuitable steel door/trapdoor sound.
2019-09-28 21:53:50 +01:00
Alex Yst
c800398593 Always disable leafdecay for player-placed leaves, even when 'sneaking'
Avoids player-placed leaves decaying when building while sneaking, which is common.
2019-09-28 21:10:26 +01:00
An0n3m0us
05375c0fd4 Fix glass panes sides (#2500) 2019-09-27 00:35:06 +02:00
TumeniNodes
23ceb30e88 Xpanes: Register steel bar door and steel bar trapdoor
Register using the 'doors' mod API.
2019-09-22 23:05:38 +01:00
Wuzzy
106c36da33 Add translation templates and German translation 2019-09-22 13:42:40 +02:00
Paramat
86a55d3584
Marram grass: Fix noise flags to make 2D noise 'eased' (#2493)
Increase noise resolution from 4 to 2 nodes for a higher quality
distribution.
Retune noise parameters to compensate for using eased noise.
2019-09-21 21:28:09 +01:00
An0n3m0us
b31795dd04 Vessels: Fix vessels shelf infotext 2019-09-21 11:45:03 +02:00
sfan5
3f7cd062c3
Fix trapdoor infotext to correctly describe the type of trapdoor 2019-09-20 20:56:20 +02:00
sfan5
09bed49b5a
Fix door infotext to correctly describe the type of door 2019-09-20 20:10:58 +02:00
leucome
00f9287075 Leafdecay: Use param2 ~= 1 instead of param2 == 0 2019-09-19 02:13:18 +01:00
An0n3m0us
cbb0529ace Set fuel percentage to decrease (#2481) 2019-09-19 00:36:50 +02:00
sfan5
b4c7522248
Fix more translation strings (#2487) 2019-09-18 20:38:27 +02:00
mbartlett21
c42a525ce8 Add option for non-jumpable fences and walls
Add an option, default disabled, to extend the collision boxes upwards.
2019-09-16 21:38:02 +01:00
An0n3m0us
1f7ea89cb6 Add missing infotext to nodes (#2477) 2019-09-14 20:30:26 +02:00
sfan5
888383a812 Fix water no longer waving
broken by bb9279ccb8
2019-09-14 14:30:44 +02:00
An0n3m0us
88114a74e9 Add vessels group to firefly vessel 2019-09-13 20:47:09 +02:00
sfan5
e4adb01fbf
Fix and improve translation strings (#2471) 2019-09-12 19:03:10 +02:00
Paramat
ea992bdace
Add initial environmental sounds mod with flowing water sounds
default:river_water_source can also create sound if desired as
rivers are considered to be flowing water.
A simple mod for now, with the intention to later use new engine
environmental sound features if/when they appear.
2019-09-12 00:46:40 +01:00
Yves Quemener
bb9279ccb8 Add support for MT 5 game translation (rebasing ) (#2466)
rebased #2368
2019-09-10 19:09:51 +02:00
mbartlett21
d99a176b69 Xpanes: Use 'swap node' instead of 'set node' 2019-09-06 21:39:23 +01:00
Panquesito7
7e16ec7a2f Convert README.txt to Markdown format 2019-09-05 22:39:24 +01:00
Paramat
e8097c9e87
Creative: Override the hand instead of re-registering
Allows the initial hand registration to alter the 'wield_scale' without
needing to also alter it in creative mod.
Also make default mod a dependency again, as the initial hand
registration is required.
2019-08-31 19:44:17 +01:00
Paramat
5c3e4b1d20
Spawn: Avoid spawning outside small worlds
Previously, the value of 'mapgen_limit' was not used to limit the
spawn position.
If a friendly-biome spawn point is not found within a small world,
spawn point falls back to the engine spawn point, which has a larger
chance of success.
2019-08-28 03:19:34 +01:00
TumeniNodes
553b0f9d72 Add new TNT sounds 2019-08-28 03:06:23 +01:00
Paul Ouellette
7269711911 Furnace: Improve fuel item replacement support
The output returned by `get_craft_result` has a replacements table that
contains any replacement items that could not be placed in the input
(due to the input stack having a count > 1). Put these replacements in
the dst list or drop them on the furnace.
2019-08-20 21:15:28 +02:00
coil
3a3f71aa50 Verify object is player before checking privs (#2448)
This prevents a crash when a 'nil' digger is passed by the engine to
minetest.node_dig.
2019-08-19 19:24:19 +02:00
Paramat
fac8f390b1
TNT: Remove unusable sounds, use temporary placeholders 2019-08-18 19:47:06 +01:00
Paramat
4eadf80634
Sfinv: Add and use a crafting arrow texture instead of using furnace arrow 2019-08-13 21:57:32 +01:00
Paul Ouellette
e5ebb36cd5 Furnace: Fix "output full" infotext 2019-08-11 16:28:02 +02:00
Paramat
2063fcd075
Make the creative mod hand dig 'dig_immediate' nodes fast
Engine change now makes this possible.
2019-08-03 20:51:58 +01:00
HybridDog
a2254bd0af Warn when a mod registers a stairs node with an existing name 2019-08-01 21:55:26 +02:00
TumeniNodes
7f830124f7 Various mods: Use " " instead of ' ' for item names 2019-08-01 02:40:39 +01:00
TumeniNodes
a5bde8e9ba Default: Use " " instead of ' ' for item names 2019-07-31 00:16:44 +01:00
Paramat
6716fc74ec
Add patches of bare 'dry dirt' to savanna
Tune noise to appear roughly where long dry grass is least dense and shortest.
2019-07-30 03:55:17 +01:00
TumeniNodes
c32b8adaa3 Add 'dry dirt' and 'dry dirt with dry grass' nodes for savanna biome 2019-07-26 17:50:44 +01:00
TumeniNodes
4282a93a02 Creative: Add 'default' as optional dependency
Fixes bugs caused by removing 'default' as a hard dependency.
2019-07-22 02:26:52 +01:00
Paramat
d16612c1cb
Add new, longer 'default_grass_side' texture
Update side texture to match the new top texture.
3/4 side coverage instead of 1/2,
2019-07-22 02:18:20 +01:00
Paramat
9fe877ef99
Creative: Remove unnecessary dependency on 'default' 2019-07-21 03:24:47 +01:00
sfan5
a81a7e0c78
Merge pull request #2322 from Calinou/travis-luacheck-color
Enable colored Luacheck output on Travis CI
2019-07-17 00:38:30 +02:00
sfan5
9b226c7045 Switch to mod.conf, delete deprecated depends.txt 2019-07-17 00:38:23 +02:00
sfan5
773011fd85 Fix potential crash when few loot items are registered 2019-07-16 23:29:29 +02:00
sfan5
c3403936d3 Fix luacheck warning 2019-07-16 23:17:14 +02:00
sfan5
b701e500aa Support for icesheet dungeons in dungeon_loot 2019-07-16 22:26:35 +02:00
sfan5
37710866f0 Switch dungeon type detection to biome name
see #2400, also removed a now unused alias
2019-07-16 22:26:35 +02:00
TumeniNodes
bfb84da39c Add new 'default_grass' texture 2019-07-15 17:43:05 +01:00
Paramat
3bca295da8
New lighter, greyer permafrost texture 2019-07-13 23:35:25 +01:00
acmgit
83fb6fe872 Remove stack_max from bucket:bucket_empty 2019-07-13 17:47:45 +01:00
SmallJoker
95aaec6670 Allow opening chests when wielding corals
Code simplification by combining the on_place functions.
2019-07-12 20:01:27 +01:00
bell07
5b1d5819e5 Unify hotbar formspec for sfinv and creative
sfinv: Add lists above the content to support listrings in content.
Reuse sfinv inventory lists for creative.
2019-07-10 21:55:35 +01:00
luk3yx
3d530e0c25 intersects_protection(): Fix compatibility code 2019-07-03 19:10:39 +02:00
Paramat
e7be81242b
Define dungeon nodes in biome definitions (#2400)
Icesheet ice dungeons now have ice stairs.
Remove some now-unnecessary sandstone mapgen aliases, one
remains as it is required by the dungeon loot mod.
Re-arrange mapgen aliases to separate those needed for mgv6.
2019-07-01 21:58:47 +01:00
rubenwardy
a6a719967a Use 9-slice background in formspec theme 2019-06-24 00:10:13 +01:00
t0ny2
54bb0afe7f Make waterlily wave when placed on waving water 2019-06-16 22:09:36 +01:00
SmallJoker
0f771a27c3 Allow overriding default.after_place_leaves and default.grow_sapling 2019-06-07 20:35:24 +01:00
Paramat
ca7c131133
Large cactus schematic: Don't force-place root node
This schematic is used for sapling-grown large cacti, so should not
destroy the sand node below, as sand nodes are in short supply in
some situations.
Like trees, only force-place the node that replaces the sapling.
2019-06-07 20:34:13 +01:00
acmgit
61bfac0fa2 Prevent potential crash caused by moss growth ABM 2019-06-02 18:50:20 +01:00
An0n3m0us
e19f42d648 Add groups for tools and mushrooms (#2378) 2019-06-01 21:10:30 +02:00
Zweihorn
76a08a7058 wool: use global 'dye.dyes' table 2019-05-26 20:21:31 +01:00
Paul Ouellette
80c10cee15 Capitalize author in game.conf to match ContentDB
The author is used to track packages for updating, so it should match.
2019-05-26 20:16:52 +01:00
Paramat
aee5ba64f9
Make cave liquids biome-determined
No longer use the hardcoded engine cave liquids.
Water only in '_ocean' biomes, water and lava in '_under' biomes.
2019-05-18 21:22:19 +01:00
Paramat
5c48c76aa2
Fix trapdoor side textures and orientations
Previously, opening a trapdoor caused the side textures to flip.

Fix the incorrect textures.
Also add a texture transform to a tile of the open trapdoor, such
that the closed trapdoor sides use the lower part of the texture
and the open trapdoor sides use the higher part.

Clean up some codestyle issues.
2019-05-03 23:49:07 +01:00
Paramat
f21bab2ff9
Split underground biome to correspond to surface biomes
In preparation for biome-defined: dungeon materials, cave liquids,
stone type, ores, decorations.
'_ocean' biomes now extend to y = -255 to be deeper than default
mgv5 oceans, and to create 'shallow underground biomes'.
Remove unnecessary biome lists for gravel and silver sand blob ores,
as those are already defined to only appear in default:stone.
2019-04-19 21:23:26 +01:00
HybridDog
0291c6b210 Moss growth ABM: Add inner and outer cobble stairs, simplify code 2019-04-06 21:35:48 +01:00
HybridDog
b20725026e flowers: Light check optimisation in mushroom spread 2019-03-31 22:20:28 +01:00
tenplus1
88d79881b8 Add food groups to blueberries (#2335) 2019-03-31 22:20:47 +02:00
HybridDog
efd090228d fire: Document flammable group, a little code cleanup 2019-03-30 20:33:08 +00:00
Paramat
dfe6fd6560
Restrict waving liquid shader to normal water 2019-03-27 02:17:32 +00:00
SmallJoker
dd3f3b2032 Use group:stick in recipes (fixes #2306) 2019-03-24 10:59:34 +01:00
Paramat
8b5e0a914b
Dungeon loot: Avoid empty 'if' branch to satisfy lua check 2019-03-23 23:16:41 +00:00
Paramat
e3cd961a15
Fix beds being undiggable after laying down 2019-03-23 23:12:44 +00:00
Niwla23
eaf6eac723 Mapping kit recipe: Use "group:stick" instead of "default:stick" 2019-03-18 22:20:24 +00:00
sfan5
02e2cab375 Dungeon loot: Don't crash on unknown items
fixes #2228
2019-03-17 13:59:10 +01:00
sofar
b853c8a509 Beds: Properly count players in beds
This is a rebased and slightly rewritten version of #2125.
2019-03-10 01:43:49 +00:00
acmgit
891f00e9db Flowers: Remove stack max definition (#2324) 2019-03-05 11:59:23 +01:00
Hugo Locurcio
b38b5b2357
Enable colored Luacheck output on Travis CI
This also removes the deprecated `sudo: false` option, as Travis CI
is phasing out the container-based infrastructure.
2019-02-24 19:46:48 +01:00
990 changed files with 17414 additions and 3268 deletions

13
.github/workflows/luacheck.yml vendored Normal file
View File

@ -0,0 +1,13 @@
name: luacheck
on: [push, pull_request]
jobs:
luacheck:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Luacheck
uses: lunarmodules/luacheck@master
with:
args: mods

11
.github/workflows/test.yml vendored Normal file
View File

@ -0,0 +1,11 @@
name: test
on: [push, pull_request]
jobs:
test:
runs-on: ubuntu-latest
timeout-minutes: 5
steps:
- uses: actions/checkout@v4
- run: ./utils/test/run.sh

View File

@ -1,9 +1,13 @@
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", "core", "minetest",
"dump", "dump",
"vector", "vector",
"VoxelManip", "VoxelArea", "VoxelManip", "VoxelArea",
@ -12,11 +16,16 @@ read_globals = {
"Settings", "Settings",
"unpack", "unpack",
-- Silence errors about custom table methods. -- Silence errors about custom table methods.
table = { fields = { "copy", "indexof" } } table = { fields = { "copy", "indexof" } },
-- Silence warnings about accessing undefined fields of global 'math'
math = { fields = { "sign" } }
} }
-- Overwrites minetest.handle_node_drops -- Overwrites minetest.handle_node_drops
files["mods/creative/init.lua"].globals = { "minetest" } files["mods/creative/init.lua"].globals = { "minetest" }
-- Overwrites minetest.calculate_knockback
files["mods/player_api/api.lua"].globals = { "minetest" }
-- Don't report on legacy definitions of globals. -- Don't report on legacy definitions of globals.
files["mods/default/legacy.lua"].global = false files["mods/default/legacy.lua"].global = false

View File

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

46
README.md Normal file
View File

@ -0,0 +1,46 @@
# Minetest Game
[![ContentDB](https://content.minetest.net/packages/Minetest/minetest_game/shields/title/)](https://content.minetest.net/packages/Minetest/minetest_game/)
Minetest Game (abbreviated MTG) is a simple and peaceful sandbox game, with no
real goals or built-in enemy mobs.
While it provides a basic gameplay experience out of the box, it is best played
with mods.
Minetest Game is in perpetual 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
### ContentDB
* Content > Browse Online Content
* Search for "[Minetest Game](https://content.minetest.net/packages/Minetest/minetest_game/)"
* Click Install
### Manually
- Unzip the archive, rename the folder to `minetest_game` and
place it in `.../minetest/games/`
- GNU/Linux: If you use a system-wide installation place it in `~/.minetest/games/`.
The Minetest engine can be found at [GitHub](https://github.com/minetest/minetest).
For further information or help, see: [Installing Mods](https://wiki.minetest.net/Installing_Mods).
## Compatibility
As of January 2024 Minetest Game follows a **rolling release** model with new changes being automatically
published on ContentDB every day.
There are no stable releases or tags, all existing ones are considered legacy.
Minetest Game is always compatible to the latest stable release of the engine.
Older releases may be supported too depending on circumstances.
## Licensing
See `LICENSE.txt`

View File

@ -1,28 +0,0 @@
Minetest Game [minetest_game]
=============================
The main game for the Minetest engine
=====================================
To use this game with the Minetest engine, insert this repository as
/games/minetest_game
The Minetest engine can be found in:
https://github.com/minetest/minetest/
Compatibility
--------------
The Minetest Game github master HEAD is generally compatible with the github
master HEAD of the Minetest engine.
Additionally, when the Minetest engine is tagged to be a certain version (eg.
0.4.10), Minetest Game is tagged with the version too.
When stable releases are made, Minetest Game is packaged and made available in
http://minetest.net/downloads/
and in case the repository has grown too much, it may be reset. In that sense,
this is not a "real" git repository. (Package maintainers please note!)
Licensing
---------
See LICENSE.txt

View File

@ -1,3 +1,4 @@
name = Minetest Game title = Minetest Game
author = minetest author = Minetest
description = Bundled by default with Minetest, and aims to be lightweight, moddable, and fairly playable without mods. description = A basic exploration, mining, crafting, and building, sandbox game with no NPCs, monsters, or animals. Minetest Game is usually used with mods added, and many mods are available for this game. Reliably maintained by Minetest Engine core developers.
min_minetest_version = 5.8

View File

@ -49,6 +49,8 @@ Beds API
* `beds.read_spawns() ` Returns a table containing players respawn positions * `beds.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
@ -93,16 +95,21 @@ For example,
is used to show all tools. Name is used in the sfinv page name, title is the is used to show all tools. Name is used in the sfinv page name, title is the
human readable title. human readable title.
`is_enabled_for` is used to check whether a player is in creative mode: Creative provides `creative.is_enabled_for(name)`, which is identical in
functionality to the engine's `minetest.creative_is_enabled(name)`.
creative.is_enabled_for(name) Its use is deprecated and it should also not be overriden.
Override this to allow per-player game modes.
The contents of `creative.formspec_add` is appended to every creative inventory The contents of `creative.formspec_add` is appended to every creative inventory
page. Mods can use it to add additional formspec elements onto the default page. Mods can use it to add additional formspec elements onto the default
creative inventory formspec to be drawn after each update. creative inventory formspec to be drawn after each update.
Group overrides can be used for any registered item, node or tool. Use one of
the groups stated below to pick which category it will appear in.
node = 1 -- Appears in the Nodes category
tool = 1 -- Appears in the Tools category
craftitem = 1 -- Appears in the Items category
Chests API Chests API
---------- ----------
@ -129,12 +136,12 @@ The chests API allows the creation of chests, which have their own inventories f
* A table indexed by player name to keep track of who opened what chest. * A table indexed by player name to keep track of who opened what chest.
* Key: The name of the player. * Key: The name of the player.
* Value: A table containing information about the chest the player is looking at. * Value: A table containing information about the chest the player is looking at.
e.g `{ pos = {1, 1, 1}, sound = null, swap = "chest" }` e.g `{ pos = {1, 1, 1}, sound = null, swap = "default:chest" }`
`default.chest.register_chest(name, def)` `default.chest.register_chest(name, def)`
* Registers new chest * Registers new chest
* `name` Name for chest * `name` Name for chest e.g. "default:chest"
* `def` See [#Chest Definition] * `def` See [#Chest Definition]
### Chest Definition ### Chest Definition
@ -213,30 +220,46 @@ 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
-- open/close.
recipe = craftrecipe, recipe = craftrecipe,
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", -- the tiles of the four side parts of the trapdoor tile_side = "doors_trapdoor_side.png",
-- The texture for the four sides of the trapdoor.
-- The texture should have the trapdoor side drawn twice, in the lowest and highest
-- 1/8ths of the texture, both upright. The area between is not used.
-- The lower 1/8th will be used for the closed trapdoor, the higher 1/8th will be used
-- for the open trapdoor.
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
@ -269,7 +292,7 @@ The mod that places chests with loot in dungeons provides an API to register add
name = "item:name", name = "item:name",
chance = 0.5, chance = 0.5,
-- ^ chance value from 0.0 to 1.0 that the item will appear in the chest when chosen -- ^ chance value from 0.0 to 1.0 that the item will appear in the chest when chosen
-- due to an extra step in the selection process, 0.5 does not(!) mean that -- Due to an extra step in the selection process, 0.5 does not(!) mean that
-- on average every second chest will have this item -- on average every second chest will have this item
count = {1, 4}, count = {1, 4},
-- ^ table with minimum and maximum amounts of this item -- ^ table with minimum and maximum amounts of this item
@ -279,7 +302,8 @@ The mod that places chests with loot in dungeons provides an API to register add
-- optional, defaults to no height restrictions -- optional, defaults to no height restrictions
types = {"desert"}, types = {"desert"},
-- ^ table with types of dungeons this item can be found in -- ^ table with types of dungeons this item can be found in
-- supported types: "normal" (the cobble/mossycobble one), "sandstone", "desert" -- supported types: "normal" (the cobble/mossycobble one), "sandstone"
-- "desert" and "ice"
-- optional, defaults to no type restrictions -- optional, defaults to no type restrictions
@ -300,7 +324,7 @@ Allows creation of new fences with "fencelike" drawtype.
name = "default:fence_wood", name = "default:fence_wood",
description = "Wooden Fence", description = "Wooden Fence",
texture = "default_wood.png", texture = "default_wood.png",
material = "default:wood", material = "default:wood", -- `nil` if you don't want the recipe
groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2},
sounds = default.node_sound_wood_defaults(), sounds = default.node_sound_wood_defaults(),
@ -351,17 +375,23 @@ The farming API allows you to easily register plants and hoes.
{ {
description = "", -- Description of seed item description = "", -- Description of seed item
harvest_description = "", -- Description of harvest item
-- (optional, derived automatically if not provided)
inventory_image = "unknown_item.png", -- Image to be used as seed's wield- and inventory image inventory_image = "unknown_item.png", -- Image to be used as seed's wield- and inventory image
steps = 8, -- How many steps the plant has to grow, until it can be harvested steps = 8, -- How many steps the plant has to grow, until it can be harvested
-- ^ Always provide a plant texture for each step, format: modname_plantname_i.png (i = stepnumber) -- ^ Always provide a plant texture for each step, format: modname_plantname_i.png (i = stepnumber)
minlight = 13, -- Minimum light to grow minlight = 13, -- Minimum light to grow
maxlight = default.LIGHT_MAX -- Maximum light to grow maxlight = default.LIGHT_MAX -- Maximum light to grow
can_grow = function(pos) -- Сalled every growth tick to check if the plant can grow, returns bool
-- (optional, checks for wet soil by default)
} }
Fire API Fire API
-------- --------
Add group flammable when registering a node to make fire seek for it.
Add it to an item to make it burn up when dropped in lava or fire.
New node def property: New node def property:
`on_burn(pos)` `on_burn(pos)`
@ -409,57 +439,83 @@ Give Initial Stuff API
^ Adds items to the list of items to be given ^ Adds items to the list of items to be given
Players API Player API
----------- ----------
The player API can register player models and update the player's appearence 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.
* def: See [#Model definition] * `def`: see [#Model definition]
* saved to player_api.registered_models * Saved to player_api.registered_models
* `player_api.registered_player_models[name]` * `player_api.registered_models[name]`
* Get a model's definition * Get a model's definition
* see [#Model definition] * `name`: model filename
* See [#Model definition]
* `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 * Applies an animation to a player if speed or anim_name differ from the currently playing animation
* anim_name: name of the animation. * `player`: PlayerRef
* speed: frames per second. If nil, default from the model is used * `anim_name`: name of the animation
* `speed`: keyframes 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 `textures` is nil the default * `textures`: array of textures. If nil, the default from the model def is used
textures from the model def are 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
* player: PlayerRef * `player`: PlayerRef
* `player_api.player_attached`
* A table that maps a player name to a boolean
* If the value for a given player is set to true, the default player animations
(walking, digging, ...) will no longer be updated, and knockback from damage is
prevented for that player
* Example of usage: A mod sets a player's value to true when attached to a vehicle
### Model Definition ### Model Definition
{ {
animation_speed = 30, -- Default animation speed, in FPS. animation_speed = 30, -- Default animation speed, in keyframes per second
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> = {x = <start_frame>, y = <end_frame>}, -- [anim_name] = {
foo = {x = 0, y = 19}, -- x = <start_frame>,
bar = {x = 20, y = 39}, -- y = <end_frame>,
-- ... -- collisionbox = <model collisionbox>, -- (optional)
-- eye_height = <model eye height>, -- (optional)
-- -- suspend client side animations while this one is active (optional)
-- override_local = <true/false>
-- },
stand = ..., lay = ..., walk = ..., mine = ..., walk_mine = ..., -- required animations
sit = ... -- used by boats and other MTG mods
}, },
collisionbox = {-0.3, 0.0, -0.3, 0.3, 1.7, 0.3}, -- In nodes from feet position -- Default object properties, see lua_api.txt
stepheight = 0.6, -- In nodes visual_size = {x = 1, y = 1},
eye_height = 1.47, -- In nodes above feet position collisionbox = {-0.3, 0.0, -0.3, 0.3, 1.7, 0.3},
stepheight = 0.6,
eye_height = 1.47
} }
@ -578,6 +634,34 @@ set a players home position and teleport a player to home position.
* `name` Player you wish to teleport to their home position * `name` Player you wish to teleport to their home position
* return value: false if player cannot be sent home, otherwise true * return value: false if player cannot be sent home, otherwise true
Spawn API
---------
The spawn mod takes care of deciding the position of new and respawning players
in the world and has an API to modify its behavior.
`spawn.get_default_pos()`
* Gets the default spawn position as decided by a biome-dependent algorithm.
* This is not influenced by settings like "static_spawnpoint" or "engine_spawn".
* return value: a vector or `nil` on failure
`spawn.add_suitable_biome(biome)`:
* Adds a biome to the list of allowed biomes for the above algorithm.
* `biome`: Name of a registered biome
`spawn.register_on_spawn(func)`:
* Registers a callback to be called when a player (re-)spawns. This can be used
to intercept the normal logic to e.g. respawn a player at his bed.
* `func`: `function(player, is_new)` with arguments
- `player`: ObjectRef
- `is_new`: true if the player is joining the server for the first time
- return value: true to skip all other spawn logic, false or nil otherwise
When a player (re-)spawns the following order is executed:
1. All spawn callbacks in order of registration.
2. If no result, teleport player to `spawn.get_default_pos()`.
3. If that fails, spawning is left up to engine.
Sfinv API Sfinv API
--------- ---------
@ -694,6 +778,12 @@ 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
@ -716,34 +806,42 @@ delivered with Minetest Game, to keep them compatible with other mods.
* `sounds`: See [#Default sounds] * `sounds`: See [#Default sounds]
* `worldaligntex`: A bool to set all textures world-aligned. Default false. See [Tile definition] * `worldaligntex`: A bool to set all textures world-aligned. Default false. See [Tile definition]
`stairs.register_stair_inner(subname, recipeitem, groups, images, description, sounds, worldaligntex)` `stairs.register_stair_inner(subname, recipeitem, groups, images, description, sounds, worldaligntex, full_description)`
* Registers an inner corner stair * Registers an inner corner stair
* `subname`: Basically the material name (e.g. cobble) used for the stair name. Nodename pattern: "stairs:stair_inner_subname" * `subname`: Basically the material name (e.g. cobble) used for the stair name. Nodename pattern: "stairs:stair_inner_subname"
* `recipeitem`: Item used in the craft recipe, e.g. "default:cobble", may be `nil` * `recipeitem`: Item used in the craft recipe, e.g. "default:cobble", may be `nil`
* `groups`: See [Known damage and digging time defining groups] * `groups`: See [Known damage and digging time defining groups]
* `images`: See [Tile definition] * `images`: See [Tile definition]
* `description`: Used for the description field in the stair's definition * `description`: Used for the description field in the stair's definition with "Inner" prepended
* `sounds`: See [#Default sounds] * `sounds`: See [#Default sounds]
* `worldaligntex`: A bool to set all textures world-aligned. Default false. See [Tile definition] * `worldaligntex`: A bool to set all textures world-aligned. Default false. See [Tile definition]
* `full_description`: Overrides the description, bypassing string concatenation. This is useful for translation. (optional)
`stairs.register_stair_outer(subname, recipeitem, groups, images, description, sounds, worldaligntex)` `stairs.register_stair_outer(subname, recipeitem, groups, images, description, sounds, worldaligntex, full_description)`
* Registers an outer corner stair * Registers an outer corner stair
* `subname`: Basically the material name (e.g. cobble) used for the stair name. Nodename pattern: "stairs:stair_outer_subname" * `subname`: Basically the material name (e.g. cobble) used for the stair name. Nodename pattern: "stairs:stair_outer_subname"
* `recipeitem`: Item used in the craft recipe, e.g. "default:cobble", may be `nil` * `recipeitem`: Item used in the craft recipe, e.g. "default:cobble", may be `nil`
* `groups`: See [Known damage and digging time defining groups] * `groups`: See [Known damage and digging time defining groups]
* `images`: See [Tile definition] * `images`: See [Tile definition]
* `description`: Used for the description field in the stair's definition * `description`: Used for the description field in the stair's definition with "Outer" prepended
* `sounds`: See [#Default sounds] * `sounds`: See [#Default sounds]
* `worldaligntex`: A bool to set all textures world-aligned. Default false. See [Tile definition] * `worldaligntex`: A bool to set all textures world-aligned. Default false. See [Tile definition]
* `full_description`: Overrides the description, bypassing string concatenation. This is useful for translation. (optional)
`stairs.register_stair_and_slab(subname, recipeitem, groups, images, desc_stair, desc_slab, sounds, worldaligntex)` ```
stairs.register_stair_and_slab(subname, recipeitem, groups, images, desc_stair, desc_slab,
sounds, worldaligntex, desc_stair_inner, desc_stair_outer)
```
* A wrapper for stairs.register_stair, stairs.register_slab, stairs.register_stair_inner, stairs.register_stair_outer * A wrapper for stairs.register_stair, stairs.register_slab, stairs.register_stair_inner, stairs.register_stair_outer
* Uses almost the same arguments as stairs.register_stair * Uses almost the same arguments as stairs.register_stair
* `desc_stair`: Description for stair nodes. For corner stairs 'Inner' or 'Outer' will be prefixed * `desc_stair`: Description for stair nodes. For corner stairs 'Inner' or 'Outer' will be prefixed unless
`desc_stair_inner` or `desc_stair_outer` are specified, which are used instead.
* `desc_slab`: Description for slab node * `desc_slab`: Description for slab node
* `desc_stair_inner`: Description for inner stair node
* `desc_stair_outer`: Description for outer stair node
Xpanes API Xpanes API
@ -759,7 +857,11 @@ Creates panes that automatically connect to each other
### Pane definition ### Pane definition
{ {
textures = {"texture for sides", (unused), "texture for top and bottom"}, -- More tiles aren't supported textures = {
"texture for front and back",
(unused),
"texture for the 4 edges"
}, -- More tiles aren't supported
groups = {group = rating}, -- Uses the known node groups, see [Known damage and digging time defining groups] groups = {group = rating}, -- Uses the known node groups, see [Known damage and digging time defining groups]
sounds = SoundSpec, -- See [#Default sounds] sounds = SoundSpec, -- See [#Default sounds]
recipe = {{"","","","","","","","",""}}, -- Recipe field only recipe = {{"","","","","","","","",""}}, -- Recipe field only
@ -956,6 +1058,27 @@ 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
----- -----
@ -1037,3 +1160,68 @@ for the wielded skeleton key.
if `nil` is returned, it is assumed that the wielder did not have if `nil` is returned, it is assumed that the wielder did not have
permissions to create a key for this node, and no key is created. permissions to create a key for this node, and no key is created.
`default.register_craft_metadata_copy(ingredient, result)`
----------------------------------------------------------
This function registers a shapeless recipe that takes `ingredient`
and `result` as input and outputs `result`.
The metadata of the input `result` is copied to the output `result`.
Log API
-------
Logs action of the player with a node at a certain position.
By default only actions of real players are logged.
Actions of non-players (usually machines) are logged only when
setting `log_non_player_actions` is enabled.
A player is considered non-player if `player:is_player()` returns
`false` or `player.is_fake_player` is truthy. The use of
`is_fake_player` is an unofficial standard between mods.
These non-players are marked by the content of `is_fake_player`
(if it is a string) or a "*" in brackets after the player name in
the log.
`default.log_player_action(player, ...)`
* `player` The player who performed the action
* `message_parts` Any mumber of message parts describing the action
in 3rd person singular present tense. It can also
contain a `pos` which is logged as "(X,Y,Z)"
`default.set_inventory_action_loggers(def, name)`
* hooks the callbacks `on_metadata_inventory_move`,
`on_metadata_inventory_put` and `on_metadata_inventory_take`
that log corresponding actions
* after logging the action, the original callback (if any) is called
* `def` See [Node definition]
* `name` Description of the node in the log message
Weather API
-----------
The weather mod will constantly adjust weather effects seen by the player
(that is: cloud parameters, shadow intensity, bloom and volumetric lighting).
These can be influenced using this API.
#### `weather.get = function(player)`
* Returns the current weather effects seen by the player.
It returns a table with two keys:
* `clouds`: A table (or `nil`) with cloud data following the same format as used for `player:set_clouds()`.
* `lighting`: A table (or `nil`) with lighting data following the same format as used for `player:set_lighting()`.
* `player`: ObjectRef of the relevant player
* You can override this function to change the weather effects by simply returning different values.
Setting `clouds` or `lighting` in the result table to `nil` will *prevent* those from changing.
Utilities
---------
`default.dig_up(pos, node, digger, max_height)`
* Find all nodes above `pos` that is the same, then dig them all
* `max_height` Maximum number of nodes to iterate. Default: 100

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.9 KiB

After

Width:  |  Height:  |  Size: 935 B

View File

@ -60,7 +60,22 @@ default:torch 99,default:cobble 99
# Default value is true. # Default value is true.
#enable_bed_night_skip = true #enable_bed_night_skip = true
# If enabled, fences and walls cannot be jumped over.
#enable_fence_tall = false
# Whether the engine's spawn search, which does not check for a suitable # Whether the engine's spawn search, which does not check for a suitable
# starting biome, is used. # starting biome, is used.
# Default value is false. # Default value is false.
#engine_spawn = false #engine_spawn = false
# Whether river water source nodes create flowing sounds.
# Helps rivers create more sound, especially on level sections.
#river_source_sounds = false
# If enabled, the 'weather' mod will control cloud parameters, shadow intensity,
# bloom and volumetric lighting.
# Non-functional in V6 or Singlenode mapgens.
#enable_weather = true
# If enabled, non-player actions are logged
#log_non_player_actions = false

View File

@ -15,11 +15,11 @@ BlockMen (CC BY-SA 3.0)
TumeniNodes (CC BY-SA 3.0) TumeniNodes (CC BY-SA 3.0)
beds_bed_under.png beds_bed_under.png
This mod adds a bed to Minetest which allows to skip the night. This mod adds a bed to Minetest which allows players to skip the night.
To sleep, rightclick the bed. If playing in singleplayer mode the night gets skipped To sleep, right click on the bed. If playing in singleplayer mode the night gets skipped
immediately. If playing multiplayer you get shown how many other players are in bed too, immediately. If playing multiplayer you get shown how many other players are in bed too,
if all players are sleeping the night gets skipped. The night skip can be forced if more if all players are sleeping the night gets skipped. The night skip can be forced if more
than 50% of the players are lying in bed and use this option. than half of the players are lying in bed and use this option.
Another feature is a controlled respawning. If you have slept in bed (not just lying in Another feature is a controlled respawning. If you have slept in bed (not just lying in
it) your respawn point is set to the beds location and you will respawn there after it) your respawn point is set to the beds location and you will respawn there after

View File

@ -1,5 +1,10 @@
-- Removes a node without calling on on_destruct()
local reverse = true -- We use this to mess with bed nodes without causing unwanted recursion.
local function remove_no_destruct(pos)
minetest.swap_node(pos, {name = "air"})
minetest.remove_node(pos) -- Now clear the meta
minetest.check_for_falling(pos)
end
local function destruct_bed(pos, n) local function destruct_bed(pos, n)
local node = minetest.get_node(pos) local node = minetest.get_node(pos)
@ -12,13 +17,11 @@ local function destruct_bed(pos, n)
local dir = minetest.facedir_to_dir(node.param2) local dir = minetest.facedir_to_dir(node.param2)
other = vector.add(pos, dir) other = vector.add(pos, dir)
end end
local oname = minetest.get_node(other).name
if reverse then if minetest.get_item_group(oname, "bed") ~= 0 then
reverse = not reverse remove_no_destruct(other)
minetest.remove_node(other) beds.remove_spawns_at(pos)
minetest.check_for_falling(other) beds.remove_spawns_at(other)
else
reverse = not reverse
end end
end end
@ -29,6 +32,7 @@ function beds.register_bed(name, def)
wield_image = def.wield_image, wield_image = def.wield_image,
drawtype = "nodebox", drawtype = "nodebox",
tiles = def.tiles.bottom, tiles = def.tiles.bottom,
use_texture_alpha = "clip",
paramtype = "light", paramtype = "light",
paramtype2 = "facedir", paramtype2 = "facedir",
is_ground_content = false, is_ground_content = false,
@ -93,8 +97,7 @@ function beds.register_bed(name, def)
minetest.set_node(pos, {name = name .. "_bottom", param2 = dir}) minetest.set_node(pos, {name = name .. "_bottom", param2 = dir})
minetest.set_node(botpos, {name = name .. "_top", param2 = dir}) minetest.set_node(botpos, {name = name .. "_top", param2 = dir})
if not (creative and creative.is_enabled_for if not minetest.is_creative_enabled(player_name) then
and creative.is_enabled_for(player_name)) then
itemstack:take_item() itemstack:take_item()
end end
return itemstack return itemstack
@ -111,10 +114,11 @@ function beds.register_bed(name, def)
on_rotate = function(pos, node, user, _, new_param2) on_rotate = function(pos, node, user, _, new_param2)
local dir = minetest.facedir_to_dir(node.param2) local dir = minetest.facedir_to_dir(node.param2)
-- old position of the top node
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 not minetest.get_item_group(node2.name, "bed") == 2 or if not node2 or minetest.get_item_group(node2.name, "bed") ~= 2 or
not node.param2 == node2.param2 then 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
@ -124,6 +128,7 @@ function beds.register_bed(name, def)
if new_param2 % 32 > 3 then if new_param2 % 32 > 3 then
return false return false
end end
-- new position of the top node
local newp = vector.add(pos, minetest.facedir_to_dir(new_param2)) local newp = vector.add(pos, minetest.facedir_to_dir(new_param2))
local node3 = minetest.get_node_or_nil(newp) local node3 = minetest.get_node_or_nil(newp)
local node_def = node3 and minetest.registered_nodes[node3.name] local node_def = node3 and minetest.registered_nodes[node3.name]
@ -135,8 +140,7 @@ function beds.register_bed(name, def)
return false return false
end end
node.param2 = new_param2 node.param2 = new_param2
-- do not remove_node here - it will trigger destroy_bed() remove_no_destruct(p)
minetest.set_node(p, {name = "air"})
minetest.set_node(pos, node) minetest.set_node(pos, node)
minetest.set_node(newp, {name = name .. "_top", param2 = new_param2}) minetest.set_node(newp, {name = name .. "_top", param2 = new_param2})
return true return true
@ -149,11 +153,13 @@ function beds.register_bed(name, def)
minetest.register_node(name .. "_top", { minetest.register_node(name .. "_top", {
drawtype = "nodebox", drawtype = "nodebox",
tiles = def.tiles.top, tiles = def.tiles.top,
use_texture_alpha = "clip",
paramtype = "light", paramtype = "light",
paramtype2 = "facedir", paramtype2 = "facedir",
is_ground_content = false, is_ground_content = false,
pointable = false, pointable = false,
groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 3, bed = 2}, groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 3, bed = 2,
not_in_creative_inventory = 1},
sounds = def.sounds or default.node_sound_wood_defaults(), sounds = def.sounds or default.node_sound_wood_defaults(),
drop = name .. "_bottom", drop = name .. "_bottom",
node_box = { node_box = {

View File

@ -1,7 +1,12 @@
-- beds/beds.lua
-- support for MT game translation.
local S = beds.get_translator
-- Fancy shaped bed -- Fancy shaped bed
beds.register_bed("beds:fancy_bed", { beds.register_bed("beds:fancy_bed", {
description = "Fancy Bed", description = S("Fancy Bed"),
inventory_image = "beds_bed_fancy.png", inventory_image = "beds_bed_fancy.png",
wield_image = "beds_bed_fancy.png", wield_image = "beds_bed_fancy.png",
tiles = { tiles = {
@ -52,7 +57,7 @@ beds.register_bed("beds:fancy_bed", {
-- Simple shaped bed -- Simple shaped bed
beds.register_bed("beds:bed", { beds.register_bed("beds:bed", {
description = "Simple Bed", description = S("Simple Bed"),
inventory_image = "beds_bed.png", inventory_image = "beds_bed.png",
wield_image = "beds_bed.png", wield_image = "beds_bed.png",
tiles = { tiles = {
@ -60,24 +65,24 @@ 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", "blank.png",
"beds_bed_side_bottom.png" "beds_bed_side_bottom.png"
}, },
top = { top = {
"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", "blank.png",
} }
}, },
nodebox = { nodebox = {
bottom = {-0.5, -0.5, -0.5, 0.5, 0.06, 0.5}, bottom = {-0.5, -0.5, -0.5, 0.5, 0.0625, 0.5},
top = {-0.5, -0.5, -0.5, 0.5, 0.06, 0.5}, top = {-0.5, -0.5, -0.5, 0.5, 0.0625, 0.5},
}, },
selectionbox = {-0.5, -0.5, -0.5, 0.5, 0.06, 1.5}, selectionbox = {-0.5, -0.5, -0.5, 0.5, 0.0625, 1.5},
recipe = { recipe = {
{"wool:white", "wool:white", "wool:white"}, {"wool:white", "wool:white", "wool:white"},
{"group:wood", "group:wood", "group:wood"} {"group:wood", "group:wood", "group:wood"}

View File

@ -1,2 +0,0 @@
default
wool

View File

@ -1,11 +1,13 @@
local pi = math.pi local pi = math.pi
local player_in_bed = 0
local is_sp = minetest.is_singleplayer() local is_sp = minetest.is_singleplayer()
local enable_respawn = minetest.settings:get_bool("enable_bed_respawn") local enable_respawn = minetest.settings:get_bool("enable_bed_respawn")
if enable_respawn == nil then if enable_respawn == nil then
enable_respawn = true enable_respawn = true
end end
-- support for MT game translation.
local S = beds.get_translator
-- Helper functions -- Helper functions
local function get_look_yaw(pos) local function get_look_yaw(pos)
@ -58,63 +60,105 @@ local function lay_down(player, pos, bed_pos, state, skip)
-- stand up -- stand up
if state ~= nil and not state then if state ~= nil and not state then
local p = beds.pos[name] or nil if not beds.player[name] then
if beds.player[name] ~= nil then -- player not in bed, do nothing
beds.player[name] = nil return false
beds.bed_position[name] = nil
player_in_bed = player_in_bed - 1
end end
beds.bed_position[name] = nil
-- skip here to prevent sending player specific changes (used for leaving players) -- skip here to prevent sending player specific changes (used for leaving players)
if skip then if skip then
return return
end end
if p then player:set_pos(beds.pos[name])
player:set_pos(p)
end
-- physics, eye_offset, etc -- physics, eye_offset, etc
local physics_override = beds.player[name].physics_override
beds.player[name] = nil
player:set_physics_override({
speed = physics_override.speed,
jump = physics_override.jump,
gravity = physics_override.gravity
})
player:set_eye_offset({x = 0, y = 0, z = 0}, {x = 0, y = 0, z = 0}) player:set_eye_offset({x = 0, y = 0, z = 0}, {x = 0, y = 0, z = 0})
player:set_look_horizontal(math.random(1, 180) / 100) player:set_look_horizontal(math.random(1, 180) / 100)
default.player_attached[name] = false player_api.player_attached[name] = false
player:set_physics_override(1, 1, 1)
hud_flags.wielditem = true hud_flags.wielditem = true
default.player_set_animation(player, "stand" , 30) player_api.set_animation(player, "stand" , 30)
-- lay down -- lay down
else else
beds.player[name] = 1
-- Check if bed is occupied
for _, other_pos in pairs(beds.bed_position) do
if vector.distance(bed_pos, other_pos) < 0.1 then
minetest.chat_send_player(name, S("This bed is already occupied!"))
return false
end
end
-- Check if player is moving
if vector.length(player:get_velocity()) > 0.001 then
minetest.chat_send_player(name, S("You have to stop moving before going to bed!"))
return false
end
-- Check if player is attached to an object
if player:get_attach() then
return false
end
if beds.player[name] then
-- player already in bed, do nothing
return false
end
beds.pos[name] = pos beds.pos[name] = pos
beds.bed_position[name] = bed_pos beds.bed_position[name] = bed_pos
player_in_bed = player_in_bed + 1 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)
local p = {x = bed_pos.x + dir.x / 2, y = bed_pos.y, z = bed_pos.z + dir.z / 2} -- p.y is just above the nodebox height of the 'Simple Bed' (the highest bed),
player:set_physics_override(0, 0, 0) -- to avoid sinking down through the bed.
local p = {
x = bed_pos.x + dir.x / 2,
y = bed_pos.y + 0.07,
z = bed_pos.z + dir.z / 2
}
player:set_physics_override({speed = 0, jump = 0, gravity = 0})
player:set_pos(p) player:set_pos(p)
default.player_attached[name] = true player_api.player_attached[name] = true
hud_flags.wielditem = false hud_flags.wielditem = false
default.player_set_animation(player, "lay" , 0) player_api.set_animation(player, "lay" , 0)
end end
player:hud_set_flags(hud_flags) player:hud_set_flags(hud_flags)
end end
local function get_player_in_bed_count()
local c = 0
for _, _ in pairs(beds.player) do
c = c + 1
end
return c
end
local function update_formspecs(finished) local function update_formspecs(finished)
local ges = #minetest.get_connected_players() local ges = #minetest.get_connected_players()
local form_n local player_in_bed = get_player_in_bed_count()
local is_majority = (ges / 2) < player_in_bed local is_majority = (ges / 2) < player_in_bed
local form_n
local esc = minetest.formspec_escape
if finished then if finished then
form_n = beds.formspec .. "label[2.7,9; Good morning.]" form_n = beds.formspec .. "label[2.7,9;" .. esc(S("Good morning.")) .. "]"
else else
form_n = beds.formspec .. "label[2.2,9;" .. tostring(player_in_bed) .. form_n = beds.formspec .. "label[2.2,9;" ..
" of " .. tostring(ges) .. " players are in bed]" esc(S("@1 of @2 players are in bed", player_in_bed, ges)) .. "]"
if is_majority and is_night_skip_enabled() then if is_majority and is_night_skip_enabled() then
form_n = form_n .. "button_exit[2,6;4,0.75;force;Force night skip]" form_n = form_n .. "button_exit[2,6;4,0.75;force;" ..
esc(S("Force night skip")) .. "]"
end end
end end
@ -137,16 +181,36 @@ 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 > 0.2 and tod < 0.805 then if tod > beds.day_interval.start and tod < beds.day_interval.finish then
if beds.player[name] then if beds.player[name] then
lay_down(player, nil, nil, false) lay_down(player, nil, nil, false)
end end
minetest.chat_send_player(name, "You can only sleep at night.") minetest.chat_send_player(name, S("You can only sleep at night."))
return return
end end
@ -162,17 +226,8 @@ 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
minetest.after(2, function() schedule_update()
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
@ -189,10 +244,9 @@ end
-- Callbacks -- Callbacks
-- Only register respawn callback if respawn enabled -- Only register respawn callback if respawn enabled
if enable_respawn then if enable_respawn then
-- respawn player at bed if enabled and valid position is found -- Respawn player at bed if valid position is found
minetest.register_on_respawnplayer(function(player) spawn.register_on_spawn(function(player, is_new)
local name = player:get_player_name() local pos = beds.spawn[player:get_player_name()]
local pos = beds.spawn[name]
if pos then if pos then
player:set_pos(pos) player:set_pos(pos)
return true return true
@ -205,13 +259,20 @@ 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
minetest.after(2, function() schedule_update()
update_formspecs(is_night_skip_enabled())
if is_night_skip_enabled() then
beds.skip_night()
beds.kick_players()
end end
end) end)
minetest.register_on_dieplayer(function(player)
local name = player:get_player_name()
local in_bed = beds.player
local pos = player:get_pos()
local yaw = get_look_yaw(pos)
if in_bed[name] then
lay_down(player, nil, pos, false)
player:set_look_horizontal(yaw)
player:set_pos(pos)
end end
end) end)
@ -223,7 +284,7 @@ minetest.register_on_player_receive_fields(function(player, formname, fields)
-- Because "Force night skip" button is a button_exit, it will set fields.quit -- Because "Force night skip" button is a button_exit, it will set fields.quit
-- and lay_down call will change value of player_in_bed, so it must be taken -- and lay_down call will change value of player_in_bed, so it must be taken
-- earlier. -- earlier.
local last_player_in_bed = player_in_bed local last_player_in_bed = get_player_in_bed_count()
if fields.quit or fields.leave then if fields.quit or fields.leave then
lay_down(player, nil, nil, false) lay_down(player, nil, nil, false)

View File

@ -1,13 +1,25 @@
-- beds/init.lua
-- Load support for MT game translation.
local S = minetest.get_translator("beds")
local esc = minetest.formspec_escape
beds = {} beds = {}
beds.player = {} beds.player = {}
beds.bed_position = {} beds.bed_position = {}
beds.pos = {} beds.pos = {}
beds.spawn = {} beds.spawn = {}
beds.get_translator = S
beds.formspec = "size[8,11;true]" .. beds.formspec = "size[8,11;true]" ..
"no_prepend[]" .. "no_prepend[]" ..
"bgcolor[#080808BB;true]" .. "bgcolor[#080808BB;true]" ..
"button_exit[2,10;4,0.75;leave;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")

View File

@ -0,0 +1,10 @@
# textdomain: beds
Fancy Bed=Schickes Bett
Simple Bed=Schlichtes Bett
This bed is already occupied!=Dieses Bett ist bereits belegt!
You have to stop moving before going to bed!=Sie müssen stehen bleiben, bevor Sie zu Bett gehen können!
Good morning.=Guten Morgen.
@1 of @2 players are in bed=@1 von @2 Spielern sind im Bett
Force night skip=Überspringen der Nacht erzwingen
You can only sleep at night.=Sie können nur nachts schlafen.
Leave Bed=Bett verlassen

View File

@ -0,0 +1,10 @@
# textdomain: beds
Fancy Bed=Luksa lito
Simple Bed=Simpla lito
This bed is already occupied!=Tiu lito jam estas okupata!
You have to stop moving before going to bed!=Vi ĉesu moviĝi por enlitiĝi!
Good morning.=Bonan matenon.
@1 of @2 players are in bed=@1 el @2 ludantoj estas en lito
Force night skip=Devigi noktan salton
You can only sleep at night.=Vi povas dormi nur nokte.
Leave Bed=Ellitiĝi

View File

@ -0,0 +1,10 @@
# textdomain: beds
Fancy Bed=Cama de lujo
Simple Bed=Cama sencilla
This bed is already occupied!=Esta cama esta ocupada
You have to stop moving before going to bed!=Deja de moverte o no podras acostarte
Good morning.=Buenos días.
@1 of @2 players are in bed=@1 de @2 jugadores están durmiendo
Force night skip=Forzar hacer de dia
You can only sleep at night.=Sólo puedes dormir por la noche.
Leave Bed=Levantarse

View File

@ -0,0 +1,10 @@
# textdomain: beds
Fancy Bed=Lit chic
Simple Bed=Lit simple
This bed is already occupied!=Ce lit est déjà occupé !
You have to stop moving before going to bed!=Vous devez arrêter de bouger avant de vous coucher !
Good morning.=Bonjour.
@1 of @2 players are in bed=@1 joueur(s) sur @2 sont au lit
Force night skip=Forcer le passage de la nuit
You can only sleep at night.=Vous ne pouvez dormir que la nuit.
Leave Bed=Se lever du lit

View File

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

View File

@ -0,0 +1,10 @@
# textdomain: beds
Fancy Bed=Letto decorato
Simple Bed=Letto semplice
This bed is already occupied!=
You have to stop moving before going to bed!=
Good morning.=
@1 of @2 players are in bed=
Force night skip=
You can only sleep at night.=
Leave Bed=Alzati dal letto

View File

@ -0,0 +1,10 @@
# textdomain: beds
Fancy Bed=ファンシーなベッド
Simple Bed=シンプルなベッド
This bed is already occupied!=ベッドはすでに使われています!
You have to stop moving before going to bed!=寝るときは動かないでください!
Good morning.=おはようございます。
@1 of @2 players are in bed=ベッドに@1 / @2人います
Force night skip=強制的に夜をスキップします
You can only sleep at night.=夜しか寝れません。
Leave Bed=ベッドから出ます

View File

@ -0,0 +1,10 @@
# textdomain: beds
Fancy Bed=lo selja'i ckana
Simple Bed=lo sampu ckana
This bed is already occupied!=.i lo ti ckana cu canlu
You have to stop moving before going to bed!=lo nu do cando cu sarcu lo nu do sipna
Good morning.=.i .uise'inai cerni
@1 of @2 players are in bed=.i @1 cmima be lu'i @2 le pilno cu vreta lo ckana
Force night skip=bapli le nu co'u nicte
You can only sleep at night.=.i steci le ka nicte kei fa le ka do kakne le ka sipna ca pa ckaji be ce'u
Leave Bed=cliva lo ckana

View File

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

View File

@ -0,0 +1,10 @@
# textdomain: beds
Fancy Bed=Fantazyjne łóżko
Simple Bed=Proste łóżko
This bed is already occupied!=To łóżko jest już zajęte!
You have to stop moving before going to bed!=Musisz się zatrzymać aby wejść do łóżka
Good morning.=Dzień dobry.
@1 of @2 players are in bed=@1 z @2 graczy śpią
Force night skip=Wymuś pominięcie nocy
You can only sleep at night.=Możesz spać tylko w nocy.
Leave Bed=Opuść łóżko

View File

@ -0,0 +1,10 @@
# textdomain: beds
Fancy Bed=Cama Bonita
Simple Bed=Cama Simples
This bed is already occupied!=Esta cama já está ocupada!
You have to stop moving before going to bed!=Você precisa parar de se mover antes de ir para cama!
Good morning.=Bom dia.
@1 of @2 players are in bed=@1 de @2 jogadores estão na cama
Force night skip=Forçar o amanhecer
You can only sleep at night.=Você só pode dormir à noite
Leave Bed=Sair da Cama

View File

@ -0,0 +1,10 @@
# textdomain: beds
Fancy Bed=Красивая кровать
Simple Bed=Простая кровать
This bed is already occupied!=Эта кровать уже занята!
You have to stop moving before going to bed!=Вам нужно перестать двигаться чтобы лечь!
Good morning.=Доброе утро.
@1 of @2 players are in bed=@1 из @2 игроков в кровати
Force night skip=Пропустить ночь
You can only sleep at night.=Вы можете спать только ночью.
Leave Bed=Встать с кровати

View File

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

View File

@ -0,0 +1,10 @@
# textdomain: beds
Fancy Bed=Fin säng
Simple Bed=Enkel säng
This bed is already occupied!=Den här sängen används redan!
You have to stop moving before going to bed!=Du måste stanna innan du kan lägga dig!
Good morning.=God morgon.
@1 of @2 players are in bed=@1 av @2 spelare försöker sova.
Force night skip=Tvinga att hoppa över natt
You can only sleep at night.=Du kan bara sova på natten.
Leave Bed=Lämna säng

View File

@ -0,0 +1,10 @@
# textdomain: beds
Fancy Bed=Гарне ліжко
Simple Bed=Просте ліжко
This bed is already occupied!=Це ліжко вже зайняте!
You have to stop moving before going to bed!=Зупиніться перед тим як лягти!
Good morning.=Доброго ранку.
@1 of @2 players are in bed=@1 з @2 гравців(-я) у ліжку
Force night skip=Пропустити ніч
You can only sleep at night.=Ви можете спати лише вночі.
Leave Bed=Встати з ліжка

View File

@ -0,0 +1,10 @@
# textdomain: beds
Fancy Bed=花式床
Simple Bed=简易床
This bed is already occupied!=床上已有人!
You have to stop moving before going to bed!=上床前要停止移动!
Good morning.=早安!
@1 of @2 players are in bed=@2位玩家中的@1位在床上
Force night skip=强制跳过夜晚
You can only sleep at night.=你只能在晚上睡觉。
Leave Bed=离开床

View File

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

View File

@ -0,0 +1,10 @@
# textdomain: beds
Fancy Bed=
Simple Bed=
This bed is already occupied!=
You have to stop moving before going to bed!=
Good morning.=
@1 of @2 players are in bed=
Force night skip=
You can only sleep at night.=
Leave Bed=

3
mods/beds/mod.conf Normal file
View File

@ -0,0 +1,3 @@
name = beds
description = Minetest Game mod: beds
depends = default, wool, spawn

View File

@ -61,3 +61,12 @@ function beds.set_spawns()
end end
beds.save_spawns() beds.save_spawns()
end end
function beds.remove_spawns_at(pos)
for name, p in pairs(beds.spawn) do
if vector.equals(vector.round(p), pos) then
beds.spawn[name] = nil
end
end
beds.save_spawns()
end

Binary file not shown.

Before

Width:  |  Height:  |  Size: 540 B

After

Width:  |  Height:  |  Size: 490 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 537 B

After

Width:  |  Height:  |  Size: 486 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 390 B

After

Width:  |  Height:  |  Size: 340 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 387 B

After

Width:  |  Height:  |  Size: 343 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 296 B

After

Width:  |  Height:  |  Size: 248 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 316 B

After

Width:  |  Height:  |  Size: 265 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 561 B

After

Width:  |  Height:  |  Size: 431 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 537 B

After

Width:  |  Height:  |  Size: 427 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 611 B

After

Width:  |  Height:  |  Size: 464 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 596 B

After

Width:  |  Height:  |  Size: 446 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 583 B

After

Width:  |  Height:  |  Size: 474 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 616 B

After

Width:  |  Height:  |  Size: 547 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 495 B

After

Width:  |  Height:  |  Size: 425 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 556 B

After

Width:  |  Height:  |  Size: 490 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 304 B

After

Width:  |  Height:  |  Size: 251 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 143 B

View File

@ -1,2 +0,0 @@
default
creative?

View File

@ -1,27 +1,23 @@
-- binoculars/init.lua
-- Mod global namespace -- Mod global namespace
binoculars = {} binoculars = {}
-- Load support for MT game translation.
-- Detect creative mod local S = minetest.get_translator("binoculars")
local creative_mod = minetest.get_modpath("creative")
-- Cache creative mode setting as fallback if creative mod not present
local creative_mode_cache = minetest.settings:get_bool("creative_mode")
-- Update player property -- Update player property
-- Global to allow overriding -- Global to allow overriding
function binoculars.update_player_property(player) function binoculars.update_player_property(player)
local creative_enabled =
(creative_mod and creative.is_enabled_for(player:get_player_name())) or
creative_mode_cache
local new_zoom_fov = 0 local new_zoom_fov = 0
if player:get_inventory():contains_item( if player:get_inventory():contains_item(
"main", "binoculars:binoculars") then "main", "binoculars:binoculars") then
new_zoom_fov = 10 new_zoom_fov = 10
elseif creative_enabled then elseif minetest.is_creative_enabled(player:get_player_name()) then
new_zoom_fov = 15 new_zoom_fov = 15
end end
@ -54,9 +50,10 @@ minetest.after(4.7, cyclic_update)
-- Binoculars item -- Binoculars item
minetest.register_craftitem("binoculars:binoculars", { minetest.register_craftitem("binoculars:binoculars", {
description = "Binoculars\nUse 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

@ -0,0 +1,3 @@
# textdomain: binoculars
Binoculars=Fernglas
Use with 'Zoom' key=Mit „Zoom“-Taste benutzen

View File

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

View File

@ -0,0 +1,3 @@
# textdomain: binoculars
Binoculars=Prismáticos
Use with 'Zoom' key=Usar con la tecla 'Zoom'

View File

@ -0,0 +1,3 @@
# textdomain: binoculars
Binoculars=Jumelles
Use with 'Zoom' key=Utiliser avec le bouton « Zoom »

View File

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

View File

@ -0,0 +1,3 @@
# textdomain: binoculars
Binoculars=Binocolo
Use with 'Zoom' key=Usalo col tasto 'Ingrandimento'

View File

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

View File

@ -0,0 +1,3 @@
# textdomain: binoculars
Binoculars=lo reldarvistci
Use with 'Zoom' key=.i tu'a le jvinu banro batke cu tadji lo nu pilno

View File

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

View File

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

View File

@ -0,0 +1,3 @@
# textdomain: binoculars
Binoculars=Binóculos
Use with 'Zoom' key=Use com a tecla de 'Zoom'

View File

@ -0,0 +1,3 @@
# textdomain: binoculars
Binoculars=Бинокль
Use with 'Zoom' key=Используется клавишей 'Приближение'

View File

@ -0,0 +1,3 @@
# textdomain: binoculars
Binoculars=Ďalekohľad
Use with 'Zoom' key=Použi s klávesou "Priblíž"

View File

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

View File

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

View File

@ -0,0 +1,3 @@
# textdomain: binoculars
Binoculars=望远镜
Use with 'Zoom' key=与“缩放”键一起使用

View File

@ -0,0 +1,3 @@
# textdomain: binoculars
Binoculars=望遠鏡
Use with 'Zoom' key=與“縮放”鍵一起使用

View File

@ -0,0 +1,3 @@
# textdomain: binoculars
Binoculars=
Use with 'Zoom' key=

3
mods/binoculars/mod.conf Normal file
View File

@ -0,0 +1,3 @@
name = binoculars
description = Minetest Game mod: binoculars
depends = default

View File

@ -1,2 +0,0 @@
default
player_api

View File

@ -1,3 +1,8 @@
-- boats/init.lua
-- Load support for MT game translation.
local S = minetest.get_translator("boats")
-- --
-- Helper functions -- Helper functions
-- --
@ -8,15 +13,6 @@ local function is_water(pos)
end end
local function get_sign(i)
if i == 0 then
return 0
else
return i / math.abs(i)
end
end
local function get_velocity(v, yaw, y) local function get_velocity(v, yaw, y)
local x = -math.sin(yaw) * v local x = -math.sin(yaw) * v
local z = math.cos(yaw) * v local z = math.cos(yaw) * v
@ -57,10 +53,9 @@ 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
self.driver = nil -- Cleanup happens in boat.on_detach_child
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}
@ -68,18 +63,12 @@ function boat.on_rightclick(self, clicker)
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)
@ -90,9 +79,13 @@ 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
function boat.on_activate(self, staticdata, dtime_s) function boat.on_activate(self, staticdata, dtime_s)
@ -123,8 +116,7 @@ function boat.on_punch(self, puncher)
if not self.driver then if not self.driver then
self.removed = true self.removed = true
local inv = puncher:get_inventory() local inv = puncher:get_inventory()
if not (creative and creative.is_enabled_for if not minetest.is_creative_enabled(name)
and creative.is_enabled_for(name))
or not inv:contains_item("main", "boats:boat") then or not inv:contains_item("main", "boats:boat") then
local leftover = inv:add_item("main", "boats:boat") local leftover = inv:add_item("main", "boats:boat")
-- if no room in inventory add a replacement boat to the world -- if no room in inventory add a replacement boat to the world
@ -141,7 +133,7 @@ end
function boat.on_step(self, dtime) function boat.on_step(self, dtime)
self.v = get_v(self.object:get_velocity()) * get_sign(self.v) self.v = get_v(self.object:get_velocity()) * math.sign(self.v)
if self.driver then if self.driver then
local driver_objref = minetest.get_player_by_name(self.driver) local driver_objref = minetest.get_player_by_name(self.driver)
if driver_objref then if driver_objref then
@ -149,16 +141,16 @@ function boat.on_step(self, dtime)
if ctrl.up and ctrl.down then if ctrl.up and ctrl.down then
if not self.auto then if not self.auto then
self.auto = true self.auto = true
minetest.chat_send_player(self.driver, "[boats] Cruise on") minetest.chat_send_player(self.driver, S("Boat cruise mode on"))
end end
elseif ctrl.down then elseif ctrl.down then
self.v = self.v - dtime * 1.8 self.v = self.v - dtime * 2.0
if self.auto then if self.auto then
self.auto = false self.auto = false
minetest.chat_send_player(self.driver, "[boats] Cruise off") minetest.chat_send_player(self.driver, S("Boat cruise mode off"))
end end
elseif ctrl.up or self.auto then elseif ctrl.up or self.auto then
self.v = self.v + dtime * 1.8 self.v = self.v + dtime * 2.0
end end
if ctrl.left then if ctrl.left then
if self.v < -0.001 then if self.v < -0.001 then
@ -176,19 +168,19 @@ function boat.on_step(self, dtime)
end end
end end
local velo = self.object:get_velocity() local velo = self.object:get_velocity()
if self.v == 0 and velo.x == 0 and velo.y == 0 and velo.z == 0 then if not self.driver and
self.v == 0 and velo.x == 0 and velo.y == 0 and velo.z == 0 then
self.object:set_pos(self.object:get_pos()) self.object:set_pos(self.object:get_pos())
return return
end end
local s = get_sign(self.v) -- We need to preserve velocity sign to properly apply drag force
self.v = self.v - dtime * 0.6 * s -- while moving backward
if s ~= get_sign(self.v) then local drag = dtime * math.sign(self.v) * (0.01 + 0.0796 * self.v * self.v)
self.object:set_velocity({x = 0, y = 0, z = 0}) -- If drag is larger than velocity, then stop horizontal movement
if math.abs(self.v) <= math.abs(drag) then
self.v = 0 self.v = 0
return else
end self.v = self.v - drag
if math.abs(self.v) > 5 then
self.v = 5 * get_sign(self.v)
end end
local p = self.object:get_pos() local p = self.object:get_pos()
@ -242,7 +234,7 @@ minetest.register_entity("boats:boat", boat)
minetest.register_craftitem("boats:boat", { minetest.register_craftitem("boats:boat", {
description = "Boat", description = S("Boat"),
inventory_image = "boats_inventory.png", inventory_image = "boats_inventory.png",
wield_image = "boats_wield.png", wield_image = "boats_wield.png",
wield_scale = {x = 2, y = 2, z = 1}, wield_scale = {x = 2, y = 2, z = 1},
@ -273,8 +265,7 @@ minetest.register_craftitem("boats:boat", {
boat:set_yaw(placer:get_look_horizontal()) boat:set_yaw(placer:get_look_horizontal())
end end
local player_name = placer and placer:get_player_name() or "" local player_name = placer and placer:get_player_name() or ""
if not (creative and creative.is_enabled_for and if not minetest.is_creative_enabled(player_name) then
creative.is_enabled_for(player_name)) then
itemstack:take_item() itemstack:take_item()
end end
end end

View File

@ -0,0 +1,4 @@
# textdomain: boats
Boat cruise mode on=Schneller Bootsmodus an
Boat cruise mode off=Schneller Bootsmodus aus
Boat=Boot

View File

@ -0,0 +1,4 @@
# textdomain: boats
Boat cruise mode on=La kroza maniero de la boato estas ŝaltita.
Boat cruise mode off=La kroza maniero de la boato estas malŝaltita.
Boat=Boato

View File

@ -0,0 +1,4 @@
# textdomain: boats
Boat cruise mode on=Modo crucero en bote activado
Boat cruise mode off=Modo crucero en bote desactivado
Boat=Bote

View File

@ -0,0 +1,4 @@
# textdomain: boats
Boat cruise mode on=Bateau mode rapide activé
Boat cruise mode off=Bateau mode rapide désactivé
Boat=Bateau

View File

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

View File

@ -0,0 +1,4 @@
# textdomain: boats
Boat cruise mode on=Modalità movimento automatico barca attivata
Boat cruise mode off=Modalità movimento automatico barca disattivata
Boat=Barca

View File

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

View File

@ -0,0 +1,4 @@
# textdomain: boats
Boat cruise mode on=.i lo bloti cu zmiku le ka klama
Boat cruise mode off=.i lo bloti cu macnu le ka klama
Boat=lo bloti

View File

@ -0,0 +1,4 @@
# textdomain: boats
Boat cruise mode on=Mod jelajah bot dihidupkan
Boat cruise mode off=Mod jelajah bot dimatikan
Boat=Bot

View File

@ -0,0 +1,4 @@
# textdomain: boats
Boat cruise mode on=Tryb rejsu łodką włączony
Boat cruise mode off=Tryb rejsu łodką wyłączony
Boat=Łódka

View File

@ -0,0 +1,4 @@
# textdomain: boats
Boat cruise mode on=Modo de cruseiro do barco ligado
Boat cruise mode off=Modo de cruseiro do barco desligado
Boat=Barco

View File

@ -0,0 +1,4 @@
# textdomain: boats
Boat cruise mode on=Автоход лодки включен
Boat cruise mode off=Автоход лодки выключен
Boat=Лодка

View File

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

View File

@ -0,0 +1,4 @@
# textdomain: boats
Boat cruise mode on=Båtkryssningsläge på
Boat cruise mode off=Båtkryssningsläge av
Boat=Båt

View File

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

View File

@ -0,0 +1,4 @@
# textdomain: boats
Boat cruise mode on=巡航模式开启
Boat cruise mode off=巡航模式关闭
Boat=船

View File

@ -0,0 +1,4 @@
# textdomain: boats
Boat cruise mode on=巡航模式開啟
Boat cruise mode off=巡航模式關閉
Boat=船

View File

@ -0,0 +1,4 @@
# textdomain: boats
Boat cruise mode on=
Boat cruise mode off=
Boat=

3
mods/boats/mod.conf Normal file
View File

@ -0,0 +1,3 @@
name = boats
description = Minetest Game mod: boats
depends = default, player_api

View File

@ -1 +0,0 @@
default

View File

@ -1,6 +1,11 @@
-- bones/init.lua
-- Minetest 0.4 mod: bones -- Minetest 0.4 mod: bones
-- See README.txt for licensing and other information. -- See README.txt for licensing and other information.
-- Load support for MT game translation.
local S = minetest.get_translator("bones")
bones = {} bones = {}
local function is_owner(pos, name) local function is_owner(pos, name)
@ -11,6 +16,27 @@ local function is_owner(pos, name)
return false return false
end end
local function drop(pos, itemstack)
local obj = minetest.add_item(pos, itemstack:take_item(itemstack:get_count()))
if obj then
obj:set_velocity({
x = math.random(-10, 10) / 9,
y = 5,
z = math.random(-10, 10) / 9,
})
end
end
local function drop_contents(pos)
local inv = minetest.get_meta(pos):get_inventory()
for i = 1, inv:get_size("main") do
local stk = inv:get_stack("main", i)
drop(pos, stk)
end
minetest.remove_node(pos)
end
local bones_formspec = local bones_formspec =
"size[8,9]" .. "size[8,9]" ..
"list[current_name;main;0,0.3;8,4;]" .. "list[current_name;main;0,0.3;8,4;]" ..
@ -23,8 +49,8 @@ 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
minetest.register_node("bones:bones", { local bones_def = {
description = "Bones", description = S("Bones"),
tiles = { tiles = {
"bones_top.png^[transform2", "bones_top.png^[transform2",
"bones_bottom.png", "bones_bottom.png",
@ -82,6 +108,11 @@ minetest.register_node("bones:bones", {
return return
end end
if not player:is_player() then
drop_contents(pos)
return
end
if minetest.get_meta(pos):get_string("infotext") == "" then if minetest.get_meta(pos):get_string("infotext") == "" then
return return
end end
@ -116,7 +147,7 @@ minetest.register_node("bones:bones", {
local meta = minetest.get_meta(pos) local meta = minetest.get_meta(pos)
local time = meta:get_int("time") + elapsed local time = meta:get_int("time") + elapsed
if time >= share_bones_time then if time >= share_bones_time then
meta:set_string("infotext", meta:get_string("owner") .. "'s old bones") meta:set_string("infotext", S("@1's old bones", meta:get_string("owner")))
meta:set_string("owner", "") meta:set_string("owner", "")
else else
meta:set_int("time", time) meta:set_int("time", time)
@ -125,7 +156,11 @@ minetest.register_node("bones:bones", {
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
@ -136,8 +171,18 @@ local function may_replace(pos, player)
return false return false
end end
-- allow replacing air and liquids -- allow replacing air
if node_name == "air" or node_definition.liquidtype ~= "none" then if node_name == "air" then
return true
end
-- don't replace nodes inside protections
if minetest.is_protected(pos, player:get_player_name()) then
return false
end
-- allow replacing liquids
if node_definition.liquidtype ~= "none" then
return true return true
end end
@ -149,19 +194,7 @@ local function may_replace(pos, player)
-- default to each nodes buildable_to; if a placed block would replace it, why shouldn't bones? -- default to each nodes buildable_to; if a placed block would replace it, why shouldn't bones?
-- flowers being squished by bones are more realistical than a squished stone, too -- flowers being squished by bones are more realistical than a squished stone, too
-- exception are of course any protected buildable_to return node_definition.buildable_to
return node_definition.buildable_to and not minetest.is_protected(pos, player:get_player_name())
end
local drop = function(pos, itemstack)
local obj = minetest.add_item(pos, itemstack:take_item(itemstack:get_count()))
if obj then
obj:set_velocity({
x = math.random(-10, 10) / 9,
y = 5,
z = math.random(-10, 10) / 9,
})
end
end end
local player_inventory_lists = { "main", "craft" } local player_inventory_lists = { "main", "craft" }
@ -177,7 +210,6 @@ local function is_all_empty(player_inv)
end end
minetest.register_on_dieplayer(function(player) minetest.register_on_dieplayer(function(player)
local bones_mode = minetest.settings:get("bones_mode") or "bones" local bones_mode = minetest.settings:get("bones_mode") or "bones"
if bones_mode ~= "bones" and bones_mode ~= "drop" and bones_mode ~= "keep" then if bones_mode ~= "bones" and bones_mode ~= "drop" and bones_mode ~= "keep" then
bones_mode = "bones" bones_mode = "bones"
@ -189,12 +221,11 @@ minetest.register_on_dieplayer(function(player)
local pos_string = minetest.pos_to_string(pos) local pos_string = minetest.pos_to_string(pos)
-- return if keep inventory set or in creative mode -- return if keep inventory set or in creative mode
if bones_mode == "keep" or (creative and creative.is_enabled_for if bones_mode == "keep" or minetest.is_creative_enabled(player_name) then
and creative.is_enabled_for(player:get_player_name())) then
minetest.log("action", player_name .. " dies at " .. pos_string .. minetest.log("action", player_name .. " dies at " .. pos_string ..
". No bones placed") ". No bones placed")
if bones_position_message then if bones_position_message then
minetest.chat_send_player(player_name, player_name .. " died at " .. pos_string .. ".") minetest.chat_send_player(player_name, S("@1 died at @2.", player_name, pos_string))
end end
return return
end end
@ -204,7 +235,7 @@ minetest.register_on_dieplayer(function(player)
minetest.log("action", player_name .. " dies at " .. pos_string .. minetest.log("action", player_name .. " dies at " .. pos_string ..
". No bones placed") ". No bones placed")
if bones_position_message then if bones_position_message then
minetest.chat_send_player(player_name, player_name .. " died at " .. pos_string .. ".") minetest.chat_send_player(player_name, S("@1 died at @2.", player_name, pos_string))
end end
return return
end end
@ -212,7 +243,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 and not minetest.is_protected(air, player_name) then if air then
pos = air pos = air
else else
bones_mode = "drop" bones_mode = "drop"
@ -230,8 +261,7 @@ minetest.register_on_dieplayer(function(player)
minetest.log("action", player_name .. " dies at " .. pos_string .. minetest.log("action", player_name .. " dies at " .. pos_string ..
". Inventory dropped") ". Inventory dropped")
if bones_position_message then if bones_position_message then
minetest.chat_send_player(player_name, player_name .. " died at " .. pos_string .. minetest.chat_send_player(player_name, S("@1 died at @2, and dropped their inventory.", player_name, pos_string))
", and dropped their inventory.")
end end
return return
end end
@ -242,8 +272,7 @@ minetest.register_on_dieplayer(function(player)
minetest.log("action", player_name .. " dies at " .. pos_string .. minetest.log("action", player_name .. " dies at " .. pos_string ..
". Bones placed") ". Bones placed")
if bones_position_message then if bones_position_message then
minetest.chat_send_player(player_name, player_name .. " died at " .. pos_string .. minetest.chat_send_player(player_name, S("@1 died at @2, and bones were placed.", player_name, pos_string))
", and bones were placed.")
end end
local meta = minetest.get_meta(pos) local meta = minetest.get_meta(pos)
@ -266,7 +295,7 @@ minetest.register_on_dieplayer(function(player)
meta:set_string("owner", player_name) meta:set_string("owner", player_name)
if share_bones_time ~= 0 then if share_bones_time ~= 0 then
meta:set_string("infotext", player_name .. "'s fresh bones") meta:set_string("infotext", S("@1's fresh bones", player_name))
if share_bones_time_early == 0 or not minetest.is_protected(pos, player_name) then if share_bones_time_early == 0 or not minetest.is_protected(pos, player_name) then
meta:set_int("time", 0) meta:set_int("time", 0)
@ -276,6 +305,6 @@ minetest.register_on_dieplayer(function(player)
minetest.get_node_timer(pos):start(10) minetest.get_node_timer(pos):start(10)
else else
meta:set_string("infotext", player_name.."'s bones") meta:set_string("infotext", S("@1's bones", player_name))
end end
end) end)

View File

@ -0,0 +1,8 @@
# textdomain: bones
Bones=Knochen
@1's old bones=Alte Knochen von @1
@1 died at @2.=@1 starb bei @2.
@1 died at @2, and dropped their inventory.=@1 starb bei @2 und ließ das Inventar fallen.
@1 died at @2, and bones were placed.=@1 starb bei @2 und Knochen wurden platziert.
@1's fresh bones=Frische Knochen von @1
@1's bones=Knochen von @1

View File

@ -0,0 +1,8 @@
# textdomain: bones
Bones=Ostoj
@1's old bones=La malfreŝaj ostoj de @1
@1 died at @2.=@1 mortis ĉe @2
@1 died at @2, and dropped their inventory.=@1 mortis ĉe @2, kaj delasis sian stokon.
@1 died at @2, and bones were placed.=@1 mortis ĉe @2, kaj ostoj estas demetitaj.
@1's fresh bones=La freŝaj ostoj de @1
@1's bones=La ostoj de @1

View File

@ -0,0 +1,8 @@
# textdomain: bones
Bones=Huesos
@1's old bones=Huesos antiguos de @1
@1 died at @2.=@1 murió en @2.
@1 died at @2, and dropped their inventory.=@1 murió en @2, y su inventario se desprendió.
@1 died at @2, and bones were placed.=@1 murió en @2, y sus huesos fueron depositados.
@1's fresh bones=Huesos recientes de @1
@1's bones=Huesos de @1

View File

@ -0,0 +1,8 @@
# textdomain: bones
Bones=Os
@1's old bones=Vieux os de @1
@1 died at @2.=@1 est mort à @2.
@1 died at @2, and dropped their inventory.=@1 est mort à @2 et a laissé tomber son inventaire.
@1 died at @2, and bones were placed.=@1 est mort à @2 et ses os ont été placés.
@1's fresh bones=Os frais de @1
@1's bones=Os de @1

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