From 77ef73a3dd955ddfe758d42de4e1a56d52089c47 Mon Sep 17 00:00:00 2001 From: Zughy <4279489-marco_a@users.noreply.gitlab.com> Date: Thu, 13 Aug 2020 22:47:58 +0200 Subject: [PATCH] Primo commit --- api.lua | 150 +++++++++++++++++++++++++++++++++++++++++++++ init.lua | 6 ++ mod.conf | 1 + player_manager.lua | 3 + 4 files changed, 160 insertions(+) create mode 100644 api.lua create mode 100644 init.lua create mode 100644 mod.conf create mode 100644 player_manager.lua diff --git a/api.lua b/api.lua new file mode 100644 index 0000000..52fcf15 --- /dev/null +++ b/api.lua @@ -0,0 +1,150 @@ +achievements_lib = {} + + + +---------------------------------------------- +---------------DICHIARAZIONI------------------ +---------------------------------------------- + +local function update_storage() end +local function generate_access_key() 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}}} +local access_keys = {} -- KEY: random ID; VALUE: mod name + + +-- 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 + +minetest.log("action", dump(p_achievements)) + + + + +---------------------------------------------- +-------------------CORPO---------------------- +---------------------------------------------- + +function achievements_lib.register_achievements(mod, mod_achievements) + 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 + + return generate_access_key(mod) +end + + + +function achievements_lib.add_achievement(p_name, mod_key, achvmt_ID) + + local mod = access_keys[mod_key] + 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--------------------- +---------------------------------------------- + +function achievements_lib.has_player_achievement(p_name, mod, achvmt_ID) + return p_achievements[p_name][mod][achvmt_ID] ~= nil +end + + + +function achievements_lib.is_player_in_storage(p_name, mod) + 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 + + + +function achievements_lib.add_player_to_storage(p_name, mod) + + 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 + + if p_achievements[p_name] then + if mod and p_achievements[p_name][mod] then + minetest.log("Warning", "[ACHIEVEMENTS_LIB] Can't add player to storage, an entry within this mod already exists!") + elseif mod then + p_achievements[p_name][mod] = {} + storage:set_string(p_name, minetest.serialize(p_achievements[p_name])) + else + minetest.log("Warning", "[ACHIEVEMENTS_LIB] Can't add player to storage, an entry already exists!") + end + else + p_achievements[p_name] = {} + storage:set_string(p_name, minetest.serialize(p_achievements[p_name])) + end +end + + + + + +---------------------------------------------- +-----------------GETTERS---------------------- +---------------------------------------------- + +function achievements_lib.get_achievement(mod_key, achvmt_ID) + local mod = access_keys[mod_key] + return achievements[mod][achvmt_ID] +end + + + +function achievements_lib.get_player_achievements(p_name, mod_key) + local mod = access_keys[mod_key] + 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 + + + +function generate_access_key(mod) + + local access_key = "" + + -- se si è così sfigati da generare due chiavi uguali, continua finché la nuova non è univoca + repeat + for i = 1, 10 do + access_key = access_key .. string.char(math.random(33,126)) + end + until (access_keys[access_key] == nil) + + access_keys[access_key] = mod + return access_key +end diff --git a/init.lua b/init.lua new file mode 100644 index 0000000..c2c48de --- /dev/null +++ b/init.lua @@ -0,0 +1,6 @@ +local version = "0.beta" + +dofile(minetest.get_modpath("achievements_lib") .. "/api.lua") +dofile(minetest.get_modpath("achievements_lib") .. "/player_manager.lua") + +minetest.log("action", "[ACHIEVEMENTS_LIB] Mod initialised, running version " .. version) diff --git a/mod.conf b/mod.conf new file mode 100644 index 0000000..35ec87d --- /dev/null +++ b/mod.conf @@ -0,0 +1 @@ +name=achievements_lib diff --git a/player_manager.lua b/player_manager.lua new file mode 100644 index 0000000..603baa5 --- /dev/null +++ b/player_manager.lua @@ -0,0 +1,3 @@ +minetest.register_on_newplayer(function(ObjectRef) + achievements_lib.add_player_to_storage(ObjectRef:get_player_name()) +end)