summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRubenwardy <anjayward@gmail.com>2013-11-06 18:33:01 +0000
committerRubenwardy <anjayward@gmail.com>2013-11-06 18:33:01 +0000
commit773f7993203ee0d953bf019fd5e0f818e7008241 (patch)
tree5238947cc5ce4a3482bbb4bd59d4b49b4c3a2490
parent076f91853cbbd8d33a26927d5c0caa7c9aa89289 (diff)
Restructure for bulletproof-ness
-rw-r--r--api.lua102
-rw-r--r--triggers.lua258
2 files changed, 185 insertions, 175 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
+ -- Perform checks
+ if not data then
+ return
+ end
+ if not awards.def[award] then
+ return
+ end
+ awards.tbv(data,"unlocked")
+
-- 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
+ if not data.unlocked[award] or data.unlocked[award]~=award then
+ -- Set award flag
+ data.unlocked[award]=award
- -- define local variables, so award data can be saved
+ -- 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
+
+ -- 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 )
+
+ -- 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]))
+
+ -- Run callbacks and triggers
+ local player=digger
+ local data=player_data[playern]
- --check player.count.mod
- if not player_data[playern].count[mod] then
- player_data[playern]['count'][mod]={}
- end
-
- --check player.count.mod.item
- if not player_data[playern]['count'][mod][item] then
- player_data[playern]['count'][mod][item]=0
- end
-
- 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]))
-
- -- 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()
-
- 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
-
- --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 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 )
+
+ -- 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]))
+
+ -- 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()