1
1
-- Minetest 0.4 mod: bones
2
- -- See README.txt for licensing and other information.
3
-
4
- bones = {}
2
+ -- See README.txt for licensing and other information.
5
3
6
4
local function is_owner (pos , name )
7
5
local owner = minetest .get_meta (pos ):get_string (" owner" )
@@ -11,7 +9,7 @@ local function is_owner(pos, name)
11
9
return false
12
10
end
13
11
14
- bones . bones_formspec =
12
+ local bones_formspec =
15
13
" size[8,9]" ..
16
14
default .gui_bg ..
17
15
default .gui_bg_img ..
@@ -37,12 +35,12 @@ minetest.register_node("bones:bones", {
37
35
" bones_front.png"
38
36
},
39
37
paramtype2 = " facedir" ,
40
- groups = {dig_immediate = 2 },
38
+ groups = {dig_immediate = 2 },
41
39
sounds = default .node_sound_dirt_defaults ({
42
- footstep = {name = " default_gravel_footstep" , gain = 0.5 },
43
- dug = {name = " default_gravel_footstep" , gain = 1.0 },
40
+ footstep = {name = " default_gravel_footstep" , gain = 0.5 },
41
+ dug = {name = " default_gravel_footstep" , gain = 1.0 },
44
42
}),
45
-
43
+
46
44
can_dig = function (pos , player )
47
45
local inv = minetest .get_meta (pos ):get_inventory ()
48
46
local name = " "
@@ -51,46 +49,46 @@ minetest.register_node("bones:bones", {
51
49
end
52
50
return is_owner (pos , name ) and inv :is_empty (" main" )
53
51
end ,
54
-
52
+
55
53
allow_metadata_inventory_move = function (pos , from_list , from_index , to_list , to_index , count , player )
56
54
if is_owner (pos , player :get_player_name ()) then
57
55
return count
58
56
end
59
57
return 0
60
58
end ,
61
-
59
+
62
60
allow_metadata_inventory_put = function (pos , listname , index , stack , player )
63
61
return 0
64
62
end ,
65
-
63
+
66
64
allow_metadata_inventory_take = function (pos , listname , index , stack , player )
67
65
if is_owner (pos , player :get_player_name ()) then
68
66
return stack :get_count ()
69
67
end
70
68
return 0
71
69
end ,
72
-
70
+
73
71
on_metadata_inventory_take = function (pos , listname , index , stack , player )
74
72
local meta = minetest .get_meta (pos )
75
73
if meta :get_inventory ():is_empty (" main" ) then
76
74
minetest .remove_node (pos )
77
75
end
78
76
end ,
79
-
77
+
80
78
on_punch = function (pos , node , player )
81
- if ( not is_owner (pos , player :get_player_name () )) then
79
+ if not is_owner (pos , player :get_player_name ()) then
82
80
return
83
81
end
84
-
85
- if ( minetest .get_meta (pos ):get_string (" infotext" ) == " " ) then
82
+
83
+ if minetest .get_meta (pos ):get_string (" infotext" ) == " " then
86
84
return
87
85
end
88
-
86
+
89
87
local inv = minetest .get_meta (pos ):get_inventory ()
90
88
local player_inv = player :get_inventory ()
91
89
local has_space = true
92
-
93
- for i = 1 , inv :get_size (" main" ) do
90
+
91
+ for i = 1 , inv :get_size (" main" ) do
94
92
local stk = inv :get_stack (" main" , i )
95
93
if player_inv :room_for_item (" main" , stk ) then
96
94
inv :set_stack (" main" , i , nil )
@@ -100,7 +98,7 @@ minetest.register_node("bones:bones", {
100
98
break
101
99
end
102
100
end
103
-
101
+
104
102
-- remove bones if player emptied them
105
103
if has_space then
106
104
if player_inv :room_for_item (" main" , {name = " bones:bones" }) then
@@ -111,12 +109,12 @@ minetest.register_node("bones:bones", {
111
109
minetest .remove_node (pos )
112
110
end
113
111
end ,
114
-
112
+
115
113
on_timer = function (pos , elapsed )
116
114
local meta = minetest .get_meta (pos )
117
115
local time = meta :get_int (" time" ) + elapsed
118
116
if time >= share_bones_time then
119
- meta :set_string (" infotext" , meta :get_string (" owner" ).. " 's old bones" )
117
+ meta :set_string (" infotext" , meta :get_string (" owner" ) .. " 's old bones" )
120
118
meta :set_string (" owner" , " " )
121
119
else
122
120
meta :set_int (" time" , time )
@@ -131,13 +129,9 @@ local function may_replace(pos, player)
131
129
local node_name = minetest .get_node (pos ).name
132
130
local node_definition = minetest .registered_nodes [node_name ]
133
131
134
- -- if the node is unknown, we let the protection mod decide
135
- -- this is consistent with when a player could dig or not dig it
136
- -- unknown decoration would often be removed
137
- -- while unknown building materials in use would usually be left
132
+ -- if the node is unknown, we return false
138
133
if not node_definition then
139
- -- only replace nodes that are not protected
140
- return not minetest .is_protected (pos , player :get_player_name ())
134
+ return false
141
135
end
142
136
143
137
-- allow replacing air and liquids
@@ -157,70 +151,92 @@ local function may_replace(pos, player)
157
151
return node_definition .buildable_to and not minetest .is_protected (pos , player :get_player_name ())
158
152
end
159
153
154
+ local drop = function (pos , itemstack )
155
+ local obj = core .add_item (pos , itemstack :take_item (itemstack :get_count ()))
156
+ if obj then
157
+ obj :setvelocity ({
158
+ x = math.random (- 10 , 10 ) / 9 ,
159
+ y = 5 ,
160
+ z = math.random (- 10 , 10 ) / 9 ,
161
+ })
162
+ end
163
+ end
164
+
160
165
minetest .register_on_dieplayer (function (player )
161
- if minetest .setting_getbool (" creative_mode" ) then
166
+
167
+ local bones_mode = minetest .setting_get (" bones_mode" ) or " bones"
168
+ if bones_mode ~= " bones" and bones_mode ~= " drop" and bones_mode ~= " keep" then
169
+ bones_mode = " bones"
170
+ end
171
+
172
+ -- return if keep inventory set or in creative mode
173
+ if bones_mode == " keep" or minetest .setting_getbool (" creative_mode" ) then
162
174
return
163
175
end
164
-
176
+
165
177
local player_inv = player :get_inventory ()
166
178
if player_inv :is_empty (" main" ) and
167
179
player_inv :is_empty (" craft" ) then
168
180
return
169
181
end
170
182
171
- local pos = player :getpos ()
172
- pos .x = math.floor (pos .x + 0.5 )
173
- pos .y = math.floor (pos .y + 0.5 )
174
- pos .z = math.floor (pos .z + 0.5 )
175
- local param2 = minetest .dir_to_facedir (player :get_look_dir ())
183
+ local pos = vector .round (player :getpos ())
176
184
local player_name = player :get_player_name ()
177
185
178
- if (not may_replace (pos , player )) then
179
- if (may_replace ({x = pos .x , y = pos .y + 1 , z = pos .z }, player )) then
180
- -- drop one node above if there's space
181
- -- this should solve most cases of protection related deaths in which players dig straight down
182
- -- yet keeps the bones reachable
183
- pos .y = pos .y + 1
184
- else
185
- -- drop items instead of delete
186
- for i = 1 ,player_inv :get_size (" main" ) do
187
- minetest .add_item (pos , player_inv :get_stack (" main" , i ))
188
- end
189
- for i = 1 ,player_inv :get_size (" craft" ) do
190
- minetest .add_item (pos , player_inv :get_stack (" craft" , i ))
191
- end
192
- -- empty lists main and craft
193
- player_inv :set_list (" main" , {})
194
- player_inv :set_list (" craft" , {})
195
- return
186
+ -- check if it's possible to place bones, if not go 1 higher
187
+ if bones_mode == " bones" and not may_replace (pos , player ) then
188
+ pos .y = pos .y + 1
189
+ end
190
+
191
+ -- still cannot place bones? change mode to 'drop'
192
+ if bones_mode == " bones" and not may_replace (pos , player ) then
193
+ bones_mode = " drop"
194
+ end
195
+
196
+ if bones_mode == " drop" then
197
+
198
+ -- drop inventory items
199
+ for i = 1 , player_inv :get_size (" main" ) do
200
+ drop (pos , player_inv :get_stack (" main" , i ))
201
+ end
202
+ player_inv :set_list (" main" , {})
203
+
204
+ -- drop crafting grid items
205
+ for i = 1 , player_inv :get_size (" craft" ) do
206
+ drop (pos , player_inv :get_stack (" craft" , i ))
196
207
end
208
+ player_inv :set_list (" craft" , {})
209
+
210
+ drop (pos , ItemStack (" bones:bones" ))
211
+ return
197
212
end
198
-
199
- minetest .set_node (pos , {name = " bones:bones" , param2 = param2 })
200
-
213
+
214
+ local param2 = minetest .dir_to_facedir (player :get_look_dir ())
215
+ minetest .set_node (pos , {name = " bones:bones" , param2 = param2 })
216
+
201
217
local meta = minetest .get_meta (pos )
202
218
local inv = meta :get_inventory ()
203
- inv :set_size (" main" , 8 * 4 )
219
+ inv :set_size (" main" , 8 * 4 )
204
220
inv :set_list (" main" , player_inv :get_list (" main" ))
205
-
206
- for i = 1 , player_inv :get_size (" craft" ) do
221
+
222
+ for i = 1 , player_inv :get_size (" craft" ) do
207
223
local stack = player_inv :get_stack (" craft" , i )
208
224
if inv :room_for_item (" main" , stack ) then
209
225
inv :add_item (" main" , stack )
210
226
else
211
227
-- drop if no space left
212
- minetest . add_item (pos , stack )
228
+ drop (pos , stack )
213
229
end
214
230
end
215
-
231
+
216
232
player_inv :set_list (" main" , {})
217
233
player_inv :set_list (" craft" , {})
218
-
219
- meta :set_string (" formspec" , bones . bones_formspec )
234
+
235
+ meta :set_string (" formspec" , bones_formspec )
220
236
meta :set_string (" owner" , player_name )
221
-
237
+
222
238
if share_bones_time ~= 0 then
223
- meta :set_string (" infotext" , player_name .. " 's fresh bones" )
239
+ meta :set_string (" infotext" , player_name .. " 's fresh bones" )
224
240
225
241
if share_bones_time_early == 0 or not minetest .is_protected (pos , player_name ) then
226
242
meta :set_int (" time" , 0 )
0 commit comments