diff --git a/builtin/game/init.lua b/builtin/game/init.lua index 52bdbee3..4a4c4d9c 100644 --- a/builtin/game/init.lua +++ b/builtin/game/init.lua @@ -16,6 +16,7 @@ if core.settings:get_bool("profiler.load") then profiler = dofile(scriptpath .. "profiler" .. DIR_DELIM .. "init.lua") end +dofile(gamepath .. "player_meta.lua") dofile(commonpath .. "after.lua") dofile(gamepath .. "item_entity.lua") dofile(gamepath .. "misc.lua") diff --git a/builtin/game/player_meta.lua b/builtin/game/player_meta.lua new file mode 100644 index 00000000..fdc3b6b3 --- /dev/null +++ b/builtin/game/player_meta.lua @@ -0,0 +1,49 @@ +local floor, tostring = math.floor, tostring +local getmetatable, setmetatable = getmetatable, setmetatable +local PlayerMetaRef = {} + +function PlayerMetaRef:contains(key) + return self.player:get_attribute(key) ~= nil +end + +function PlayerMetaRef:get(key) + return self.player:get_attribute(key) +end + +function PlayerMetaRef:set_string(key, value) + if value == "" then + value = nil + end + self.player:set_attribute(key, value) +end + +function PlayerMetaRef:get_string(key) + return self.player:get_attribute(key) or "" +end + +function PlayerMetaRef:set_int(key, value) + self:set_float(key, floor(value)) +end + +function PlayerMetaRef:get_int(key) + return floor(self:get_float(key)) +end + +function PlayerMetaRef:set_float(key, value) + self.player:set_attribute(key, tostring(value)) +end + +function PlayerMetaRef:get_float(key) + return tonumber(self:get_string(key)) or 0 +end + +local mt = {__index = PlayerMetaRef} +local function get_player_meta(player) + return setmetatable({player = player}, mt) +end + +minetest.register_on_joinplayer(function(player) + if not player.get_meta then + getmetatable(player).get_meta = get_player_meta + end +end)