diff options
| author | rubenwardy <rw@rubenwardy.com> | 2018-04-04 17:23:46 +0100 | 
|---|---|---|
| committer | rubenwardy <rw@rubenwardy.com> | 2018-04-04 17:23:46 +0100 | 
| commit | eeee4a8398a487c0d2f51b14c36ddb7b0cbbe4ac (patch) | |
| tree | ad0db2abde53e7103351f8d008e3a100cf828b36 | |
| parent | ef19940edc20791d2342b7b68b7bb098a0abc2db (diff) | |
Clean up player data validation
| -rw-r--r-- | api.lua | 60 | ||||
| -rw-r--r-- | api_helpers.lua | 42 | ||||
| -rw-r--r-- | readme.md | 4 | 
3 files changed, 22 insertions, 84 deletions
@@ -95,11 +95,9 @@ local function run_trigger_callbacks(self, player, data, table_func)  end  function awards.register_trigger(tname, tdef) -	if type(tdef) == "function" then -		tdef = { -			on_register = tdef -		} -	end +	assert(type(tdef) == "table", +			"Passing a callback to register_trigger is not supported in 3.0") +  	tdef.name = tname  	tdef.run_callbacks = run_trigger_callbacks @@ -139,7 +137,7 @@ function awards.register_trigger(tname, tdef)  			print(dump(data))  			-- Increment counter -			local currentVal = data[datakey] + 1 +			local currentVal = (data[datakey] or 0) + 1  			data[datakey] = currentVal  			tdef:run_callbacks(player, data, function(entry) @@ -179,22 +177,6 @@ function awards.get_total_keyed_count(data, field)  	return data[field].__total or 0  end -function awards.get_total_item_count(data, field) -	local i = 0 -	if data and field then -		awards.assertPlayer(data) -		awards.tbv(data, field) -		for mod,_ in pairs(data[field]) do -			awards.tbv(data[field], mod) -			for item,_ in pairs(data[field][mod]) do -				awards.tbv(data[field][mod], item, 0) -				i = i + data[field][mod][item] -			end -		end -	end -	return i -end -  function awards.register_on_unlock(func)  	table.insert(awards.on_unlock, func)  end @@ -245,23 +227,12 @@ end  -- award - the name of the award to give  function awards.unlock(name, award)  	-- Access Player Data -	local data  = awards.players[name] +	local data  = awards.player(name)  	local awdef = awards.def[award] +	assert(awdef, "Unable to unlock an award which doesn't exist!") -	-- Perform checks -	if not data then -		return -	end -	if not awdef then -		return -	end -	if data.disabled then -		return -	end -	awards.tbv(data,"unlocked") - -	-- Don't give the achievement if it has already been given -	if data.unlocked[award] and data.unlocked[award] == award then +	if data.disabled or +			(data.unlocked[award] and data.unlocked[award] == award) then  		return  	end @@ -307,10 +278,10 @@ function awards.unlock(name, award)  	-- Do Notification  	if sound then  		-- Enforce sound delay to prevent sound spamming -		local lastsound = awards.players[name].lastsound +		local lastsound = awards.player(name).lastsound  		if lastsound == nil or os.difftime(os.time(), lastsound) >= 1 then  			minetest.sound_play(sound, {to_player=name}) -			awards.players[name].lastsound = os.time() +			awards.player(name).lastsound = os.time()  		end  	end @@ -395,7 +366,7 @@ awards.give_achievement = awards.unlock  function awards.getFormspec(name, to, sid)  	local formspec = ""  	local listofawards = awards._order_awards(name) -	local playerdata = awards.players[name] +	local playerdata = awards.player(name)  	if #listofawards == 0 then  		formspec = formspec .. "label[3.9,1.5;"..minetest.formspec_escape(S("Error: No awards available.")).."]" @@ -497,13 +468,13 @@ function awards.show_to(name, to, sid, text)  		if #listofawards == 0 then  			minetest.chat_send_player(to, S("Error: No awards available."))  			return -		elseif not awards.players[name] or not awards.players[name].unlocked  then +		elseif not awards.player(name) or not awards.player(name).unlocked  then  			minetest.chat_send_player(to, S("You have not unlocked any awards."))  			return  		end  		minetest.chat_send_player(to, string.format(S("%s’s awards:"), name)) -		for _, str in pairs(awards.players[name].unlocked) do +		for _, str in pairs(awards.player(name).unlocked) do  			local def = awards.def[str]  			if def then  				if def.title then @@ -553,11 +524,6 @@ end)  awards.load() -minetest.register_on_newplayer(function(player) -	local playern = player:get_player_name() -	awards.assertPlayer(playern) -end) -  minetest.register_on_shutdown(function()  	awards.save()  end) diff --git a/api_helpers.lua b/api_helpers.lua index 88aebd4..6e4c514 100644 --- a/api_helpers.lua +++ b/api_helpers.lua @@ -1,40 +1,12 @@ -function awards.tbv(tb,value,default) -	if not default then -		default = {} -	end -	if not tb or type(tb) ~= "table" then -		if not value then -			value = "[NULL]" -		end -		minetest.log("error", "awards.tbv - table "..dump(value).." is null, or not a table! Dump: "..dump(tb)) -		return -	end -	if not value then -		error("[ERROR] awards.tbv was not used correctly!\n".. -			"Value: '"..dump(value).."'\n".. -			"Dump:"..dump(tb)) -		return -	end -	if not tb[value] then -		tb[value] = default -	end -end - -function awards.assertPlayer(playern) -	awards.tbv(awards.players, playern) -	awards.tbv(awards.players[playern], "name", playern) -	awards.tbv(awards.players[playern], "unlocked") -	awards.tbv(awards.players[playern], "place") -	awards.tbv(awards.players[playern], "count") -	awards.tbv(awards.players[playern], "craft") -	awards.tbv(awards.players[playern], "eat") -	awards.tbv(awards.players[playern], "deaths", 0) -	awards.tbv(awards.players[playern], "joins", 0) -	awards.tbv(awards.players[playern], "chats", 0) +function awards.player(name) +	local data = awards.players[name] or {} +	awards.players[name] = data +	data.name = data.name or name +	data.unlocked = data.unlocked or {} +	return data  end -function awards.player(name) -	awards.assertPlayer(name) +function awards.player_or_nil(name)  	return awards.players[name]  end @@ -42,7 +42,7 @@ old fork in Carbone, under same license.  * awards.run_trigger_callbacks(player, data, trigger, table_func(entry))  	* Goes through and checks all triggers registered to a trigger type,  	  unlocking the award if conditions are met. -	* data is the player's award data, ie: awards.players[player_name] +	* data is the player's award data, ie: awards.player(player_name)  	* trigger is the name of the trigger type. Ie: awards.on[trigger]  	* table_func is called if the trigger is a table - simply return an  	  award name to unlock it @@ -51,7 +51,7 @@ old fork in Carbone, under same license.  	* add to an item's statistic count  	* for example, (data, "place", "default:stone") will add 1 to the number of  	  times default:stone has been placed. -	* data is the player's award data, ie: awards.players[player_name] +	* data is the player's award data, ie: awards.player(player_name)  	* returns true on success, false on failure (eg: cannot get modname and item from itemname)  * awards.register_on_unlock(func(name, def))  	* name is the player name  | 
