Skip to content

Commit c1b3ed4

Browse files
authoredMay 7, 2017
Player attrs: permits to remove an attribute by setting value to nil (#5716)
* Player attrs: permits to remove an attribute by setting value to nil When doing player:set_attribute("attr", nil) remove attribute Also remove a useless check on C++ API part (already done by checkplayer) Fix #5709
1 parent 0d7c379 commit c1b3ed4

File tree

4 files changed

+29
-14
lines changed

4 files changed

+29
-14
lines changed
 

‎doc/lua_api.txt

+3-1
Original file line numberDiff line numberDiff line change
@@ -3028,7 +3028,9 @@ This is basically a reference to a C++ `ServerActiveObject`
30283028
* `0`: player is drowning,
30293029
* `1`-`10`: remaining number of bubbles
30303030
* `11`: bubbles bar is not shown
3031-
* `set_attribute(attribute, value)`: sets an extra attribute with value on player
3031+
* `set_attribute(attribute, value)`:
3032+
* Sets an extra attribute with value on player.
3033+
* If value is nil, remove attribute from player.
30323034
* `get_attribute(attribute)`: returns value for extra attribute. Returns nil if no attribute found.
30333035
* `set_inventory_formspec(formspec)`
30343036
* Redefine player's inventory form

‎games/minimal/mods/default/init.lua

+12-10
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@ dofile(minetest.get_modpath("default").."/mapgen.lua")
1818
minetest.register_on_joinplayer(function(player)
1919
local cb = function(player)
2020
minetest.chat_send_player(player:get_player_name(), "This is the [minimal] \"Minimal Development Test\" game. Use [minetest_game] for the real thing.")
21+
player:set_attribute("test_attribute", "test_me")
22+
player:set_attribute("remove_this", nil)
2123
end
2224
minetest.after(2.0, cb, player)
2325
end)
@@ -1387,13 +1389,13 @@ minetest.register_abm({
13871389

13881390
local srclist = inv:get_list("src")
13891391
local cooked = nil
1390-
1392+
13911393
if srclist then
13921394
cooked = minetest.get_craft_result({method = "cooking", width = 1, items = srclist})
13931395
end
1394-
1396+
13951397
local was_active = false
1396-
1398+
13971399
if meta:get_float("fuel_time") < meta:get_float("fuel_totaltime") then
13981400
was_active = true
13991401
meta:set_float("fuel_time", meta:get_float("fuel_time") + 1)
@@ -1413,7 +1415,7 @@ minetest.register_abm({
14131415
meta:set_string("src_time", 0)
14141416
end
14151417
end
1416-
1418+
14171419
if meta:get_float("fuel_time") < meta:get_float("fuel_totaltime") then
14181420
local percent = math.floor(meta:get_float("fuel_time") /
14191421
meta:get_float("fuel_totaltime") * 100)
@@ -1438,7 +1440,7 @@ minetest.register_abm({
14381440
local cooked = nil
14391441
local fuellist = inv:get_list("fuel")
14401442
local srclist = inv:get_list("src")
1441-
1443+
14421444
if srclist then
14431445
cooked = minetest.get_craft_result({method = "cooking", width = 1, items = srclist})
14441446
end
@@ -1464,7 +1466,7 @@ minetest.register_abm({
14641466

14651467
meta:set_string("fuel_totaltime", fuel.time)
14661468
meta:set_string("fuel_time", 0)
1467-
1469+
14681470
local stack = inv:get_stack("fuel", 1)
14691471
stack:take_item()
14701472
inv:set_stack("fuel", 1, stack)
@@ -1571,7 +1573,7 @@ function default.grow_tree(data, a, pos, is_apple_tree, seed)
15711573
y = y+th-1 -- (x, y, z) is now last piece of trunk
15721574
local leaves_a = VoxelArea:new{MinEdge={x=-2, y=-1, z=-2}, MaxEdge={x=2, y=2, z=2}}
15731575
local leaves_buffer = {}
1574-
1576+
15751577
-- Force leaves near the trunk
15761578
local d = 1
15771579
for xi = -d, d do
@@ -1581,14 +1583,14 @@ function default.grow_tree(data, a, pos, is_apple_tree, seed)
15811583
end
15821584
end
15831585
end
1584-
1586+
15851587
-- Add leaves randomly
15861588
for iii = 1, 8 do
15871589
local d = 1
15881590
local xx = pr:next(leaves_a.MinEdge.x, leaves_a.MaxEdge.x - d)
15891591
local yy = pr:next(leaves_a.MinEdge.y, leaves_a.MaxEdge.y - d)
15901592
local zz = pr:next(leaves_a.MinEdge.z, leaves_a.MaxEdge.z - d)
1591-
1593+
15921594
for xi = 0, d do
15931595
for yi = 0, d do
15941596
for zi = 0, d do
@@ -1597,7 +1599,7 @@ function default.grow_tree(data, a, pos, is_apple_tree, seed)
15971599
end
15981600
end
15991601
end
1600-
1602+
16011603
-- Add the leaves
16021604
for xi = leaves_a.MinEdge.x, leaves_a.MaxEdge.x do
16031605
for yi = leaves_a.MinEdge.y, leaves_a.MaxEdge.y do

‎src/content_sao.h

+10
Original file line numberDiff line numberDiff line change
@@ -277,6 +277,16 @@ class PlayerSAO : public UnitSAO
277277
return true;
278278
}
279279

280+
inline void removeExtendedAttribute(const std::string &attr)
281+
{
282+
PlayerAttributes::iterator it = m_extra_attributes.find(attr);
283+
if (it == m_extra_attributes.end())
284+
return;
285+
286+
m_extra_attributes.erase(it);
287+
m_extended_attributes_modified = true;
288+
}
289+
280290
inline const PlayerAttributes &getExtendedAttributes()
281291
{
282292
return m_extra_attributes;

‎src/script/lua_api/l_object.cpp

+4-3
Original file line numberDiff line numberDiff line change
@@ -1202,9 +1202,10 @@ int ObjectRef::l_set_attribute(lua_State *L)
12021202
}
12031203

12041204
std::string attr = luaL_checkstring(L, 2);
1205-
std::string value = luaL_checkstring(L, 3);
1206-
1207-
if (co->getType() == ACTIVEOBJECT_TYPE_PLAYER) {
1205+
if (lua_isnil(L, 3)) {
1206+
co->removeExtendedAttribute(attr);
1207+
} else {
1208+
std::string value = luaL_checkstring(L, 3);
12081209
co->setExtendedAttribute(attr, value);
12091210
}
12101211
return 1;

0 commit comments

Comments
 (0)
Please sign in to comment.