diff --git a/api.lua b/api.lua new file mode 100644 index 0000000..05b6306 --- /dev/null +++ b/api.lua @@ -0,0 +1,94 @@ + +-- Table Save Load Functions +local function save_playerD() + local file = io.open(minetest.get_worldpath().."/awards.txt", "w") + if file then + file:write(minetest.serialize(player_data)) + file:close() + end +end + +local function load_playerD() + local file = io.open(minetest.get_worldpath().."/awards.txt", "r") + if file then + local table = minetest.deserialize(file:read("*all")) + if type(table) == "table" then + return table + end + end + return {} +end + +-- The global award namespace +awards={} +player_data=load_playerD() + +-- A table of award definitions +awards.def={} + +-- Load files +dofile(minetest.get_modpath("awards").."/triggers.lua") + +-- API Functions +function awards.register_achievement(name,data_table) + awards['def'][name] = data_table +end + +function awards.register_onDig(func) + table.insert(awards.onDig,func); +end + +function awards.register_onPlace(func) + table.insert(awards.onPlace,func); +end + +function awards.give_achievement(name,award) + local data=player_data[name] + + if not data['unlocked'] then + data['unlocked']={} + end + + if not data['unlocked'][award] or data['unlocked'][award]~=award then + -- set player_data table + data['unlocked'][award]=award + + -- define local award data + local title = award + local desc = "" + + -- check definition table + if awards['def'][award] and awards['def'][award]['title'] then + title=awards['def'][award]['title'] + end + + if awards['def'][award] and awards['def'][award]['description'] then + desc=awards['def'][award]['description'] + end + + -- send award header + minetest.chat_send_player(name, "Achievement Unlocked: "..title) + + -- send award content + if desc~="" then + minetest.chat_send_player(name, desc) + end + + -- save playertable + save_playerD() + end +end + +-- List a player's achievements +minetest.register_chatcommand("list_awards", { + params = "", + description = "list_awards: list your awards", + func = function(name, param) + minetest.chat_send_player(name, "Your awards:"); + + for _, str in pairs(player_data[name].unlocked) do + minetest.chat_send_player(name, str); + end + end, +}) + diff --git a/init.lua b/init.lua index c07c500..eb3dc45 100644 --- a/init.lua +++ b/init.lua @@ -1,104 +1,12 @@ -- AWARDS -- by Rubenwardy, CC-BY-SA ------------------------------------------------------- --- this is the api definition file for the awards mod +-- this is the init file for the award mod ------------------------------------------------------- --- Table Save Load Functions -local function save_playerD() - local file = io.open(minetest.get_worldpath().."/awards.txt", "w") - if file then - file:write(minetest.serialize(player_data)) - file:close() - end -end +dofile(minetest.get_modpath("awards").."/api.lua") -local function load_playerD() - local file = io.open(minetest.get_worldpath().."/awards.txt", "r") - if file then - local table = minetest.deserialize(file:read("*all")) - if type(table) == "table" then - return table - end - end - return {} -end - --- The global award namespace -awards={} -player_data=load_playerD() - --- A table of award definitions -awards.def={} - --- Load files -dofile(minetest.get_modpath("awards").."/triggers.lua") - --- API Functions -function awards.register_achievement(name,data_table) - awards['def'][name] = data_table -end - -function awards.register_onDig(func) - table.insert(awards.onDig,func); -end - -function awards.register_onPlace(func) - table.insert(awards.onPlace,func); -end - -function awards.give_achievement(name,award) - local data=player_data[name] - - if not data['unlocked'] then - data['unlocked']={} - end - - if not data['unlocked'][award] or data['unlocked'][award]~=award then - -- set player_data table - data['unlocked'][award]=award - - -- define local award data - local title = award - local desc = "" - - -- check definition table - if awards['def'][award] and awards['def'][award]['title'] then - title=awards['def'][award]['title'] - end - - if awards['def'][award] and awards['def'][award]['description'] then - desc=awards['def'][award]['description'] - end - - -- send award header - minetest.chat_send_player(name, "Achievement Unlocked: "..title) - - -- send award content - if desc~="" then - minetest.chat_send_player(name, desc) - end - - -- save player_data table - save_playerD() - end -end - --- List a player's achievements -minetest.register_chatcommand("list_awards", { - params = "", - description = "list_awards: list your awards", - func = function(name, param) - minetest.chat_send_player(name, "Your awards:"); - - for _, str in pairs(player_data[name].unlocked) do - minetest.chat_send_player(name, str); - end - end, -}) - - --- Example Achievements +-- Found some Mese! awards.register_achievement("award_mesefind",{ title = "First Mese Find", description = "Found some Mese!", @@ -114,12 +22,19 @@ awards.register_onDig(function(player,data) end end) + +-- First Wood Placed! +awards.register_achievement("award_woodplace",{ + title = "Foundations", + description = "First Wood Placed!", +}) + awards.register_onPlace(function(player,data) if not data['place']['default'] or not data['place']['default']['mese'] then return end - if data['place']['default']['mese'] > 0 then - return "award_meseplace" + if data['place']['default']['wood'] > 0 then + return "award_woodplace" end end) \ No newline at end of file diff --git a/readme.md b/readme.md index 324a383..917f2aa 100644 --- a/readme.md +++ b/readme.md @@ -17,8 +17,13 @@ The API * sound [optional] * image [optional] * func [optional] - see below +* awards.give_achievement(name,award) + * -- gives an award to a player * awards.register_onDig(func) - * -- return true if the medal should be rewarded + * -- return award name or null + * -- there will be built in versions of this function +* awards.register_onPlace(func) + * -- return award name or null * -- there will be built in versions of this function @@ -29,6 +34,9 @@ A list of data referenced/hashed by the player's name. * name [string] * getNodeCount('node_name') [function] -* count [table] +* count [table] - dig counter * modname [table] - *itemname [int] \ No newline at end of file + * itemname [int] +* place [table] - place counter + * modname [table] + * itemname [int] \ No newline at end of file