2022-02-21 14:55:36 -08:00
achvmt_lib = { }
2020-08-13 13:47:58 -07:00
----------------------------------------------
---------------DICHIARAZIONI------------------
----------------------------------------------
local function update_storage ( ) end
local storage = minetest.get_mod_storage ( )
local achievements = { } -- KEY: mod; VALUE: {KEY: achievement ID; VALUE: {whatever properties}
local p_achievements = { } -- KEY: p_name; VALUE: {KEY: mod, VALUE: {KEY: achievement ID VALUE: true/nil}}}
-- inizializzo storage caricando tutti i giocatori
for pl_name , mods in pairs ( storage : to_table ( ) . fields ) do
p_achievements [ pl_name ] = minetest.deserialize ( mods )
end
----------------------------------------------
-------------------CORPO----------------------
----------------------------------------------
2022-02-21 14:55:36 -08:00
function achvmt_lib . register_achievements ( mod , mod_achievements )
2020-08-13 13:47:58 -07:00
assert ( achievements [ mod ] == nil , " [ACHIEVEMENTS_LIB] There was an attempt to register the mod " .. mod .. " more than once! Be sure you didn't call this function twice and you didn't install any suspicious mod " )
achievements [ mod ] = mod_achievements
end
2022-02-21 14:55:36 -08:00
function achvmt_lib . unlock_achievement ( p_name , mod , achvmt_ID )
2020-08-13 13:47:58 -07:00
local achievement = achievements [ mod ] [ achvmt_ID ]
if achievement == nil then return end
if p_achievements [ p_name ] [ mod ] [ achvmt_ID ] ~= nil then return end
p_achievements [ p_name ] [ mod ] [ achvmt_ID ] = true
update_storage ( p_name )
end
----------------------------------------------
--------------------UTILS---------------------
----------------------------------------------
2022-02-21 14:55:36 -08:00
function achvmt_lib . has_player_achievement ( p_name , mod , achvmt_ID )
2020-08-13 13:47:58 -07:00
return p_achievements [ p_name ] [ mod ] [ achvmt_ID ] ~= nil
end
2022-02-21 14:55:36 -08:00
function achvmt_lib . is_player_in_storage ( p_name , mod )
2020-08-13 13:47:58 -07:00
if p_achievements [ p_name ] then
if mod and p_achievements [ p_name ] [ mod ] then
return true
else
return false
end
else
return false
end
end
2022-02-21 14:57:12 -08:00
-- INTERNAL USE ONLY
2022-02-21 14:55:36 -08:00
function achvmt_lib . add_player_to_storage ( p_name )
2020-08-13 13:47:58 -07:00
if not minetest.get_player_by_name ( p_name ) then
minetest.log ( " Warning " , " [ACHIEVEMENTS_LIB] Player " .. p_name .. " must be online in order to be added to the storage! " )
return end
2020-11-10 06:25:09 -08:00
if not p_achievements [ p_name ] then
p_achievements [ p_name ] = { }
end
local update_storage = false
2020-11-10 15:22:35 -08:00
for mod , _ in pairs ( achievements ) do
2022-02-21 14:55:36 -08:00
if not achvmt_lib.is_player_in_storage ( p_name , mod ) then
2020-08-13 13:47:58 -07:00
p_achievements [ p_name ] [ mod ] = { }
2020-11-10 06:25:09 -08:00
update_storage = true
2020-08-13 13:47:58 -07:00
end
2020-11-10 06:25:09 -08:00
end
if update_storage then
2020-08-13 13:47:58 -07:00
storage : set_string ( p_name , minetest.serialize ( p_achievements [ p_name ] ) )
end
end
----------------------------------------------
-----------------GETTERS----------------------
----------------------------------------------
2022-02-21 14:55:36 -08:00
function achvmt_lib . get_achievement ( mod , achvmt_ID )
2020-08-13 13:47:58 -07:00
return achievements [ mod ] [ achvmt_ID ]
end
2022-02-21 14:55:36 -08:00
function achvmt_lib . get_player_achievements ( p_name , mod )
2020-08-13 13:47:58 -07:00
return p_achievements [ p_name ] [ mod ]
end
----------------------------------------------
---------------FUNZIONI LOCALI----------------
----------------------------------------------
function update_storage ( p_name )
storage : set_string ( p_name , minetest.serialize ( p_achievements [ p_name ] ) )
end
2020-11-10 06:25:09 -08:00
----------------------------------------------
------------------DEPRECATED------------------
----------------------------------------------
2022-02-21 14:55:36 -08:00
function achvmt_lib . add_achievement ( p_name , mod , achvmt_ID )
minetest.log ( " warning " , " [ACHIEVEMENTS_LIB] ( " .. mod .. " ) achvmt_lib.add_achievement is deprecated: use unlock_achievement instead " )
achvmt_lib.unlock_achievement ( p_name , mod , achvmt_ID )
2020-11-10 06:25:09 -08:00
end