Skip to content

Commit 2df7ce2

Browse files
tenplus1paramat
authored andcommittedJul 27, 2016
Bones: Ability to change bones mode. Tidy up code
Add 'bones_mode' setting to minetest.conf -> Modes: bones, drop, keep Remove table 'bones' Add minetest.conf.example description Remove protection check from may_replace
1 parent db129f4 commit 2df7ce2

File tree

2 files changed

+87
-65
lines changed

2 files changed

+87
-65
lines changed
 

‎minetest.conf.example

+6
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,12 @@
55
# Whether creative mode (fast digging of all blocks, unlimited resources) should be enabled
66
#creative_mode = false
77

8+
# Sets the behaviour of the inventory items when a player dies.
9+
# "bones": Store all items inside a bone node but drop items if inside protected area
10+
# "drop": Drop all items on the ground
11+
# "keep": Player keeps all items
12+
#bones_mode = "bones"
13+
814
# The time in seconds after which the bones of a dead player can be looted by everyone
915
# 0 to disable
1016
#share_bones_time = 1200

‎mods/bones/init.lua

+81-65
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
11
-- 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.
53

64
local function is_owner(pos, name)
75
local owner = minetest.get_meta(pos):get_string("owner")
@@ -11,7 +9,7 @@ local function is_owner(pos, name)
119
return false
1210
end
1311

14-
bones.bones_formspec =
12+
local bones_formspec =
1513
"size[8,9]" ..
1614
default.gui_bg ..
1715
default.gui_bg_img ..
@@ -37,12 +35,12 @@ minetest.register_node("bones:bones", {
3735
"bones_front.png"
3836
},
3937
paramtype2 = "facedir",
40-
groups = {dig_immediate=2},
38+
groups = {dig_immediate = 2},
4139
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},
4442
}),
45-
43+
4644
can_dig = function(pos, player)
4745
local inv = minetest.get_meta(pos):get_inventory()
4846
local name = ""
@@ -51,46 +49,46 @@ minetest.register_node("bones:bones", {
5149
end
5250
return is_owner(pos, name) and inv:is_empty("main")
5351
end,
54-
52+
5553
allow_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player)
5654
if is_owner(pos, player:get_player_name()) then
5755
return count
5856
end
5957
return 0
6058
end,
61-
59+
6260
allow_metadata_inventory_put = function(pos, listname, index, stack, player)
6361
return 0
6462
end,
65-
63+
6664
allow_metadata_inventory_take = function(pos, listname, index, stack, player)
6765
if is_owner(pos, player:get_player_name()) then
6866
return stack:get_count()
6967
end
7068
return 0
7169
end,
72-
70+
7371
on_metadata_inventory_take = function(pos, listname, index, stack, player)
7472
local meta = minetest.get_meta(pos)
7573
if meta:get_inventory():is_empty("main") then
7674
minetest.remove_node(pos)
7775
end
7876
end,
79-
77+
8078
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
8280
return
8381
end
84-
85-
if(minetest.get_meta(pos):get_string("infotext") == "") then
82+
83+
if minetest.get_meta(pos):get_string("infotext") == "" then
8684
return
8785
end
88-
86+
8987
local inv = minetest.get_meta(pos):get_inventory()
9088
local player_inv = player:get_inventory()
9189
local has_space = true
92-
93-
for i=1,inv:get_size("main") do
90+
91+
for i = 1, inv:get_size("main") do
9492
local stk = inv:get_stack("main", i)
9593
if player_inv:room_for_item("main", stk) then
9694
inv:set_stack("main", i, nil)
@@ -100,7 +98,7 @@ minetest.register_node("bones:bones", {
10098
break
10199
end
102100
end
103-
101+
104102
-- remove bones if player emptied them
105103
if has_space then
106104
if player_inv:room_for_item("main", {name = "bones:bones"}) then
@@ -111,12 +109,12 @@ minetest.register_node("bones:bones", {
111109
minetest.remove_node(pos)
112110
end
113111
end,
114-
112+
115113
on_timer = function(pos, elapsed)
116114
local meta = minetest.get_meta(pos)
117115
local time = meta:get_int("time") + elapsed
118116
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")
120118
meta:set_string("owner", "")
121119
else
122120
meta:set_int("time", time)
@@ -131,13 +129,9 @@ local function may_replace(pos, player)
131129
local node_name = minetest.get_node(pos).name
132130
local node_definition = minetest.registered_nodes[node_name]
133131

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
138133
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
141135
end
142136

143137
-- allow replacing air and liquids
@@ -157,70 +151,92 @@ local function may_replace(pos, player)
157151
return node_definition.buildable_to and not minetest.is_protected(pos, player:get_player_name())
158152
end
159153

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+
160165
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
162174
return
163175
end
164-
176+
165177
local player_inv = player:get_inventory()
166178
if player_inv:is_empty("main") and
167179
player_inv:is_empty("craft") then
168180
return
169181
end
170182

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())
176184
local player_name = player:get_player_name()
177185

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))
196207
end
208+
player_inv:set_list("craft", {})
209+
210+
drop(pos, ItemStack("bones:bones"))
211+
return
197212
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+
201217
local meta = minetest.get_meta(pos)
202218
local inv = meta:get_inventory()
203-
inv:set_size("main", 8*4)
219+
inv:set_size("main", 8 * 4)
204220
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
207223
local stack = player_inv:get_stack("craft", i)
208224
if inv:room_for_item("main", stack) then
209225
inv:add_item("main", stack)
210226
else
211227
--drop if no space left
212-
minetest.add_item(pos, stack)
228+
drop(pos, stack)
213229
end
214230
end
215-
231+
216232
player_inv:set_list("main", {})
217233
player_inv:set_list("craft", {})
218-
219-
meta:set_string("formspec", bones.bones_formspec)
234+
235+
meta:set_string("formspec", bones_formspec)
220236
meta:set_string("owner", player_name)
221-
237+
222238
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")
224240

225241
if share_bones_time_early == 0 or not minetest.is_protected(pos, player_name) then
226242
meta:set_int("time", 0)

0 commit comments

Comments
 (0)
Please sign in to comment.