From 773f7993203ee0d953bf019fd5e0f818e7008241 Mon Sep 17 00:00:00 2001 From: Rubenwardy Date: Wed, 6 Nov 2013 18:33:01 +0000 Subject: [PATCH] Restructure for bulletproof-ness --- api.lua | 104 +++++++++++++-------- triggers.lua | 248 ++++++++++++++++++++++++--------------------------- 2 files changed, 181 insertions(+), 171 deletions(-) diff --git a/api.lua b/api.lua index ea4ee73..bc975ca 100644 --- a/api.lua +++ b/api.lua @@ -31,6 +31,19 @@ player_data=load_playerD() -- A table of award definitions awards.def={} +function awards.tbv(tb,value,default) + if not default then + default = {} + end + if not tb then + print("Table not defined!") + return + end + if not tb[value] then + tb[value] = default + end +end + -- Load files dofile(minetest.get_modpath("awards").."/triggers.lua") dofile(minetest.get_modpath("awards").."/config.txt") @@ -38,43 +51,43 @@ dofile(minetest.get_modpath("awards").."/config.txt") -- API Functions function awards.register_achievement(name,data_table) -- see if a trigger is defined in the achievement definition - if data_table['trigger'] and data_table['trigger']['type'] then - if data_table['trigger']['type']=="dig" then + if data_table.trigger and data_table.trigger.type then + if data_table.trigger.type=="dig" then local tmp={ award=name, - node=data_table['trigger']['node'], - target=data_table['trigger']['target'], + node=data_table.trigger.node, + target=data_table.trigger.target, } table.insert(awards.onDig,tmp) - elseif data_table['trigger']['type']=="place" then + elseif data_table.trigger.type=="place" then local tmp={ award=name, - node=data_table['trigger']['node'], - target=data_table['trigger']['target'], + node=data_table.trigger.node, + target=data_table.trigger.target, } table.insert(awards.onPlace,tmp) - elseif data_table['trigger']['type']=="death" then + elseif data_table.trigger.type=="death" then local tmp={ award=name, - target=data_table['trigger']['target'], + target=data_table.trigger.target, } table.insert(awards.onDeath,tmp) end end -- check icon, background and custom_announce data - if data_table['icon'] == nil or data_table['icon'] == "" then - data_table['icon'] = "unknown.png" + if data_table.icon == nil or data_table.icon == "" then + data_table.icon = "unknown.png" end - if data_table['background'] == nil or data_table['background'] == "" then - data_table['background'] = "bg_default.png" + if data_table.background == nil or data_table.background == "" then + data_table.background = "bg_default.png" end - if data_table['custom_announce'] == nil or data_table['custom_announce'] == "" then - data_table['custom_announce'] = "Achievement Unlocked:" + if data_table.custom_announce == nil or data_table.custom_announce == "" then + data_table.custom_announce = "Achievement Unlocked:" end -- add the achievement to the definition table - awards['def'][name] = data_table + awards.def[name] = data_table end -- this function adds a trigger function or table to the ondig table @@ -100,34 +113,43 @@ end -- name - the name of the player -- award - the name of the award to give function awards.give_achievement(name,award) - -- load the player's data table + -- Access Player Data local data=player_data[name] - - -- check if the table that holds a player's achievements exists - if not data['unlocked'] then - data['unlocked']={} - end - -- check to see if the player does not already have that achievement - if not data['unlocked'][award] or data['unlocked'][award]~=award then - -- save the achievement to the player_data table - data['unlocked'][award]=award + -- Perform checks + if not data then + return + end + if not awards.def[award] then + return + end + awards.tbv(data,"unlocked") - -- define local variables, so award data can be saved + -- check to see if the player does not already have that achievement + if not data.unlocked[award] or data.unlocked[award]~=award then + -- Set award flag + data.unlocked[award]=award + + -- Get data from definition tables local title = award local desc = "" - - -- check definition table to get values - if awards['def'][award] and awards['def'][award]['title'] and awards['def'][award]['custom_announce'] and awards['def'][award]['background'] and awards['def'][award]['icon'] then - title=awards['def'][award]['title'] - background=awards['def'][award]['background'] - icon=awards['def'][award]['icon'] - custom_announce=awards['def'][award]['custom_announce'] + local background = "" + local icon = "" + local custom_announce = "" + if awards.def[award].title then + title = awards.def[award].title end - - -- check definition table to get description - if awards['def'][award] and awards['def'][award]['description'] then - desc=awards['def'][award]['description'] + if awards.def[award].custom_announce then + custom_announce = awards.def[award].custom_announce + end + if awards.def[award].background then + background = awards.def[award].background + end + if awards.def[award].icon then + icon = awards.def[award].icon + end + if awards.def[award] and awards.def[award].description then + desc = awards.def[award].description end -- send the won award message to the player @@ -159,7 +181,11 @@ minetest.register_chatcommand("list_awards", { params = "", description = "list_awards: list your awards", func = function(name, param) - minetest.chat_send_player(name, name.."'s awards:"); + if not player_data[name] then + minetest.chat_send_player(name, "Unable to find your award listings!") + end + + minetest.chat_send_player(name, name.."'s awards:") for _, str in pairs(player_data[name].unlocked) do minetest.chat_send_player(name, str); diff --git a/triggers.lua b/triggers.lua index c285464..4b99786 100644 --- a/triggers.lua +++ b/triggers.lua @@ -10,175 +10,164 @@ awards.onPlace={} awards.onTick={} awards.onDeath={} --- Player functions - -- Trigger Handles minetest.register_on_dignode(function(pos, oldnode, digger) + if not digger or not pos or not oldnode then + return + end local nodedug = string.split(oldnode.name, ":") - + if #nodedug ~= 2 then + print(oldnode.name.." is in wrong format!") + return + end local mod=nodedug[1] local item=nodedug[2] - local playern = digger:get_player_name() - if (playern~=nil and nodedug~=nil and mod~=nil and item~=nil) then - --check the player's directory - if not player_data[playern] then - player_data[playern]={} - player_data[playern]['name']=playern - end - if not player_data[playern]['count'] then - player_data[playern]['count']={} - end + if (not playern or not nodedug or not mod or not item) then + return + end - --check player.count.mod - if not player_data[playern].count[mod] then - player_data[playern]['count'][mod]={} - end + -- Run checks + awards.tbv(player_data, playern ) + awards.tbv(player_data[playern], "count" ) + awards.tbv(player_data[playern], "name", playern ) + awards.tbv(player_data[playern].count, mod) + awards.tbv(player_data[playern].count[mod], item, 0 ) - --check player.count.mod.item - if not player_data[playern]['count'][mod][item] then - player_data[playern]['count'][mod][item]=0 - end + -- Increment counder + player_data[playern].count[mod][item]=player_data[playern].count[mod][item]+1 + print(" - "..mod..":"..item.." 's count is now "..(player_data[playern].count[mod][item])) - player_data[playern]['count'][mod][item]=player_data[playern]['count'][mod][item]+1 + -- Run callbacks and triggers + local player=digger + local data=player_data[playern] - print(" - "..mod..":"..item.." 's count is now "..(player_data[playern]['count'][mod][item])) - - -- Roll through the onDig functions - local player=digger - local data=player_data[playern] - - for i=1,# awards.onDig do - local res=nil - - if type(awards.onDig[i]) == "function" then - -- run the function - print(i.." is a function") - res=awards.onDig[i](player,data) - elseif type(awards.onDig[i]) == "table" then - -- handle table here - print(i.." is a table") - if not awards.onDig[i]['node'] or not awards.onDig[i]['target'] or not awards.onDig[i]['award'] then + for i=1,# awards.onDig do + local res = nil + if type(awards.onDig[i]) == "function" then + -- Run trigger callback + print(i.." is a function") + res = awards.onDig[i](player,data) + elseif type(awards.onDig[i]) == "table" then + -- Handle table trigger + print(i.." is a table") + if not awards.onDig[i].node or not awards.onDig[i].target or not awards.onDig[i].award then + -- table running failed! + print("onDig trigger "..i.." is invalid!") + else + -- run the table + local tnodedug = string.split(awards.onDig[i].node, ":") + local tmod=tnodedug[1] + local titem=tnodedug[2] + if tmod==nil or titem==nil or not data.count[tmod] or not data.count[tmod][titem] then -- table running failed! - else - -- run the table - local tnodedug = string.split(awards.onDig[i]['node'], ":") - - local tmod=tnodedug[1] - local titem=tnodedug[2] - - if tmod==nil or titem==nil or not data['count'][tmod] or not data['count'][tmod][titem] then - -- table running failed! - elseif data['count'][tmod][titem] > awards.onDig[i]['target']-1 then - res=awards.onDig[i]['award'] - end + elseif data.count[tmod][titem] > awards.onDig[i].target-1 then + res=awards.onDig[i].award end end + end - if res~=nil then - awards.give_achievement(playern,res) - end + if res then + awards.give_achievement(playern,res) end end end) -minetest.register_on_placenode(function(pos, newnode, placer) - local nodedug = string.split(newnode.name, ":") - +minetest.register_on_placenode(function(pos,node,digger) + if not digger or not pos or not node or not digger:get_player_name() or digger:get_player_name()=="" then + return + end + local nodedug = string.split(node.name, ":") + if #nodedug ~= 2 then + print(oldnode.name.." is in wrong format!") + return + end local mod=nodedug[1] local item=nodedug[2] + local playern = digger:get_player_name() - local playern = placer:get_player_name() + -- Run checks + if (not playern or not nodedug or not mod or not item) then + return + end + awards.tbv(player_data, playern ) + awards.tbv(player_data[playern], "place" ) + awards.tbv(player_data[playern], "name", playern ) + awards.tbv(player_data[playern].place, mod) + awards.tbv(player_data[playern].place[mod], item, 0 ) - if (playern~=nil and nodedug~=nil and mod~=nil and item~=nil) then - --check the player's directory - if not player_data[playern] then - player_data[playern]={} - player_data[playern].place=playern - end - if not player_data[playern].place then - player_data[playern]['place']={} - end + -- Increment counder + player_data[playern].place[mod][item] = player_data[playern].place[mod][item]+1 + print(" - "..mod..":"..item.." 's count is now "..(player_data[playern].place[mod][item])) - --check player.count.mod - if not player_data[playern].place[mod] then - player_data[playern].place[mod]={} - end - - --check player.count.mod.item - if not player_data[playern].place[mod][item] then - player_data[playern].place[mod][item]=0 - end - - player_data[playern].place[mod][item]=player_data[playern].place[mod][item]+1 - - print(" - "..mod..":"..item.." 's place is now "..(player_data[playern].place[mod][item])) - - -- Roll through the onDig functions - local player=placer - local data=player_data[playern] - - for i=1,# awards.onPlace do - local res=nil - - if type(awards.onPlace[i]) == "function" then - -- run the function - print(i.." is a function") - res=awards.onPlace[i](player,data) - elseif type(awards.onPlace[i]) == "table" then - -- handle table here - print(i.." is a table") - if not awards.onPlace[i]['node'] or not awards.onPlace[i].target or not awards.onPlace[i].award then + -- Run callbacks and triggers + local player = digger + local data = player_data[playern] + for i=1,# awards.onPlace do + local res = nil + if type(awards.onPlace[i]) == "function" then + -- Run trigger callback + print(i.." is a function") + res = awards.onPlace[i](player,data) + elseif type(awards.onPlace[i]) == "table" then + -- Handle table trigger + print(i.." is a table") + if not awards.onPlace[i].node or not awards.onPlace[i].target or not awards.onPlace[i].award then + -- table running failed! + print("onPlace trigger "..i.." is invalid!") + else + -- run the table + local tnodedug = string.split(awards.onPlace[i].node, ":") + local tmod = tnodedug[1] + local titem = tnodedug[2] + if tmod==nil or titem==nil or not data.place[tmod] or not data.place[tmod][titem] then -- table running failed! - else - -- run the table - local tnodedug = string.split(awards.onPlace[i]['node'], ":") - - local tmod=tnodedug[1] - local titem=tnodedug[2] - - if tmod==nil or titem==nil or not data.place[tmod] or not data.place[tmod][titem] then - -- table running failed! - elseif data['place'][tmod][titem] > awards.onPlace[i]['target']-1 then - res=awards.onPlace[i]['award'] - end + elseif data.place[tmod][titem] > awards.onPlace[i].target-1 then + res = awards.onPlace[i].award end end + end - if res~=nil then - awards.give_achievement(playern,res) - end + if res then + awards.give_achievement(playern,res) end end end) minetest.register_on_dieplayer(function(player) - player_data[player:get_player_name()]['deaths']=player_data[player:get_player_name()]['deaths']+1 + -- Run checks + if not player or not player:get_player_name() or player:get_player_name()=="" then + return + end + awards.tbv(player_data, playern ) + awards.tbv(player_data[playern], "name", playern ) + awards.tbv(player_data[playern], "deaths", 0 ) + + -- Increment counter + player_data[player:get_player_name()].deaths = player_data[player:get_player_name()].deaths + 1 - -- Set up the variables + -- Run callbacks and triggers local playern=player:get_player_name() local data=player_data[playern] - - -- Roll through the onDeath functions for i=1,# awards.onDeath do local res=nil if type(awards.onDeath[i]) == "function" then - -- run the function + -- Run trigger callback print(i.." is a function") res=awards.onDeath[i](player,data) elseif type(awards.onDeath[i]) == "table" then -- handle table here print(i.." is a table") - if not awards.onDeath[i]['target'] or not awards.onDeath[i]['award'] then + if not awards.onDeath[i].target or not awards.onDeath[i].award then -- table running failed! + print("onDeath trigger "..i.." is invalid!") else -- run the table - - if not data['deaths'] then + if not data.deaths then -- table running failed! - elseif data['deaths'] > awards.onDeath[i]['target']-1 then - res=awards.onDeath[i]['award'] + elseif data.deaths > awards.onDeath[i].target-1 then + res=awards.onDeath[i].award end end end @@ -190,17 +179,12 @@ minetest.register_on_dieplayer(function(player) end) minetest.register_on_newplayer(function(player) - --Player data root - player_data[player:get_player_name()]={} - player_data[player:get_player_name()]['name']=player:get_player_name() - player_data[player:get_player_name()]['deaths']=0 - - --The player counter - player_data[player:get_player_name()]['count']={} - player_data[player:get_player_name()]['place']={} - - --Table to contain achievement records - player_data[player:get_player_name()]['unlocked']={} + awards.tbv(player_data, player:get_player_name()) + awards.tbv(player_data[playern], "name", player:get_player_name()) + awards.tbv(player_data[playern], "unlocked") + awards.tbv(player_data[playern], "place") + awards.tbv(player_data[playern], "count") + awards.tbv(player_data[playern], "deaths", 0) end) minetest.register_on_shutdown(function()