Compare commits
436 Commits
Author | SHA1 | Date | |
---|---|---|---|
e7a55734d3 | |||
b36b154257 | |||
3976dc6a5b | |||
8ea031ef77 | |||
8c3f96d738 | |||
8d3d558e42 | |||
de3adb5859 | |||
acafe5ca86 | |||
12c763a6c7 | |||
098ea0d10a | |||
f14b411157 | |||
1a6298958e | |||
fafbe2c268 | |||
dc7cbdd5ab | |||
5cd4b5a231 | |||
f62afa02b7 | |||
7a892c70e6 | |||
682d79b82a | |||
8b384fb257 | |||
d6c33da355 | |||
386dcdef06 | |||
54b87e955d | |||
f32a3ff57c | |||
16fe1efcd8 | |||
fa43bd8a56 | |||
e426f64993 | |||
ab7b7c7504 | |||
80664f9f8a | |||
0ca43e42bc | |||
33aa5e77dc | |||
f8e273da15 | |||
9ece86cc7a | |||
7d93272caa | |||
64fe69f382 | |||
a2d4e57716 | |||
8114c3dbab | |||
e6cef57661 | |||
0736d30e33 | |||
da5f4a939e | |||
a84e2669c7 | |||
ccee025ce3 | |||
8c801529df | |||
3ddff2fbea | |||
eafd1ebc43 | |||
3623398b78 | |||
b25889e742 | |||
9f4dc1412b | |||
cfef21f4d9 | |||
8556dd30e2 | |||
8cd049c224 | |||
12d5ca2f48 | |||
3ecafbcfb4 | |||
082b36d3e7 | |||
7be008936e | |||
6e1a329763 | |||
47b197e4d5 | |||
be05441e77 | |||
aadac1223d | |||
9a6cb2d7c8 | |||
f4e77edcc6 | |||
e38f69d549 | |||
874b1ae326 | |||
1977ae19ae | |||
7bbbcbf7b0 | |||
4d7dbfc826 | |||
787ccb5747 | |||
12bcfeab4d | |||
14334a1d89 | |||
6749da1070 | |||
7a29d26e3e | |||
7cba7af894 | |||
a71948c007 | |||
c3d2bc383b | |||
7d55320d5c | |||
0d3bca790c | |||
ffba9d978e | |||
1a5f89e750 | |||
51891122f2 | |||
537f94c28e | |||
da0cc7f6f6 | |||
b57dd0f9b2 | |||
8fdcfea9f9 | |||
9de43cdf7d | |||
a2ecc51fbc | |||
d90a081722 | |||
70248505ae | |||
22e32a01ad | |||
c94349eaef | |||
41c2b2aeea | |||
cb57f70aab | |||
f18871d60c | |||
c17c317669 | |||
7c966db4bc | |||
e5304ce674 | |||
28884cc784 | |||
dfee51c21e | |||
20053d6b52 | |||
079b796031 | |||
9c887e0b32 | |||
2fb40be409 | |||
f8f7502e32 | |||
b998ab1b3a | |||
d979293f14 | |||
676822d286 | |||
a5ad30748d | |||
45bc0b245f | |||
aa676ab878 | |||
f80fafbcfb | |||
7f317871d4 | |||
68f5740dcc | |||
6c6cc2159a | |||
aa254e2835 | |||
29252c6fb2 | |||
ac843f8fe7 | |||
0410b5e0ca | |||
3a98245f62 | |||
00a0d9a5d4 | |||
5d28040915 | |||
62dbf29301 | |||
6493e5fefb | |||
42cc6d2c31 | |||
3a55e19055 | |||
ea2a7d3b1f | |||
2c355a8642 | |||
777088481b | |||
6b055ae18a | |||
4c9944b263 | |||
73d998ccdf | |||
3fcb7821d7 | |||
ed9fd475de | |||
2cc6640edf | |||
bbf17c9eca | |||
1ab0fc12a7 | |||
5569950b26 | |||
363b95c003 | |||
8422f2ef52 | |||
36d18cb161 | |||
b47a556472 | |||
7d2dfe4101 | |||
04f01bc57f | |||
7a3cff5529 | |||
8f095c62a8 | |||
f600a9f645 | |||
9e54b379c8 | |||
5994ac8dc5 | |||
c198d8c57e | |||
09dbaf7972 | |||
0add474af2 | |||
0ea23a50d3 | |||
2f39cad09b | |||
a4e144e4c8 | |||
f4512cb5b6 | |||
38a8351327 | |||
a5d40e13be | |||
4b8410a982 | |||
250be40ecd | |||
322967d2d1 | |||
f41314185e | |||
6d79d157c3 | |||
6267f26027 | |||
535e611eb1 | |||
223e924edf | |||
556f0d48e3 | |||
57939c6c3f | |||
9542d119f6 | |||
7488f483c7 | |||
b0ec8f1b5a | |||
c76a91943c | |||
0472e61a9d | |||
e9a7782c88 | |||
76471dd137 | |||
11115c7d15 | |||
481d1758ad | |||
32bdb9a393 | |||
82299b94dc | |||
b1e2ece638 | |||
eaed418b10 | |||
8704afe5b1 | |||
c3a1545ca1 | |||
a1b8b68e92 | |||
b57ecb94df | |||
c66a98bbed | |||
25e1f84733 | |||
b8333cf82a | |||
abf0ca9c7e | |||
135d80eb86 | |||
0d49978341 | |||
4ef6810298 | |||
1d8def5c06 | |||
e41a411f1c | |||
e67e28d226 | |||
3d6f1685ad | |||
592ca341ea | |||
a88576afd1 | |||
6f6d46ddfc | |||
7c0abe9366 | |||
321bd66721 | |||
2729777b94 | |||
f3dc78204c | |||
b292975fbc | |||
3fb6ee5bdf | |||
ef8b7e230d | |||
c15bd9d529 | |||
41c1e99b1f | |||
70e8924082 | |||
f4a412d9c1 | |||
8148bbf95e | |||
2119054a95 | |||
ac810dbf9d | |||
8e51f318b3 | |||
93a2c40ebc | |||
ff0973fa4f | |||
1f85f001f9 | |||
279b85fc45 | |||
24578ca968 | |||
d0fad4b004 | |||
4bb9652c0f | |||
b6c12010b1 | |||
f5c8f881d7 | |||
0004c5e637 | |||
1cc8300ba9 | |||
fd5721faa8 | |||
09d910efcb | |||
acb0cecb36 | |||
c2307b8816 | |||
73113f3443 | |||
4d9b595a69 | |||
908d8e5f90 | |||
a0d7644a86 | |||
2392842948 | |||
3740efb393 | |||
835ca02be5 | |||
99d0442cc9 | |||
b24049950e | |||
86dab909ed | |||
ffcb3d6356 | |||
c7b9e734ff | |||
450543f782 | |||
b7a1426b42 | |||
408ee69fb8 | |||
35de5241f4 | |||
be4dd6479d | |||
7066a6a0dd | |||
6194f9ffea | |||
47c7b0b187 | |||
0a3bf5b220 | |||
14ee61ab92 | |||
f7f178ce03 | |||
547a7b3304 | |||
8d1eef025d | |||
84de5f0f40 | |||
cbea61e8dd | |||
2885ae6018 | |||
cf781ee218 | |||
252dffce78 | |||
83c2a88c91 | |||
e7def5d4e6 | |||
ec68283812 | |||
bc4d0c1344 | |||
e2033025b0 | |||
da9789e3ce | |||
26866e4c21 | |||
0cf4fd4c18 | |||
2ddbf68e31 | |||
0c5f6dabc0 | |||
fdae2832bb | |||
6843ddb814 | |||
166b1c623a | |||
e8cafeb3e7 | |||
8a7af21e3a | |||
407b32e04c | |||
f3f8b22698 | |||
585b2bc22e | |||
0914e595c7 | |||
7361eb5e05 | |||
44ac020f28 | |||
e15fde1624 | |||
15ef8b0995 | |||
d8dd9332ed | |||
c4fb5bd385 | |||
f09ae11e89 | |||
8b4a92ef2d | |||
f92d49feff | |||
64fa8e6be5 | |||
0aebf864d1 | |||
016fa0da40 | |||
7786f7f8b1 | |||
6919d43d02 | |||
01ad09036b | |||
638add603f | |||
750f9575af | |||
40e2b945e3 | |||
03b51e8c8f | |||
a4d056e493 | |||
23a37e5e79 | |||
300b14078f | |||
eae3740d85 | |||
3669ca0a83 | |||
46c6154444 | |||
2824562dc9 | |||
852b337916 | |||
dd34dffa45 | |||
aaa6c260cd | |||
81259e9fcc | |||
4bd1094619 | |||
8bc8dd64c5 | |||
ab4485f824 | |||
fa1b4d0d44 | |||
055157d084 | |||
fe3c5a7090 | |||
d0070f2b1a | |||
c570f9f494 | |||
f8c8047a52 | |||
f49faadc19 | |||
fe7a982343 | |||
87468eb6fc | |||
4a7a51a46e | |||
9c15ebccab | |||
525f467057 | |||
820a97e397 | |||
3f2e35e827 | |||
ccb4b925ed | |||
21c874ab52 | |||
8a8712e4a3 | |||
9eb9502209 | |||
a192f9fc78 | |||
794a436d86 | |||
41837e6193 | |||
86e0e4b2bf | |||
2a6050e552 | |||
e604d8d7f3 | |||
5a2aab855f | |||
f86ac2fdff | |||
df35360372 | |||
3e912f7b85 | |||
ea7b04a712 | |||
edb02e9d33 | |||
3b526a7276 | |||
03c00a831d | |||
60520b8032 | |||
a9137e8c21 | |||
75ea7e3160 | |||
047ecea3a2 | |||
5518c277f3 | |||
4468015cbe | |||
0755a8fa05 | |||
5d8b2442ce | |||
6157982787 | |||
07dcae7258 | |||
d546a5a1fa | |||
3689bdad75 | |||
4ce47528e1 | |||
2edfb55c29 | |||
d1e715ebac | |||
c654c9fd11 | |||
2c0f716a13 | |||
64bf6c1b89 | |||
047bfb9ad1 | |||
cab01b6694 | |||
554d15fadb | |||
a9ac480dcd | |||
1237bc3a4b | |||
854415fd33 | |||
99cfe73bbf | |||
697b39d40d | |||
2b7ca68805 | |||
bd24c15db4 | |||
69614dc20d | |||
75dfcdb1e7 | |||
c332081e81 | |||
608e51f16d | |||
b0fb180e4d | |||
2ebd6b3839 | |||
5a06de184c | |||
957f94534b | |||
4ec4672f01 | |||
954d64afdc | |||
ef0eb4d435 | |||
11a7b88434 | |||
9ec33f34f1 | |||
2c2edfad04 | |||
22dd46dcc6 | |||
20f938e44a | |||
fd34872de8 | |||
31edc5a9ff | |||
19bdcb26f6 | |||
5b7db48372 | |||
128f0adb24 | |||
6fb072e5ff | |||
8007c142de | |||
e707ba3cf1 | |||
6680a51988 | |||
3bf3249d71 | |||
e71b71c1a9 | |||
a90338d40d | |||
929559fe85 | |||
c41762d211 | |||
f06d4b8547 | |||
dcce6e9795 | |||
d57cb0a110 | |||
ba8cbbcdbd | |||
56cc4191ca | |||
6532978a58 | |||
349a63ed14 | |||
7f44a49d99 | |||
5047540db2 | |||
9dfaab7f20 | |||
8fe62ea7f6 | |||
c4969665e7 | |||
9670c27161 | |||
c32957f942 | |||
c95cd8414b | |||
cc2573acdf | |||
44dc611088 | |||
49a8ddc822 | |||
11c04e984d | |||
ef1f66a64e | |||
a1aee9a68f | |||
5dbc738dbd | |||
5b5aa493b5 | |||
6967232619 | |||
263b6f2fdf | |||
0ca4520cc2 | |||
ea3fcdd077 | |||
820e48badc | |||
c39b9b29de | |||
a8ad9bfc9d | |||
d4c24a30e9 | |||
c8845e8d44 | |||
5175897cdc | |||
c521cb06bf | |||
3180bdfe6c | |||
c993e14084 | |||
955f3cf310 | |||
814c17631d | |||
ca7f6bb97a |
27
.gitignore
vendored
Executable file → Normal file
@ -1,22 +1,9 @@
|
||||
## Files related to minetest development cycle
|
||||
/*.patch
|
||||
# GNU Patch reject file
|
||||
*.rej
|
||||
|
||||
## Editors and Development environments
|
||||
## Generic ignorable patterns and files
|
||||
*~
|
||||
*.swp
|
||||
*.bak*
|
||||
*.orig
|
||||
# Vim
|
||||
.*.swp
|
||||
*bak*
|
||||
tags
|
||||
*.vim
|
||||
# Kate
|
||||
.*.kate-swp
|
||||
.swp.*
|
||||
# Eclipse (LDT)
|
||||
.project
|
||||
.settings/
|
||||
.buildpath
|
||||
.metadata
|
||||
# Idea IDE
|
||||
.idea/*
|
||||
|
||||
## Files related to minetest development cycle
|
||||
*.patch
|
||||
|
0
README.txt
Executable file → Normal file
2
game.conf
Executable file → Normal file
@ -1 +1 @@
|
||||
name = MinetestForFun Game
|
||||
name = Minetest Game
|
||||
|
73
game_api.txt
Executable file → Normal file
@ -12,28 +12,22 @@ Please note:
|
||||
|
||||
* [XYZ] refers to a section the Minetest API
|
||||
* [#ABC] refers to a section in this document
|
||||
* [pos] refers to a position table `{x = -5, y = 0, z = 200}`
|
||||
|
||||
Bucket API
|
||||
----------
|
||||
|
||||
The bucket API allows registering new types of buckets for non-default liquids.
|
||||
|
||||
|
||||
bucket.register_liquid(
|
||||
"default:lava_source", -- name of the source node
|
||||
"default:lava_flowing", -- name of the flowing node
|
||||
"bucket:bucket_lava", -- name of the new bucket item (or nil if liquid is not takeable)
|
||||
"bucket_lava.png", -- texture of the new bucket item (ignored if itemname == nil)
|
||||
"Lava Bucket", -- text description of the bucket item
|
||||
{lava_bucket = 1}, -- groups of the bucket item, OPTIONAL
|
||||
false -- force-renew, OPTIONAL. Force the liquid source to renew if it has
|
||||
-- a source neighbour, even if defined as 'liquid_renewable = false'.
|
||||
-- Needed to avoid creating holes in sloping rivers.
|
||||
{lava_bucket = 1} -- groups of the bucket item, OPTIONAL
|
||||
)
|
||||
|
||||
The filled bucket item is returned to the player that uses an empty bucket pointing to the given liquid source.
|
||||
When punching with an empty bucket pointing to an entity or a non-liquid node, the on_punch of the entity or node will be triggered.
|
||||
|
||||
Beds API
|
||||
--------
|
||||
|
||||
@ -67,11 +61,6 @@ Beds API
|
||||
}
|
||||
}
|
||||
|
||||
Creative API
|
||||
------------
|
||||
|
||||
A global string called `creative.formspec_add` was added which allows mods to add additional formspec elements onto the default creative inventory formspec to be drawn after each update.
|
||||
|
||||
Doors API
|
||||
---------
|
||||
|
||||
@ -188,9 +177,6 @@ The farming API allows you to easily register plants and hoes.
|
||||
`farming.register_plant(name, Plant definition)`
|
||||
* Register a new growing plant, see [#Plant definition]
|
||||
|
||||
`farming.registered_plants[name] = definition`
|
||||
* Table of registered plants, indexed by plant name
|
||||
|
||||
### Hoe Definition
|
||||
|
||||
|
||||
@ -227,14 +213,6 @@ New node def property:
|
||||
* Called when fire attempts to remove a burning node.
|
||||
* `pos` Position of the burning node.
|
||||
|
||||
`on_ignite(pos, igniter)`
|
||||
|
||||
* Called when Flint and steel (or a mod defined ignitor) is used on a node.
|
||||
Defining it may prevent the default action (spawning flames) from triggering.
|
||||
* `pos` Position of the ignited node.
|
||||
* `igniter` Player that used the tool, when available.
|
||||
|
||||
|
||||
Give Initial Stuff API
|
||||
----------------------
|
||||
|
||||
@ -266,18 +244,6 @@ Give Initial Stuff API
|
||||
^ str is a comma separated list of initial stuff
|
||||
^ Adds items to the list of items to be given
|
||||
|
||||
Nyancat API
|
||||
-----------
|
||||
|
||||
`nyancat.place(pos, facedir, length)`
|
||||
|
||||
^ Place a cat at `pos` facing `facedir` with tail length `length`
|
||||
Only accepts facedir 0-3, if facedir > 3 then it will be interpreted as facedir = 0
|
||||
|
||||
`nyancat.generate(minp, maxp, seed)`
|
||||
|
||||
^ Called by `minetest.register_on_generated`. To disable nyancat generation,
|
||||
you can redefine nyancat.generate() to be an empty function
|
||||
|
||||
TNT API
|
||||
----------
|
||||
@ -306,9 +272,9 @@ TNT API
|
||||
* `position` The center of explosion.
|
||||
* `definition` The TNT definion as passed to `tnt.register`
|
||||
|
||||
`tnt.burn(position, [nodename])`
|
||||
`tnt.burn(position)`
|
||||
|
||||
^ Ignite TNT at position, nodename isn't required unless already known.
|
||||
^ Ignite TNT at position
|
||||
|
||||
|
||||
To make dropping items from node inventories easier, you can use the
|
||||
@ -364,33 +330,9 @@ To use it, add the `on_screwdriver` function to the node definition.
|
||||
* `new_param2` the new value of param2 that would have been set if on_rotate wasn't there
|
||||
* return value: false to disallow rotation, nil to keep default behaviour, true to allow
|
||||
it but to indicate that changed have already been made (so the screwdriver will wear out)
|
||||
* use `on_rotate = false` to always disallow rotation
|
||||
* use `on_rotate = screwdriver.disallow` to always disallow rotation
|
||||
* use `on_rotate = screwdriver.rotate_simple` to allow only face rotation
|
||||
|
||||
|
||||
Sethome API
|
||||
-----------
|
||||
|
||||
The sethome API adds three global functions to allow mods to read a players home position,
|
||||
set a players home position and teleport a player to home position.
|
||||
|
||||
`sethome.get(name)`
|
||||
|
||||
* `name` Player who's home position you wish to get
|
||||
* return value: false if no player home coords exist, position table if true
|
||||
|
||||
`sethome.set(name, pos)`
|
||||
|
||||
* `name` Player who's home position you wish to set
|
||||
* `pos` Position table containing coords of home position
|
||||
* return value: false if unable to set and save new home position, otherwise true
|
||||
|
||||
`sethome.go(name)`
|
||||
|
||||
* `name` Player you wish to teleport to their home position
|
||||
* return value: false if player cannot be sent home, otherwise true
|
||||
|
||||
|
||||
Stairs API
|
||||
----------
|
||||
|
||||
@ -401,7 +343,7 @@ delivered with Minetest Game, to keep them compatible with other mods.
|
||||
|
||||
* Registers a stair.
|
||||
* `subname`: Basically the material name (e.g. cobble) used for the stair name. Nodename pattern: "stairs:stair_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"
|
||||
* `groups`: see [Known damage and digging time defining groups]
|
||||
* `images`: see [Tile definition]
|
||||
* `description`: used for the description field in the stair's definition
|
||||
@ -437,7 +379,7 @@ Creates panes that automatically connect to each other
|
||||
### Pane definition
|
||||
|
||||
{
|
||||
textures = {"texture for sides", (unused), "texture for top and bottom"}, -- More tiles aren't supported
|
||||
textures = {"texture_Bottom_top", "texture_left_right", "texture_front_back"}, -- More tiles aren't supported
|
||||
groups = {group = rating}, -- Uses the known node groups, see [Known damage and digging time defining groups]
|
||||
sounds = SoundSpec, -- See [#Default sounds]
|
||||
recipe = {{"","","","","","","","",""}}, -- Recipe field only
|
||||
@ -474,7 +416,6 @@ Sounds inside the default table can be used within the sounds field of node defi
|
||||
* `default.node_sound_wood_defaults()`
|
||||
* `default.node_sound_leaves_defaults()`
|
||||
* `default.node_sound_glass_defaults()`
|
||||
* `default.node_sound_metal_defaults()`
|
||||
|
||||
Default constants
|
||||
-----------------
|
||||
|
BIN
menu/header.png
Before Width: | Height: | Size: 904 B After Width: | Height: | Size: 1.9 KiB |
0
menu/icon.png
Executable file → Normal file
Before Width: | Height: | Size: 2.9 KiB After Width: | Height: | Size: 2.9 KiB |
3
minetest.conf
Executable file → Normal file
@ -1,3 +0,0 @@
|
||||
# Enable jungles on new worlds, disable biome blend and mud flow (faster, looks better).
|
||||
mgv6_spflags = jungles, nobiomeblend, nomudflow
|
||||
disable_fire = true
|
||||
|
12
minetest.conf.example
Executable file → Normal file
@ -5,12 +5,6 @@
|
||||
# Whether creative mode (fast digging of all blocks, unlimited resources) should be enabled
|
||||
#creative_mode = false
|
||||
|
||||
# Sets the behaviour of the inventory items when a player dies.
|
||||
# "bones": Store all items inside a bone node but drop items if inside protected area
|
||||
# "drop": Drop all items on the ground
|
||||
# "keep": Player keeps all items
|
||||
#bones_mode = "bones"
|
||||
|
||||
# The time in seconds after which the bones of a dead player can be looted by everyone
|
||||
# 0 to disable
|
||||
#share_bones_time = 1200
|
||||
@ -20,9 +14,9 @@
|
||||
# 0 to disable. By default it is "share_bones_time" divide by four.
|
||||
#share_bones_time_early = 300
|
||||
|
||||
# Whether fire should be enabled. If disabled, 'basic flame' nodes will disappear.
|
||||
# 'permanent flame' nodes will remain with either setting.
|
||||
#enable_fire = true
|
||||
# Whether standard fire should be disabled ('basic flame' nodes will disappear)
|
||||
# 'permanent flame' nodes will remain with either setting
|
||||
#disable_fire = false
|
||||
|
||||
# Whether the stuff in initial_stuff should be given to new players
|
||||
#give_initial_stuff = false
|
||||
|
@ -1,9 +0,0 @@
|
||||
----------------------------------------
|
||||
-- Server Misc Mod - pre-default init --
|
||||
----------------------------------------
|
||||
|
||||
local cwd = minetest.get_modpath(minetest.get_current_modname())
|
||||
|
||||
-- Inventory refill function override
|
||||
-- see https://github.com/MinetestForFun/server-minetestforfun/issues/462
|
||||
dofile(cwd.."/inventory_rotate_node.lua")
|
@ -1,22 +0,0 @@
|
||||
--rewrite function minetest.rotate_node(itemstack, placer, pointed_thing) to refill inventory
|
||||
local old_rotate_node = minetest.rotate_node
|
||||
function minetest.rotate_node(itemstack, placer, pointed_thing)
|
||||
local stack_name = itemstack:get_name()
|
||||
local ret = old_rotate_node(itemstack, placer, pointed_thing)
|
||||
if ret:get_count() == 0 and not minetest.setting_getbool("creative_mode") then
|
||||
local index = placer:get_wield_index()
|
||||
local inv = placer:get_inventory()
|
||||
if inv:get_list("main") then
|
||||
for i, stack in ipairs(inv:get_list("main")) do
|
||||
if i ~= index and stack:get_name() == stack_name then
|
||||
ret:add_item(stack)
|
||||
stack:clear()
|
||||
inv:set_stack("main", i, stack)
|
||||
minetest.log("action", "Inventory Tweaks: refilled stack("..stack_name..") of " .. placer:get_player_name())
|
||||
break
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
return ret
|
||||
end
|
0
mods/beds/README.txt
Executable file → Normal file
106
mods/beds/api.lua
Executable file → Normal file
@ -1,3 +1,27 @@
|
||||
|
||||
local reverse = true
|
||||
|
||||
local function destruct_bed(pos, n)
|
||||
local node = minetest.get_node(pos)
|
||||
local other
|
||||
|
||||
if n == 2 then
|
||||
local dir = minetest.facedir_to_dir(node.param2)
|
||||
other = vector.subtract(pos, dir)
|
||||
elseif n == 1 then
|
||||
local dir = minetest.facedir_to_dir(node.param2)
|
||||
other = vector.add(pos, dir)
|
||||
end
|
||||
|
||||
if reverse then
|
||||
reverse = not reverse
|
||||
minetest.remove_node(other)
|
||||
nodeupdate(other)
|
||||
else
|
||||
reverse = not reverse
|
||||
end
|
||||
end
|
||||
|
||||
function beds.register_bed(name, def)
|
||||
minetest.register_node(name .. "_bottom", {
|
||||
description = def.description,
|
||||
@ -19,42 +43,58 @@ function beds.register_bed(name, def)
|
||||
type = "fixed",
|
||||
fixed = def.selectionbox,
|
||||
},
|
||||
after_place_node = function(pos, placer, itemstack)
|
||||
local n = minetest.get_node_or_nil(pos)
|
||||
if not n or not n.param2 then
|
||||
minetest.remove_node(pos)
|
||||
return true
|
||||
|
||||
on_place = function(itemstack, placer, pointed_thing)
|
||||
local under = pointed_thing.under
|
||||
local pos
|
||||
if minetest.registered_items[minetest.get_node(under).name].buildable_to then
|
||||
pos = under
|
||||
else
|
||||
pos = pointed_thing.above
|
||||
end
|
||||
local dir = minetest.facedir_to_dir(n.param2)
|
||||
local p = vector.add(pos, dir)
|
||||
local n2 = minetest.get_node_or_nil(p)
|
||||
local def = n2 and minetest.registered_items[n2.name]
|
||||
|
||||
if minetest.is_protected(pos, placer:get_player_name()) and
|
||||
not minetest.check_player_privs(placer, "protection_bypass") then
|
||||
minetest.record_protection_violation(pos, placer:get_player_name())
|
||||
return itemstack
|
||||
end
|
||||
|
||||
local def = minetest.registered_nodes[minetest.get_node(pos).name]
|
||||
if not def or not def.buildable_to then
|
||||
minetest.remove_node(pos)
|
||||
return true
|
||||
return itemstack
|
||||
end
|
||||
minetest.set_node(p, {name = n.name:gsub("%_bottom", "_top"), param2 = n.param2})
|
||||
return false
|
||||
|
||||
local dir = minetest.dir_to_facedir(placer:get_look_dir())
|
||||
local botpos = vector.add(pos, minetest.facedir_to_dir(dir))
|
||||
|
||||
if minetest.is_protected(botpos, placer:get_player_name()) and
|
||||
not minetest.check_player_privs(placer, "protection_bypass") then
|
||||
minetest.record_protection_violation(botpos, placer:get_player_name())
|
||||
return itemstack
|
||||
end
|
||||
|
||||
local botdef = minetest.registered_nodes[minetest.get_node(botpos).name]
|
||||
if not botdef or not botdef.buildable_to then
|
||||
return itemstack
|
||||
end
|
||||
|
||||
minetest.set_node(pos, {name = name .. "_bottom", param2 = dir})
|
||||
minetest.set_node(botpos, {name = name .. "_top", param2 = dir})
|
||||
|
||||
if not minetest.setting_getbool("creative_mode") then
|
||||
itemstack:take_item()
|
||||
end
|
||||
return itemstack
|
||||
end,
|
||||
|
||||
on_destruct = function(pos)
|
||||
local n = minetest.get_node_or_nil(pos)
|
||||
if not n then return end
|
||||
local dir = minetest.facedir_to_dir(n.param2)
|
||||
local p = vector.add(pos, dir)
|
||||
local n2 = minetest.get_node(p)
|
||||
if minetest.get_item_group(n2.name, "bed") == 2 and n.param2 == n2.param2 then
|
||||
minetest.remove_node(p)
|
||||
end
|
||||
end,
|
||||
after_dig_node = function(pos, oldnode, oldmetadata, digger)
|
||||
local name = digger:get_player_name()
|
||||
if not name or name == "" then return end
|
||||
beds.spawn[name] = nil
|
||||
beds.save_spawns()
|
||||
destruct_bed(pos, 1)
|
||||
end,
|
||||
|
||||
on_rightclick = function(pos, node, clicker)
|
||||
beds.on_rightclick(pos, clicker)
|
||||
end,
|
||||
|
||||
on_rotate = function(pos, node, user, mode, new_param2)
|
||||
local dir = minetest.facedir_to_dir(node.param2)
|
||||
local p = vector.add(pos, dir)
|
||||
@ -81,9 +121,10 @@ function beds.register_bed(name, def)
|
||||
return false
|
||||
end
|
||||
node.param2 = new_param2
|
||||
minetest.swap_node(pos, node)
|
||||
minetest.remove_node(p)
|
||||
minetest.set_node(newp, {name = node.name:gsub("%_bottom", "_top"), param2 = new_param2})
|
||||
-- do not remove_node here - it will trigger destroy_bed()
|
||||
minetest.set_node(p, {name = "air"})
|
||||
minetest.set_node(pos, node)
|
||||
minetest.set_node(newp, {name = name .. "_top", param2 = new_param2})
|
||||
return true
|
||||
end,
|
||||
})
|
||||
@ -97,15 +138,18 @@ function beds.register_bed(name, def)
|
||||
pointable = false,
|
||||
groups = {snappy = 1, choppy = 2, oddly_breakable_by_hand = 2, flammable = 3, bed = 2},
|
||||
sounds = default.node_sound_wood_defaults(),
|
||||
drop = name .. "_bottom",
|
||||
node_box = {
|
||||
type = "fixed",
|
||||
fixed = def.nodebox.top,
|
||||
},
|
||||
on_destruct = function(pos)
|
||||
destruct_bed(pos, 2)
|
||||
end,
|
||||
})
|
||||
|
||||
minetest.register_alias(name, name .. "_bottom")
|
||||
|
||||
-- register recipe
|
||||
minetest.register_craft({
|
||||
output = name,
|
||||
recipe = def.recipe
|
||||
|
134
mods/beds/beds.lua
Executable file → Normal file
@ -1,36 +1,37 @@
|
||||
for _, colour in pairs({"red", "white", "black", "blue", "green"}) do-- fancy shaped bed
|
||||
beds.register_bed("beds:fancy_bed_" .. colour, {
|
||||
description = "Fancy Bed (" .. colour .. ")",
|
||||
inventory_image = "beds_bed_fancy_" .. colour .. ".png",
|
||||
wield_image = "beds_bed_fancy_" .. colour .. ".png",
|
||||
tiles = {
|
||||
bottom = {
|
||||
"beds_bed_top1_" .. colour .. ".png",
|
||||
-- Fancy shaped bed
|
||||
|
||||
beds.register_bed("beds:fancy_bed", {
|
||||
description = "Fancy Bed",
|
||||
inventory_image = "beds_bed_fancy.png",
|
||||
wield_image = "beds_bed_fancy.png",
|
||||
tiles = {
|
||||
bottom = {
|
||||
"beds_bed_top1.png",
|
||||
"default_wood.png",
|
||||
"beds_bed_side1_" .. colour .. ".png",
|
||||
"beds_bed_side1_" .. colour .. ".png^[transformFX",
|
||||
"beds_bed_side1.png",
|
||||
"beds_bed_side1.png^[transformFX",
|
||||
"default_wood.png",
|
||||
"beds_bed_foot_" .. colour .. ".png",
|
||||
},
|
||||
top = {
|
||||
"beds_bed_top2_" .. colour .. ".png",
|
||||
"beds_bed_foot.png",
|
||||
},
|
||||
top = {
|
||||
"beds_bed_top2.png",
|
||||
"default_wood.png",
|
||||
"beds_bed_side2_" .. colour .. ".png",
|
||||
"beds_bed_side2_" .. colour .. ".png^[transformFX",
|
||||
"beds_bed_side2.png",
|
||||
"beds_bed_side2.png^[transformFX",
|
||||
"beds_bed_head.png",
|
||||
"default_wood.png",
|
||||
}
|
||||
},
|
||||
nodebox = {
|
||||
bottom = {
|
||||
}
|
||||
},
|
||||
nodebox = {
|
||||
bottom = {
|
||||
{-0.5, -0.5, -0.5, -0.375, -0.065, -0.4375},
|
||||
{0.375, -0.5, -0.5, 0.5, -0.065, -0.4375},
|
||||
{-0.5, -0.375, -0.5, 0.5, -0.125, -0.4375},
|
||||
{-0.5, -0.375, -0.5, -0.4375, -0.125, 0.5},
|
||||
{0.4375, -0.375, -0.5, 0.5, -0.125, 0.5},
|
||||
{-0.4375, -0.3125, -0.4375, 0.4375, -0.0625, 0.5},
|
||||
},
|
||||
top = {
|
||||
},
|
||||
top = {
|
||||
{-0.5, -0.5, 0.4375, -0.375, 0.1875, 0.5},
|
||||
{0.375, -0.5, 0.4375, 0.5, 0.1875, 0.5},
|
||||
{-0.5, 0, 0.4375, 0.5, 0.125, 0.5},
|
||||
@ -38,55 +39,52 @@ for _, colour in pairs({"red", "white", "black", "blue", "green"}) do-- fancy sh
|
||||
{-0.5, -0.375, -0.5, -0.4375, -0.125, 0.5},
|
||||
{0.4375, -0.375, -0.5, 0.5, -0.125, 0.5},
|
||||
{-0.4375, -0.3125, -0.5, 0.4375, -0.0625, 0.4375},
|
||||
}
|
||||
},
|
||||
selectionbox = {-0.5, -0.5, -0.5, 0.5, 0.06, 1.5},
|
||||
recipe = {
|
||||
{"", "", "group:stick"},
|
||||
{"wool:" .. colour, "wool:" .. colour, "wool:white"},
|
||||
{"group:wood", "group:wood", "group:wood"},
|
||||
},
|
||||
})
|
||||
}
|
||||
},
|
||||
selectionbox = {-0.5, -0.5, -0.5, 0.5, 0.06, 1.5},
|
||||
recipe = {
|
||||
{"", "", "group:stick"},
|
||||
{"wool:red", "wool:red", "wool:white"},
|
||||
{"group:wood", "group:wood", "group:wood"},
|
||||
},
|
||||
})
|
||||
|
||||
-- simple shaped bed
|
||||
beds.register_bed("beds:bed_" .. colour, {
|
||||
description = "Simple Bed (" .. colour .. ")",
|
||||
inventory_image = "beds_bed_" .. colour .. ".png",
|
||||
wield_image = "beds_bed_" .. colour .. ".png",
|
||||
tiles = {
|
||||
bottom = {
|
||||
"beds_bed_top_bottom_" .. colour .. ".png^[transformR90",
|
||||
-- Simple shaped bed
|
||||
|
||||
beds.register_bed("beds:bed", {
|
||||
description = "Simple Bed",
|
||||
inventory_image = "beds_bed.png",
|
||||
wield_image = "beds_bed.png",
|
||||
tiles = {
|
||||
bottom = {
|
||||
"beds_bed_top_bottom.png^[transformR90",
|
||||
"default_wood.png",
|
||||
"beds_bed_side_bottom_r_" .. colour .. ".png",
|
||||
"beds_bed_side_bottom_r_" .. colour .. ".png^[transformfx",
|
||||
"beds_bed_side_bottom_r.png",
|
||||
"beds_bed_side_bottom_r.png^[transformfx",
|
||||
"beds_transparent.png",
|
||||
"beds_bed_side_bottom_" .. colour .. ".png"
|
||||
},
|
||||
top = {
|
||||
"beds_bed_top_top_" .. colour .. ".png^[transformR90",
|
||||
"default_wood.png",
|
||||
"beds_bed_side_top_r_" .. colour .. ".png",
|
||||
"beds_bed_side_top_r_" .. colour .. ".png^[transformfx",
|
||||
"beds_bed_side_bottom.png"
|
||||
},
|
||||
top = {
|
||||
"beds_bed_top_top.png^[transformR90",
|
||||
"default_wood.png",
|
||||
"beds_bed_side_top_r.png",
|
||||
"beds_bed_side_top_r.png^[transformfx",
|
||||
"beds_bed_side_top.png",
|
||||
"beds_transparent.png",
|
||||
}
|
||||
},
|
||||
nodebox = {
|
||||
bottom = {-0.5, -0.5, -0.5, 0.5, 0.06, 0.5},
|
||||
top = {-0.5, -0.5, -0.5, 0.5, 0.06, 0.5},
|
||||
},
|
||||
selectionbox = {-0.5, -0.5, -0.5, 0.5, 0.06, 1.5},
|
||||
recipe = {
|
||||
{"wool:" .. colour, "wool:" .. colour, "wool:white"},
|
||||
{"group:wood", "group:wood", "group:wood"}
|
||||
},
|
||||
|
||||
})
|
||||
end
|
||||
}
|
||||
},
|
||||
nodebox = {
|
||||
bottom = {-0.5, -0.5, -0.5, 0.5, 0.06, 0.5},
|
||||
top = {-0.5, -0.5, -0.5, 0.5, 0.06, 0.5},
|
||||
},
|
||||
selectionbox = {-0.5, -0.5, -0.5, 0.5, 0.06, 1.5},
|
||||
recipe = {
|
||||
{"wool:red", "wool:red", "wool:white"},
|
||||
{"group:wood", "group:wood", "group:wood"}
|
||||
},
|
||||
})
|
||||
|
||||
minetest.register_alias("beds:bed", "beds:bed_red")
|
||||
minetest.register_alias("beds:fancy_bed", "beds:fancy_bed_red")
|
||||
minetest.register_alias("beds:bed_bottom", "beds:bed_red_bottom")
|
||||
minetest.register_alias("beds:bed_top", "beds:bed_red_top")
|
||||
minetest.register_alias("beds:fancy_bed_top", "beds:fancy_bed_red_top")
|
||||
minetest.register_alias("beds:fancy_bed_bottom", "beds:fancy_bed_red_bottom")
|
||||
-- Aliases for PilzAdam's beds mod
|
||||
|
||||
minetest.register_alias("beds:bed_bottom_red", "beds:bed_bottom")
|
||||
minetest.register_alias("beds:bed_top_red", "beds:bed_top")
|
||||
|
1
mods/beds/depends.txt
Executable file → Normal file
@ -1,3 +1,2 @@
|
||||
default
|
||||
wool
|
||||
areas
|
||||
|
82
mods/beds/functions.lua
Executable file → Normal file
@ -6,15 +6,14 @@ if enable_respawn == nil then
|
||||
enable_respawn = true
|
||||
end
|
||||
|
||||
|
||||
-- helper functions
|
||||
-- Helper functions
|
||||
|
||||
local function get_look_yaw(pos)
|
||||
local n = minetest.get_node(pos)
|
||||
if n.param2 == 1 then
|
||||
return pi/2, n.param2
|
||||
return pi / 2, n.param2
|
||||
elseif n.param2 == 3 then
|
||||
return -pi/2, n.param2
|
||||
return -pi / 2, n.param2
|
||||
elseif n.param2 == 0 then
|
||||
return pi, n.param2
|
||||
else
|
||||
@ -70,8 +69,8 @@ local function lay_down(player, pos, bed_pos, state, skip)
|
||||
end
|
||||
|
||||
-- physics, eye_offset, etc
|
||||
player:set_eye_offset({x=0,y=0,z=0}, {x=0,y=0,z=0})
|
||||
player:set_look_yaw(math.random(1, 180)/100)
|
||||
player:set_eye_offset({x = 0, y = 0, z = 0}, {x = 0, y = 0, z = 0})
|
||||
player:set_look_yaw(math.random(1, 180) / 100)
|
||||
default.player_attached[name] = false
|
||||
player:set_physics_override(1, 1, 1)
|
||||
hud_flags.wielditem = true
|
||||
@ -84,11 +83,11 @@ local function lay_down(player, pos, bed_pos, state, skip)
|
||||
player_in_bed = player_in_bed + 1
|
||||
|
||||
-- physics, eye_offset, etc
|
||||
player:set_eye_offset({x=0,y=-13,z=0}, {x=0,y=0,z=0})
|
||||
player:set_eye_offset({x = 0, y = -13, z = 0}, {x = 0, y = 0, z = 0})
|
||||
local yaw, param2 = get_look_yaw(bed_pos)
|
||||
player:set_look_yaw(yaw)
|
||||
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}
|
||||
local p = {x = bed_pos.x + dir.x / 2, y = bed_pos.y, z = bed_pos.z + dir.z / 2}
|
||||
player:set_physics_override(0, 0, 0)
|
||||
player:setpos(p)
|
||||
default.player_attached[name] = true
|
||||
@ -102,17 +101,15 @@ end
|
||||
local function update_formspecs(finished)
|
||||
local ges = #minetest.get_connected_players()
|
||||
local form_n = ""
|
||||
local is_majority = (ges/2) < player_in_bed
|
||||
local is_majority = (ges / 2) < player_in_bed
|
||||
|
||||
if finished then
|
||||
form_n = beds.formspec ..
|
||||
"label[2.7,11; Good morning.]"
|
||||
form_n = beds.formspec .. "label[2.7,11; Good morning.]"
|
||||
else
|
||||
form_n = beds.formspec ..
|
||||
"label[2.2,11;"..tostring(player_in_bed).." of "..tostring(ges).." players are in bed]"
|
||||
form_n = beds.formspec .. "label[2.2,11;" .. tostring(player_in_bed) ..
|
||||
" of " .. tostring(ges) .. " players are in bed]"
|
||||
if is_majority and is_night_skip_enabled() then
|
||||
form_n = form_n ..
|
||||
"button_exit[2,8;4,0.75;force;Force night skip]"
|
||||
form_n = form_n .. "button_exit[2,8;4,0.75;force;Force night skip]"
|
||||
end
|
||||
end
|
||||
|
||||
@ -122,10 +119,10 @@ local function update_formspecs(finished)
|
||||
end
|
||||
|
||||
|
||||
-- public functions
|
||||
-- Public functions
|
||||
|
||||
function beds.kick_players()
|
||||
for name,_ in pairs(beds.player) do
|
||||
for name, _ in pairs(beds.player) do
|
||||
local player = minetest.get_player_by_name(name)
|
||||
lay_down(player, nil, nil, false)
|
||||
end
|
||||
@ -175,34 +172,14 @@ function beds.on_rightclick(pos, player)
|
||||
end
|
||||
|
||||
|
||||
-- callbacks
|
||||
--[[ --MFF (Crabman) It's useless to read each join player, read only once at load. function moved/called in spawn.lua
|
||||
-- Callbacks
|
||||
|
||||
minetest.register_on_joinplayer(function(player)
|
||||
beds.read_spawns()
|
||||
end)
|
||||
--]]
|
||||
|
||||
|
||||
local dead_players = {}
|
||||
local have_areas_mod = false
|
||||
if (minetest.get_modpath("areas") ~= nil) and areas.getSpawn then
|
||||
have_areas_mod = true
|
||||
end
|
||||
|
||||
|
||||
local function teleport_player(player, clear)
|
||||
local name = player:get_player_name()
|
||||
if not name or name == "" then return false end
|
||||
if have_areas_mod and dead_players[name] ~= nil then
|
||||
local pos = areas:getSpawn(dead_players[name])
|
||||
if clear then
|
||||
dead_players[name] = nil
|
||||
end
|
||||
if pos then
|
||||
player:setpos(pos)
|
||||
return true
|
||||
end
|
||||
end
|
||||
-- respawn player at bed if enabled and valid position is found
|
||||
minetest.register_on_respawnplayer(function(player)
|
||||
if not enable_respawn then
|
||||
return false
|
||||
end
|
||||
@ -212,31 +189,8 @@ local function teleport_player(player, clear)
|
||||
player:setpos(pos)
|
||||
return true
|
||||
end
|
||||
--if not areas or bed spawnpoint, tp to the spawn
|
||||
local spawn = minetest.string_to_pos(minetest.setting_get("static_spawnpoint") or "0,0,0")
|
||||
player:setpos(spawn)
|
||||
return false
|
||||
end
|
||||
|
||||
|
||||
minetest.register_on_dieplayer(function(player)
|
||||
local name = player:get_player_name()
|
||||
if not name or name == "" then return end
|
||||
if have_areas_mod then
|
||||
local pos = player:getpos()
|
||||
if pos then
|
||||
dead_players[name] = pos
|
||||
end
|
||||
end
|
||||
minetest.after(0.20, teleport_player, player) -- tp after all others on_dieplayer callback otherwise their pos is wrong
|
||||
end)
|
||||
|
||||
-- respawn player at bed if enabled and valid position is found
|
||||
minetest.register_on_respawnplayer(function(player)
|
||||
return teleport_player(player, true)
|
||||
end)
|
||||
|
||||
|
||||
minetest.register_on_leaveplayer(function(player)
|
||||
local name = player:get_player_name()
|
||||
lay_down(player, nil, nil, false, true)
|
||||
|
17
mods/beds/init.lua
Executable file → Normal file
@ -3,14 +3,15 @@ beds.player = {}
|
||||
beds.pos = {}
|
||||
beds.spawn = {}
|
||||
|
||||
beds.formspec = "size[8,15;true]"..
|
||||
"bgcolor[#080808BB; true]"..
|
||||
"button_exit[2,12;4,0.75;leave;Leave Bed]"
|
||||
beds.formspec = "size[8,15;true]" ..
|
||||
"bgcolor[#080808BB; true]" ..
|
||||
"button_exit[2,12;4,0.75;leave;Leave Bed]"
|
||||
|
||||
local modpath = minetest.get_modpath("beds")
|
||||
|
||||
-- load files
|
||||
dofile(modpath.."/functions.lua")
|
||||
dofile(modpath.."/api.lua")
|
||||
dofile(modpath.."/beds.lua")
|
||||
dofile(modpath.."/spawns.lua")
|
||||
-- Load files
|
||||
|
||||
dofile(modpath .. "/functions.lua")
|
||||
dofile(modpath .. "/api.lua")
|
||||
dofile(modpath .. "/beds.lua")
|
||||
dofile(modpath .. "/spawns.lua")
|
||||
|
@ -1,160 +0,0 @@
|
||||
# Blender v2.69 (sub 0) OBJ File: ''
|
||||
# www.blender.org
|
||||
mtllib fancy_bed.mtl
|
||||
o mattress_Mattress_nodebox-6_none.001_fancy_bed.png.001
|
||||
v 0.437500 -0.312500 -0.437501
|
||||
v 0.437500 -0.062500 -0.437501
|
||||
v 0.437500 -0.062500 1.437499
|
||||
v 0.437500 -0.312500 1.437499
|
||||
v -0.437500 -0.312500 -0.437501
|
||||
v -0.437500 -0.312500 1.437499
|
||||
v -0.437500 -0.062500 1.437499
|
||||
v -0.437500 -0.062500 -0.437501
|
||||
v 0.437500 -0.176793 -0.437501
|
||||
v -0.437500 -0.176793 -0.437501
|
||||
vt 0.000171 0.499972
|
||||
vt 0.000161 0.000182
|
||||
vt 0.999791 0.000253
|
||||
vt 0.999873 0.500022
|
||||
vt 0.749576 0.000208
|
||||
vt 0.749876 0.499854
|
||||
vt 0.999848 0.999750
|
||||
vt 0.000152 0.999750
|
||||
vt 0.749276 0.130648
|
||||
vt 0.000112 0.130648
|
||||
g mattress_Mattress_nodebox-6_none.001_fancy_bed.png.001_none.001_fancy_bed.png.001
|
||||
usemtl none.001_fancy_bed.png.001
|
||||
s off
|
||||
f 1/1 2/2 3/3 4/4
|
||||
f 5/2 6/3 7/4 8/1
|
||||
f 4/5 3/2 7/1 6/6
|
||||
f 1/1 4/4 6/7 5/8
|
||||
f 2/1 8/2 7/3 3/4
|
||||
f 8/2 2/5 9/9 10/10
|
||||
o wood_structure_Wood_structure_nodebox-4.001_none.002
|
||||
v 0.374999 -0.375000 1.437499
|
||||
v 0.374999 -0.125000 1.437499
|
||||
v 0.374999 -0.125000 1.499999
|
||||
v 0.374999 -0.375000 1.499999
|
||||
v -0.374999 -0.375000 1.437499
|
||||
v -0.374999 -0.375000 1.499999
|
||||
v -0.374999 -0.125000 1.499999
|
||||
v -0.374999 -0.125000 1.437499
|
||||
v -0.375000 -0.500000 1.437499
|
||||
v -0.375000 0.187500 1.437499
|
||||
v -0.375000 0.187500 1.499999
|
||||
v -0.375000 -0.500000 1.499999
|
||||
v -0.500000 -0.500000 1.437499
|
||||
v -0.500000 -0.500000 1.499999
|
||||
v -0.500000 0.187500 1.499999
|
||||
v -0.500000 0.187500 1.437499
|
||||
v -0.437500 -0.375000 -0.437501
|
||||
v -0.437500 -0.125000 -0.437501
|
||||
v -0.437500 -0.125000 1.437498
|
||||
v -0.437500 -0.375000 1.437498
|
||||
v -0.500000 -0.375000 -0.437501
|
||||
v -0.500000 -0.375000 1.437498
|
||||
v -0.500000 -0.125000 1.437498
|
||||
v -0.500000 -0.125000 -0.437501
|
||||
v 0.375001 -0.000000 1.437499
|
||||
v 0.375001 0.125000 1.437499
|
||||
v 0.375001 0.125000 1.499999
|
||||
v 0.375001 -0.000000 1.499999
|
||||
v -0.375001 -0.000000 1.437499
|
||||
v -0.375001 -0.000000 1.499999
|
||||
v -0.375001 0.125000 1.499999
|
||||
v -0.375001 0.125000 1.437499
|
||||
v 0.500000 -0.500000 1.437499
|
||||
v 0.500000 0.187500 1.437499
|
||||
v 0.500000 0.187500 1.499999
|
||||
v 0.500000 -0.500000 1.499999
|
||||
v 0.375000 -0.500000 1.437499
|
||||
v 0.375000 -0.500000 1.499999
|
||||
v 0.375000 0.187500 1.499999
|
||||
v 0.375000 0.187500 1.437499
|
||||
v 0.500000 -0.375000 -0.437501
|
||||
v 0.500000 -0.125000 -0.437501
|
||||
v 0.500000 -0.125000 1.437499
|
||||
v 0.500000 -0.375000 1.437499
|
||||
v 0.437500 -0.375000 -0.437501
|
||||
v 0.437500 -0.375000 1.437499
|
||||
v 0.437500 -0.125000 1.437499
|
||||
v 0.437500 -0.125000 -0.437501
|
||||
v -0.375000 -0.500000 -0.500000
|
||||
v -0.375000 -0.065000 -0.500000
|
||||
v -0.375000 -0.065000 -0.437500
|
||||
v -0.375000 -0.500000 -0.437500
|
||||
v -0.500000 -0.500000 -0.500000
|
||||
v -0.500000 -0.500000 -0.437500
|
||||
v -0.500000 -0.065000 -0.437500
|
||||
v -0.500000 -0.065000 -0.500000
|
||||
v 0.375006 -0.375000 -0.500000
|
||||
v 0.375006 -0.125000 -0.500000
|
||||
v 0.375006 -0.125000 -0.437500
|
||||
v 0.375006 -0.375000 -0.437500
|
||||
v -0.375006 -0.375000 -0.500000
|
||||
v -0.375006 -0.375000 -0.437500
|
||||
v -0.375006 -0.125000 -0.437500
|
||||
v -0.375006 -0.125000 -0.500000
|
||||
v 0.500000 -0.500000 -0.500000
|
||||
v 0.500000 -0.065000 -0.500000
|
||||
v 0.500000 -0.065000 -0.437500
|
||||
v 0.500000 -0.500000 -0.437500
|
||||
v 0.375000 -0.500000 -0.500000
|
||||
v 0.375000 -0.500000 -0.437500
|
||||
v 0.375000 -0.065000 -0.437500
|
||||
v 0.375000 -0.065000 -0.500000
|
||||
vt 0.377610 0.378205
|
||||
vt 0.622484 0.378175
|
||||
vt 0.622515 0.623120
|
||||
vt 0.377671 0.623151
|
||||
g wood_structure_Wood_structure_nodebox-4.001_none.002_none.002
|
||||
usemtl none.002
|
||||
s off
|
||||
f 59/11 60/12 61/13 62/14
|
||||
f 63/14 64/11 65/12 66/13
|
||||
f 59/11 63/14 66/13 60/12
|
||||
f 62/14 61/13 65/12 64/11
|
||||
f 59/11 62/14 64/13 63/12
|
||||
f 60/12 66/11 65/14 61/13
|
||||
f 67/11 71/12 74/13 68/14
|
||||
f 70/14 69/11 73/12 72/13
|
||||
f 67/11 70/12 72/13 71/14
|
||||
f 68/11 74/12 73/13 69/14
|
||||
f 75/11 76/12 77/13 78/14
|
||||
f 79/14 80/11 81/12 82/13
|
||||
f 75/14 79/11 82/12 76/13
|
||||
f 78/11 77/12 81/13 80/14
|
||||
f 75/11 78/12 80/13 79/14
|
||||
f 76/11 82/12 81/13 77/14
|
||||
g wood_structure_Wood_structure_nodebox-4.001_none.002_none.003
|
||||
usemtl none.003
|
||||
f 15/11 16/12 17/13 18/14
|
||||
f 11/13 15/14 18/11 12/12
|
||||
f 14/14 13/11 17/12 16/13
|
||||
f 11/14 14/11 16/12 15/13
|
||||
f 12/11 18/12 17/13 13/14
|
||||
f 19/11 20/12 21/13 22/14
|
||||
f 23/14 24/11 25/12 26/13
|
||||
f 19/14 23/11 26/12 20/13
|
||||
f 22/11 21/12 25/13 24/14
|
||||
f 19/11 22/12 24/13 23/14
|
||||
f 20/11 26/12 25/13 21/14
|
||||
f 27/14 28/11 29/12 30/13
|
||||
f 31/11 32/12 33/13 34/14
|
||||
f 27/11 30/12 32/13 31/14
|
||||
f 28/14 34/11 33/12 29/13
|
||||
f 35/11 39/12 42/13 36/14
|
||||
f 38/14 37/11 41/12 40/13
|
||||
f 35/14 38/11 40/12 39/13
|
||||
f 36/11 42/12 41/13 37/14
|
||||
f 43/11 44/12 45/13 46/14
|
||||
f 47/14 48/11 49/12 50/13
|
||||
f 43/14 47/11 50/12 44/13
|
||||
f 46/11 45/12 49/13 48/14
|
||||
f 43/11 46/12 48/13 47/14
|
||||
f 44/11 50/12 49/13 45/14
|
||||
f 51/14 52/11 53/12 54/13
|
||||
f 55/13 56/14 57/11 58/12
|
||||
f 51/11 54/12 56/13 55/14
|
||||
f 52/14 58/11 57/12 53/13
|
@ -1,32 +0,0 @@
|
||||
# Blender v2.69 (sub 0) OBJ File: ''
|
||||
# www.blender.org
|
||||
mtllib simple_bed.mtl
|
||||
o Simple_Bed
|
||||
v 0.500000 -0.500000 -0.500000
|
||||
v 0.500000 0.060000 -0.500000
|
||||
v 0.500000 0.060000 1.500000
|
||||
v 0.500000 -0.500000 1.500000
|
||||
v -0.500000 -0.500000 -0.500000
|
||||
v -0.500000 -0.500000 1.500000
|
||||
v -0.500000 0.060000 1.500000
|
||||
v -0.500000 0.060000 -0.500000
|
||||
vt 0.000112 0.780442
|
||||
vt 0.000110 0.999969
|
||||
vt 0.780324 0.999889
|
||||
vt 0.780377 0.780471
|
||||
vt 0.780636 0.390284
|
||||
vt 0.999906 0.780382
|
||||
vt 0.999906 0.390284
|
||||
vt 0.780636 0.000047
|
||||
vt 0.999906 0.000094
|
||||
vt 0.390235 0.780320
|
||||
vt 0.390235 0.000071
|
||||
vt 0.000142 0.000142
|
||||
usemtl none.002
|
||||
s off
|
||||
f 1/1 2/2 3/3 4/4
|
||||
f 5/1 6/4 7/3 8/2
|
||||
f 1/5 5/4 8/6 2/7
|
||||
f 4/8 3/9 7/7 6/5
|
||||
f 1/8 4/4 6/10 5/11
|
||||
f 2/11 8/12 7/1 3/10
|
17
mods/beds/spawns.lua
Executable file → Normal file
@ -18,8 +18,8 @@ function beds.read_spawns()
|
||||
repeat
|
||||
local x = input:read("*n")
|
||||
if x == nil then
|
||||
break
|
||||
end
|
||||
break
|
||||
end
|
||||
local y = input:read("*n")
|
||||
local z = input:read("*n")
|
||||
local name = input:read("*l")
|
||||
@ -41,10 +41,12 @@ function beds.save_spawns()
|
||||
if not beds.spawn then
|
||||
return
|
||||
end
|
||||
local data = {}
|
||||
local output = io.open(org_file, "w")
|
||||
for i, v in pairs(beds.spawn) do
|
||||
output:write(v.x.." "..v.y.." "..v.z.." "..i.."\n")
|
||||
for k, v in pairs(beds.spawn) do
|
||||
table.insert(data, string.format("%.1f %.1f %.1f %s\n", v.x, v.y, v.z, k))
|
||||
end
|
||||
output:write(table.concat(data))
|
||||
io.close(output)
|
||||
end
|
||||
|
||||
@ -52,9 +54,10 @@ function beds.set_spawns()
|
||||
for name,_ in pairs(beds.player) do
|
||||
local player = minetest.get_player_by_name(name)
|
||||
local p = player:getpos()
|
||||
beds.spawn[name] = p
|
||||
-- but don't change spawn location if borrowing a bed
|
||||
if not minetest.is_protected(p, name) then
|
||||
beds.spawn[name] = p
|
||||
end
|
||||
end
|
||||
beds.save_spawns()
|
||||
end
|
||||
|
||||
beds.read_spawns()
|
||||
|
0
mods/beds/textures/beds_bed_red.png → mods/beds/textures/beds_bed.png
Executable file → Normal file
Before Width: | Height: | Size: 540 B After Width: | Height: | Size: 540 B |
Before Width: | Height: | Size: 429 B |
Before Width: | Height: | Size: 545 B |
0
mods/beds/textures/beds_bed_fancy_red.png → mods/beds/textures/beds_bed_fancy.png
Executable file → Normal file
Before Width: | Height: | Size: 537 B After Width: | Height: | Size: 537 B |
Before Width: | Height: | Size: 432 B |
Before Width: | Height: | Size: 545 B |
Before Width: | Height: | Size: 521 B |
Before Width: | Height: | Size: 540 B |
0
mods/beds/textures/beds_bed_foot_red.png → mods/beds/textures/beds_bed_foot.png
Executable file → Normal file
Before Width: | Height: | Size: 390 B After Width: | Height: | Size: 390 B |
Before Width: | Height: | Size: 366 B |
Before Width: | Height: | Size: 416 B |
Before Width: | Height: | Size: 400 B |
Before Width: | Height: | Size: 408 B |
Before Width: | Height: | Size: 523 B |
BIN
mods/beds/textures/beds_bed_head.png
Executable file → Normal file
Before Width: | Height: | Size: 347 B After Width: | Height: | Size: 387 B |
BIN
mods/beds/textures/beds_bed_side1.png
Normal file
After Width: | Height: | Size: 296 B |
Before Width: | Height: | Size: 274 B |
Before Width: | Height: | Size: 308 B |
Before Width: | Height: | Size: 299 B |
Before Width: | Height: | Size: 271 B |
Before Width: | Height: | Size: 295 B |
BIN
mods/beds/textures/beds_bed_side2.png
Normal file
After Width: | Height: | Size: 316 B |
Before Width: | Height: | Size: 317 B |
Before Width: | Height: | Size: 331 B |
Before Width: | Height: | Size: 326 B |
Before Width: | Height: | Size: 283 B |
Before Width: | Height: | Size: 326 B |
BIN
mods/beds/textures/beds_bed_side_bottom.png
Normal file
After Width: | Height: | Size: 561 B |
Before Width: | Height: | Size: 358 B |
Before Width: | Height: | Size: 456 B |
Before Width: | Height: | Size: 427 B |
0
mods/beds/textures/beds_bed_side_bottom_r_red.png → mods/beds/textures/beds_bed_side_bottom_r.png
Executable file → Normal file
Before Width: | Height: | Size: 537 B After Width: | Height: | Size: 537 B |
Before Width: | Height: | Size: 343 B |
Before Width: | Height: | Size: 456 B |
Before Width: | Height: | Size: 422 B |
Before Width: | Height: | Size: 434 B |
Before Width: | Height: | Size: 523 B |
Before Width: | Height: | Size: 439 B |
BIN
mods/beds/textures/beds_bed_side_top.png
Executable file → Normal file
Before Width: | Height: | Size: 574 B After Width: | Height: | Size: 611 B |
BIN
mods/beds/textures/beds_bed_side_top_r.png
Normal file
After Width: | Height: | Size: 596 B |
Before Width: | Height: | Size: 429 B |
Before Width: | Height: | Size: 478 B |
Before Width: | Height: | Size: 463 B |
Before Width: | Height: | Size: 560 B |
Before Width: | Height: | Size: 460 B |
BIN
mods/beds/textures/beds_bed_top1.png
Normal file
After Width: | Height: | Size: 583 B |
Before Width: | Height: | Size: 241 B |
Before Width: | Height: | Size: 494 B |
Before Width: | Height: | Size: 448 B |
Before Width: | Height: | Size: 548 B |
Before Width: | Height: | Size: 478 B |
0
mods/beds/textures/beds_bed_top2_red.png → mods/beds/textures/beds_bed_top2.png
Executable file → Normal file
Before Width: | Height: | Size: 616 B After Width: | Height: | Size: 616 B |
Before Width: | Height: | Size: 465 B |
Before Width: | Height: | Size: 609 B |
Before Width: | Height: | Size: 586 B |
Before Width: | Height: | Size: 573 B |
0
mods/beds/textures/beds_bed_top_bottom_red.png → mods/beds/textures/beds_bed_top_bottom.png
Executable file → Normal file
Before Width: | Height: | Size: 495 B After Width: | Height: | Size: 495 B |
Before Width: | Height: | Size: 126 B |
Before Width: | Height: | Size: 434 B |
Before Width: | Height: | Size: 343 B |
Before Width: | Height: | Size: 339 B |
0
mods/beds/textures/beds_bed_top_top_red.png → mods/beds/textures/beds_bed_top_top.png
Executable file → Normal file
Before Width: | Height: | Size: 556 B After Width: | Height: | Size: 556 B |
Before Width: | Height: | Size: 376 B |
Before Width: | Height: | Size: 568 B |
Before Width: | Height: | Size: 525 B |
Before Width: | Height: | Size: 480 B |
Before Width: | Height: | Size: 525 B |
BIN
mods/beds/textures/beds_transparent.png
Executable file → Normal file
Before Width: | Height: | Size: 96 B After Width: | Height: | Size: 143 B |
Before Width: | Height: | Size: 705 B |
Before Width: | Height: | Size: 1.0 KiB |
Before Width: | Height: | Size: 969 B |
Before Width: | Height: | Size: 552 B |
Before Width: | Height: | Size: 1.0 KiB |
Before Width: | Height: | Size: 1.7 KiB |
Before Width: | Height: | Size: 2.3 KiB |
Before Width: | Height: | Size: 2.1 KiB |
Before Width: | Height: | Size: 1.1 KiB |
Before Width: | Height: | Size: 2.1 KiB |
0
mods/boats/README.txt
Executable file → Normal file
0
mods/boats/depends.txt
Executable file → Normal file
@ -2,14 +2,13 @@
|
||||
-- Helper functions
|
||||
--
|
||||
|
||||
boats = {}
|
||||
|
||||
function boats.is_water(pos)
|
||||
local function is_water(pos)
|
||||
local nn = minetest.get_node(pos).name
|
||||
return minetest.get_item_group(nn, "water") ~= 0
|
||||
end
|
||||
|
||||
function boats.get_sign(i)
|
||||
|
||||
local function get_sign(i)
|
||||
if i == 0 then
|
||||
return 0
|
||||
else
|
||||
@ -17,17 +16,37 @@ function boats.get_sign(i)
|
||||
end
|
||||
end
|
||||
|
||||
function boats.get_velocity(v, yaw, y)
|
||||
|
||||
local function get_velocity(v, yaw, y)
|
||||
local x = -math.sin(yaw) * v
|
||||
local z = math.cos(yaw) * v
|
||||
return {x = x, y = y, z = z}
|
||||
end
|
||||
|
||||
function boats.get_v(v)
|
||||
|
||||
local function get_v(v)
|
||||
return math.sqrt(v.x ^ 2 + v.z ^ 2)
|
||||
end
|
||||
|
||||
function boats.on_rightclick(self, clicker)
|
||||
--
|
||||
-- Boat entity
|
||||
--
|
||||
|
||||
local boat = {
|
||||
physical = true,
|
||||
collisionbox = {-0.5, -0.35, -0.5, 0.5, 0.3, 0.5},
|
||||
visual = "mesh",
|
||||
mesh = "boats_boat.obj",
|
||||
textures = {"default_wood.png"},
|
||||
|
||||
driver = nil,
|
||||
v = 0,
|
||||
last_v = 0,
|
||||
removed = false
|
||||
}
|
||||
|
||||
|
||||
function boat.on_rightclick(self, clicker)
|
||||
if not clicker or not clicker:is_player() then
|
||||
return
|
||||
end
|
||||
@ -49,20 +68,21 @@ function boats.on_rightclick(self, clicker)
|
||||
if luaentity.driver then
|
||||
luaentity.driver = nil
|
||||
end
|
||||
clicker:set_detach()
|
||||
end
|
||||
clicker:set_detach()
|
||||
self.driver = clicker
|
||||
clicker:set_attach(self.object, "",
|
||||
{x = 0, y = 11, z = -3}, {x = 0, y = 0, z = 0})
|
||||
default.player_attached[name] = true
|
||||
minetest.after(0.2, function()
|
||||
default.player_set_animation(clicker, "sit" , 30)
|
||||
end)
|
||||
self.object:setyaw(clicker:get_look_yaw() - math.pi / 2)
|
||||
end
|
||||
self.driver = clicker
|
||||
clicker:set_attach(self.object, "", {x = 0, y = 11, z = -3}, {x = 0, y = 0, z = 0})
|
||||
default.player_attached[name] = true
|
||||
minetest.after(0.2, function()
|
||||
default.player_set_animation(clicker, "sit" , 30)
|
||||
end)
|
||||
self.object:setyaw(clicker:get_look_yaw() - math.pi / 2)
|
||||
end
|
||||
|
||||
|
||||
function boats.on_activate(self, staticdata, dtime_s)
|
||||
function boat.on_activate(self, staticdata, dtime_s)
|
||||
self.object:set_armor_groups({immortal = 1})
|
||||
if staticdata then
|
||||
self.v = tonumber(staticdata)
|
||||
@ -71,12 +91,12 @@ function boats.on_activate(self, staticdata, dtime_s)
|
||||
end
|
||||
|
||||
|
||||
function boats.get_staticdata(self)
|
||||
function boat.get_staticdata(self)
|
||||
return tostring(self.v)
|
||||
end
|
||||
|
||||
|
||||
function boats.on_punch(self, puncher)
|
||||
function boat.on_punch(self, puncher)
|
||||
if not puncher or not puncher:is_player() or self.removed then
|
||||
return
|
||||
end
|
||||
@ -93,36 +113,37 @@ function boats.on_punch(self, puncher)
|
||||
end)
|
||||
if not minetest.setting_getbool("creative_mode") then
|
||||
local inv = puncher:get_inventory()
|
||||
if inv:room_for_item("main", "boats:" .. self.parameters.name) then
|
||||
inv:add_item("main", "boats:" .. self.parameters.name)
|
||||
if inv:room_for_item("main", "boats:boat") then
|
||||
inv:add_item("main", "boats:boat")
|
||||
else
|
||||
minetest.add_item(self.object:getpos(), "boats:" .. self.parameters.name)
|
||||
minetest.add_item(self.object:getpos(), "boats:boat")
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
function boats.on_step(self, dtime)
|
||||
self.v = boats.get_v(self.object:getvelocity()) * boats.get_sign(self.v)
|
||||
|
||||
function boat.on_step(self, dtime)
|
||||
self.v = get_v(self.object:getvelocity()) * get_sign(self.v)
|
||||
if self.driver then
|
||||
local ctrl = self.driver:get_player_control()
|
||||
local yaw = self.object:getyaw()
|
||||
if ctrl.up then
|
||||
self.v = self.v + self.parameters.controls.up or 0.1
|
||||
self.v = self.v + 0.1
|
||||
elseif ctrl.down then
|
||||
self.v = self.v - self.parameters.controls.down or 0.08
|
||||
self.v = self.v - 0.1
|
||||
end
|
||||
if ctrl.left then
|
||||
if self.v < 0 then
|
||||
self.object:setyaw(yaw - (1 + dtime) * (0.03 * (self.parameters.controls.rotate or 1)))
|
||||
self.object:setyaw(yaw - (1 + dtime) * 0.03)
|
||||
else
|
||||
self.object:setyaw(yaw + (1 + dtime) * (0.03 * (self.parameters.controls.rotate or 1)))
|
||||
self.object:setyaw(yaw + (1 + dtime) * 0.03)
|
||||
end
|
||||
elseif ctrl.right then
|
||||
if self.v < 0 then
|
||||
self.object:setyaw(yaw + (1 + dtime) * (0.03 * (self.parameters.controls.rotate or 1)))
|
||||
self.object:setyaw(yaw + (1 + dtime) * 0.03)
|
||||
else
|
||||
self.object:setyaw(yaw - (1 + dtime) * (0.03 * (self.parameters.controls.rotate or 1)))
|
||||
self.object:setyaw(yaw - (1 + dtime) * 0.03)
|
||||
end
|
||||
end
|
||||
end
|
||||
@ -131,44 +152,44 @@ function boats.on_step(self, dtime)
|
||||
self.object:setpos(self.object:getpos())
|
||||
return
|
||||
end
|
||||
local s = boats.get_sign(self.v)
|
||||
local s = get_sign(self.v)
|
||||
self.v = self.v - 0.02 * s
|
||||
if s ~= boats.get_sign(self.v) then
|
||||
if s ~= get_sign(self.v) then
|
||||
self.object:setvelocity({x = 0, y = 0, z = 0})
|
||||
self.v = 0
|
||||
return
|
||||
end
|
||||
if math.abs(self.v) > 4.5 then
|
||||
self.v = 4.5 * boats.get_sign(self.v)
|
||||
if math.abs(self.v) > 5 then
|
||||
self.v = 5 * get_sign(self.v)
|
||||
end
|
||||
|
||||
local p = self.object:getpos()
|
||||
p.y = p.y - 0.5
|
||||
local new_velo = {x = 0, y = 0, z = 0}
|
||||
local new_acce = {x = 0, y = 0, z = 0}
|
||||
if not boats.is_water(p) then
|
||||
if not is_water(p) then
|
||||
local nodedef = minetest.registered_nodes[minetest.get_node(p).name]
|
||||
if (not nodedef) or nodedef.walkable then
|
||||
self.v = 0
|
||||
new_acce = {x = 0, y = 1, z = 0}
|
||||
else
|
||||
new_acce = {x = 0, y = -9.8, z = 0} -- freefall in air -9.81
|
||||
new_acce = {x = 0, y = -9.8, z = 0}
|
||||
end
|
||||
new_velo = boats.get_velocity(self.v, self.object:getyaw(),
|
||||
self.object:getvelocity().y)
|
||||
new_velo = get_velocity(self.v, self.object:getyaw(),
|
||||
self.object:getvelocity().y)
|
||||
self.object:setpos(self.object:getpos())
|
||||
else
|
||||
p.y = p.y + 1
|
||||
if boats.is_water(p) then
|
||||
if is_water(p) then
|
||||
local y = self.object:getvelocity().y
|
||||
if y >= 4.5 then
|
||||
y = 4.5
|
||||
if y >= 5 then
|
||||
y = 5
|
||||
elseif y < 0 then
|
||||
new_acce = {x = 0, y = 20, z = 0}
|
||||
else
|
||||
new_acce = {x = 0, y = 5, z = 0}
|
||||
end
|
||||
new_velo = boats.get_velocity(self.v, self.object:getyaw(), y)
|
||||
new_velo = get_velocity(self.v, self.object:getyaw(), y)
|
||||
self.object:setpos(self.object:getpos())
|
||||
else
|
||||
new_acce = {x = 0, y = 0, z = 0}
|
||||
@ -176,10 +197,10 @@ function boats.on_step(self, dtime)
|
||||
local pos = self.object:getpos()
|
||||
pos.y = math.floor(pos.y) + 0.5
|
||||
self.object:setpos(pos)
|
||||
new_velo = boats.get_velocity(self.v, self.object:getyaw(), 0)
|
||||
new_velo = get_velocity(self.v, self.object:getyaw(), 0)
|
||||
else
|
||||
new_velo = boats.get_velocity(self.v, self.object:getyaw(),
|
||||
self.object:getvelocity().y)
|
||||
new_velo = get_velocity(self.v, self.object:getyaw(),
|
||||
self.object:getvelocity().y)
|
||||
self.object:setpos(self.object:getpos())
|
||||
end
|
||||
end
|
||||
@ -188,140 +209,31 @@ function boats.on_step(self, dtime)
|
||||
self.object:setacceleration(new_acce)
|
||||
end
|
||||
|
||||
boats.register_boat = function(parameters)
|
||||
minetest.register_entity("boats:" .. parameters.name, {
|
||||
physical = true,
|
||||
collisionbox = {-0.5, -0.35, -0.5, 0.5, 0.3, 0.5},
|
||||
visual = "mesh",
|
||||
mesh = "boat.obj",
|
||||
textures = {parameters.texture or "default_wood.png"},
|
||||
|
||||
parameters = parameters,
|
||||
driver = nil,
|
||||
v = 0,
|
||||
last_v = 0,
|
||||
removed = false,
|
||||
|
||||
on_rightclick = boats.on_rightclick,
|
||||
on_activate = boats.on_activate,
|
||||
get_staticdata = boats.get_staticdata,
|
||||
on_punch = boats.on_punch,
|
||||
on_step = boats.on_step
|
||||
})
|
||||
|
||||
minetest.register_craftitem("boats:" .. parameters.name, {
|
||||
description = parameters.description or "Boat",
|
||||
inventory_image = "boats_" .. parameters.name .. "_inventory.png",
|
||||
wield_image = "boats_" .. parameters.name .. "_wield.png",
|
||||
wield_scale = {x = 2, y = 2, z = 1},
|
||||
liquids_pointable = true,
|
||||
|
||||
on_place = function(itemstack, placer, pointed_thing)
|
||||
if pointed_thing.type ~= "node" then
|
||||
return
|
||||
end
|
||||
if not boats.is_water(pointed_thing.under) then
|
||||
return
|
||||
end
|
||||
pointed_thing.under.y = pointed_thing.under.y + 0.5
|
||||
minetest.add_entity(pointed_thing.under, "boats:"..parameters.name)
|
||||
if not minetest.setting_getbool("creative_mode") then
|
||||
itemstack:take_item()
|
||||
end
|
||||
return itemstack
|
||||
end,
|
||||
})
|
||||
end
|
||||
minetest.register_entity("boats:boat", boat)
|
||||
|
||||
|
||||
boats.register_boat({
|
||||
name = "boat",
|
||||
texture = "default_wood.png",
|
||||
controls = {
|
||||
up = 0.1,
|
||||
down = 0.08,
|
||||
rotate = 0.75
|
||||
},
|
||||
description = "Boat"
|
||||
})
|
||||
minetest.register_craftitem("boats:boat", {
|
||||
description = "Boat",
|
||||
inventory_image = "boats_inventory.png",
|
||||
wield_image = "boats_wield.png",
|
||||
wield_scale = {x = 2, y = 2, z = 1},
|
||||
liquids_pointable = true,
|
||||
|
||||
boats.register_boat({
|
||||
name = "race",
|
||||
texture = "default_gravel.png",
|
||||
controls = {
|
||||
up = 0.2,
|
||||
down = 0.18,
|
||||
rotate = 1
|
||||
},
|
||||
description = "Race boat"
|
||||
})
|
||||
|
||||
boats.register_boat({
|
||||
name = "expert_race",
|
||||
texture = "default_desert_stone.png",
|
||||
controls = {
|
||||
up = 0.25,
|
||||
down = 0.25,
|
||||
rotate = 4
|
||||
},
|
||||
description = "Expert race boat"
|
||||
})
|
||||
|
||||
|
||||
boats.register_boat({
|
||||
name = "water",
|
||||
texture = "default_water.png",
|
||||
controls = {
|
||||
up = 0.3,
|
||||
down = 0.24,
|
||||
rotate = 4
|
||||
},
|
||||
description = "Water boat"
|
||||
})
|
||||
|
||||
boats.register_boat({
|
||||
name = "moon",
|
||||
texture = "boats_moon.png",
|
||||
controls = {
|
||||
up = 0.5,
|
||||
down = 0.1,
|
||||
rotate = 8
|
||||
},
|
||||
description = "Moon boat"
|
||||
})
|
||||
|
||||
-- Craft registrations
|
||||
|
||||
minetest.register_craft({
|
||||
output = "boats:moon",
|
||||
recipe = {
|
||||
{"default:obsidian", "", "default:obsidian"},
|
||||
{"default:dirt", "default:leaves", "default:dirt"},
|
||||
},
|
||||
})
|
||||
|
||||
minetest.register_craft({
|
||||
output = "boats:expert_race",
|
||||
recipe = {
|
||||
{"default:desert_stone", "", "default:desert_stone"},
|
||||
{"default:desert_stone", "default:mese", "default:desert_stone"},
|
||||
},
|
||||
})
|
||||
|
||||
minetest.register_craft({
|
||||
output = "boats:race",
|
||||
recipe = {
|
||||
{"default:gravel", "", "default:gravel"},
|
||||
{"default:gravel", "default:steelblock", "default:gravel"},
|
||||
},
|
||||
})
|
||||
|
||||
minetest.register_craft({
|
||||
output = "boats:water",
|
||||
recipe = {
|
||||
{"default:glass", "", "default:glass"},
|
||||
{"default:glass", "bucket:bucket_water", "default:glass"},
|
||||
},
|
||||
on_place = function(itemstack, placer, pointed_thing)
|
||||
if pointed_thing.type ~= "node" then
|
||||
return
|
||||
end
|
||||
if not is_water(pointed_thing.under) then
|
||||
return
|
||||
end
|
||||
pointed_thing.under.y = pointed_thing.under.y + 0.5
|
||||
minetest.add_entity(pointed_thing.under, "boats:boat")
|
||||
if not minetest.setting_getbool("creative_mode") then
|
||||
itemstack:take_item()
|
||||
end
|
||||
return itemstack
|
||||
end,
|
||||
})
|
||||
|
||||
|
||||
|