diff options
| -rw-r--r-- | api.lua | 16 | ||||
| -rw-r--r-- | api_helpers.lua | 1 | ||||
| -rw-r--r-- | depends.txt | 1 | ||||
| -rw-r--r-- | init.lua | 105 | ||||
| -rw-r--r-- | locale/de.txt | 21 | ||||
| -rw-r--r-- | locale/template.txt | 17 | ||||
| -rw-r--r-- | readme.md | 31 | ||||
| -rw-r--r-- | textures/awards_house.png | bin | 0 -> 591 bytes | |||
| -rw-r--r-- | triggers.lua | 190 | 
9 files changed, 333 insertions, 49 deletions
@@ -115,6 +115,22 @@ function awards.get_item_count(data, field, itemname)  	end  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 diff --git a/api_helpers.lua b/api_helpers.lua index 06e1ee6..cd499ab 100644 --- a/api_helpers.lua +++ b/api_helpers.lua @@ -27,6 +27,7 @@ function awards.assertPlayer(playern)  	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) diff --git a/depends.txt b/depends.txt index 476fed5..c0de3af 100644 --- a/depends.txt +++ b/depends.txt @@ -10,3 +10,4 @@ wool?  vessels?  moreblocks?  fire? +flowers? @@ -684,6 +684,17 @@ if minetest.get_modpath("default") then  			target = 40  		}  	}) + +	awards.register_achievement("award_apples", { +		title = S("Yummy!"), +		description = S("Eat 80 apples."), +		icon = "default_apple.png", +		trigger = { +			type = "eat", +			item = "default:apple", +			target = 80 +		} +	})  end  if minetest.get_modpath("vessels") then @@ -743,6 +754,17 @@ if minetest.get_modpath("farming") then  		}  	}) +	awards.register_achievement("award_bread", { +		title = S("Baker"), +		description = S("Eat 10 loaves of bread."), +		icon = "farming_bread.png", +		trigger = { +			type = "eat", +			item = "farming:bread", +			target = 10 +		} +	}) +  end  if minetest.get_modpath("wool") and minetest.get_modpath("farming") then @@ -829,3 +851,86 @@ if minetest.get_modpath("dye") then  		}  	})  end + +if minetest.get_modpath("flowers") then +	awards.register_achievement("awards_brown_mushroom1", { +		title = S("Tasty Mushrooms"), +		description = S("Eat 3 brown mushrooms."), +		icon = "flowers_mushroom_brown.png^awards_level1.png", +		trigger = { +			type = "eat", +			item= "flowers:mushroom_brown", +			target = 3, +		} +	}) +	awards.register_achievement("awards_brown_mushroom2", { +		title = S("Mushroom Lover"), +		description = S("Eat 33 brown mushrooms."), +		icon = "flowers_mushroom_brown.png^awards_level2.png", +		trigger = { +			type = "eat", +			item= "flowers:mushroom_brown", +			target = 33, +		} +	}) +	awards.register_achievement("awards_brown_mushroom3", { +		title = S("Underground Mushroom Farmer"), +		description = S("Eat 333 brown mushrooms."), +		icon = "flowers_mushroom_brown.png^awards_level3.png", +		trigger = { +			type = "eat", +			item= "flowers:mushroom_brown", +			target = 333, +		} +	}) +end + +-- This ensures the following code is executed after all items have been registered +minetest.after(0, function() +	-- Check whether there is at least one node which can be built by the player +	local building_is_possible = false +	for _, def in pairs(minetest.registered_nodes) do +		if (def.description and def.pointable ~= false and not def.groups.not_in_creative_inventory) then +			building_is_possible = true +			break +		end +	end + +	-- The following awards require at least one node which can be built +	if not building_is_possible then +		return +	end + +	awards.register_achievement("awards_builder1", { +		title = S("Builder"), +		icon = "awards_house.png^awards_level1.png", +		trigger = { +			type = "place", +			target = 1000, +		}, +	}) +	awards.register_achievement("awards_builder2", { +		title = S("Constructor"), +		icon = "awards_house.png^awards_level2.png", +		trigger = { +			type = "place", +			target = 5000, +		}, +	}) +	awards.register_achievement("awards_builder3", { +		title = S("Architect"), +		icon = "awards_house.png^awards_level3.png", +		trigger = { +			type = "place", +			target = 10000, +		}, +	}) +	awards.register_achievement("awards_builder4", { +		title = S("Master Architect"), +		icon = "awards_house.png^awards_level4.png", +		trigger = { +			type = "place", +			target = 25000, +		}, +	}) +end) diff --git a/locale/de.txt b/locale/de.txt index 4d58454..6564eff 100644 --- a/locale/de.txt +++ b/locale/de.txt @@ -175,3 +175,24 @@ Join the game %d times. = Treten Sie dem Spiel %d mal bei.  Show details of an achievement = Details einer Auszeichnung anzeigen  OK = OK  Error: No awards available. = Fehler: Keine Auszeichnungen vorhanden. +Eat: %d×%s = Essen Sie: %d×%s +Eat: %s = Essen Sie: %s +%d/%d eaten = %d/%d gegessen +Yummy! = Lecker! +Baker = Bäcker +Eat 10 loaves of bread. = Essen Sie 10 Brote. +Eat 80 apples. = Essen Sie 80 Äpfel. +Tasty Mushrooms = Leckere Pilze +Mushroom Lover = Pilzfreund +Underground Mushroom Farmer = Unterirdischer Pilzbauer +Eat 3 brown mushrooms. = Essen Sie 3 braune Pilze. +Eat 33 brown mushrooms. = Essen Sie 33 braune Pilze. +Eat 333 brown mushrooms. = Essen Sie 333 braune Pilze. +Builder = Bauarbeiter +Constructor = Konstrukteur +Architect = Architekt +Master Architect = Meisterarchitekt +Place %d block(s). = Platzieren Sie %d Blöcke. +Dig %d block(s). = Bauen Sie %d Blöcke ab. +Eat %d item(s). = Essen Sie %d Dinge. +Craft %d item(s). = Fertigen Sie %d Gegenstände. diff --git a/locale/template.txt b/locale/template.txt index 12a2ed1..454f153 100644 --- a/locale/template.txt +++ b/locale/template.txt @@ -177,3 +177,20 @@ You’re a copper =  [c|clear|disable|enable] =  OK =  Error: No awards available. = +Eat: %d×%s = +Eat: %s = +%d/%d eaten = +Place %d block(s). = +Dig %d block(s). = +Eat %d item(s). = +Craft %d item(s). = +Yummy! = +Baker = +Eat 10 loaves of bread. = +Eat 80 apples. = +Tasty Mushrooms = +Mushroom Lover = +Underground Mushroom Farmer = +Eat 3 brown mushrooms. = +Eat 33 brown mushrooms. = +Eat 333 brown mushrooms. = @@ -18,10 +18,19 @@ old fork in Carbone, under same license.  	* image [optional] - texture name, eg: award_one.png  	* background [optional] - texture name, eg: award_one.png  	* trigger [optional] [table] -		* type - "dig", "place", "craft", "death", "chat" or "join" -		* (for dig/place type) node - the nodes name -		* (for craft type) item - the items name -		* (for all types) target - how many to dig / place +		* type - "dig", "place", "craft", "death", "chat", "join" or "eat" +		* dig type: Dig a node. +			* node: the dug node type. If nil, all dug nodes are counted +		* place type: Place a node. +			* node: the placed node type. If nil, all placed nodes are counted +		* eat type: Eat an item. +			* item: the eaten item type. If nil, all eaten items are counted +		* craft type: Craft something. +			* item: the crafted item type. If nil, all crafted items are counted +		* death type: Die. +		* chat type: Write a chat message. +		* join type: Join the server. +		* (for all types) target - how many times to dig/place/craft/etc.  		* See Triggers  	* secret [optional] - if true, then player needs to unlock to find out what it is.  	* on_unlock [optional] - func(name, def) @@ -101,6 +110,14 @@ Callbacks (register a function to be run)  		target = 100  	} +### eat + +	trigger = { +		type = "eat", +		item = "default:apple", +		target = 100 +	} +  ## Callbacks relating to triggers  * awards.register_on_dig(func(player, data)) @@ -109,6 +126,9 @@ Callbacks (register a function to be run)  * awards.register_on_place(func(player, data))  	* data is player data (see below)  	* return award name or null +* awards.register_on_eat(func(player, data)) +	* data is player data (see below) +	* return award name or null  * awards.register_on_death(func(player, data))  	* data is player data (see below)  	* return award name or null @@ -134,6 +154,9 @@ A list of data referenced/hashed by the player's name.  	* craft [table] - craft counter  		* modname [table]  			* itemname [int] +	* eat [table] - eat counter +		* modname [table] +			* itemname [int]  	* deaths  	* chats  	* joins diff --git a/textures/awards_house.png b/textures/awards_house.png Binary files differnew file mode 100644 index 0000000..e23e30d --- /dev/null +++ b/textures/awards_house.png diff --git a/triggers.lua b/triggers.lua index 108a5c5..88a952f 100644 --- a/triggers.lua +++ b/triggers.lua @@ -29,22 +29,30 @@ awards.register_trigger("dig", function(def)  	}  	table.insert(awards.on.dig, tmp)  	def.getProgress = function(self, data) -		local itemcount = awards.get_item_count(data, "count", tmp.node) or 0 +		local itemcount +		if tmp.node then +			itemcount = awards.get_item_count(data, "count", tmp.node) or 0 +		else +			itemcount = awards.get_total_item_count(data, "count") +		end  		return {  			perc = itemcount / tmp.target,  			label = string.format(S("%d/%d dug"), itemcount, tmp.target)  		}  	end  	def.getDefaultDescription = function(self) -		local nname = minetest.registered_nodes[self.trigger.node].description -		if nname == nil then -			nname = self.trigger.node -		end -		local ddesc -		if self.trigger.target ~= 1 then -			return string.format(S("Mine blocks: %d×%s"), self.trigger.target, nname) +		if self.trigger.node then +			local nname = minetest.registered_nodes[self.trigger.node].description +			if nname == nil then +				nname = self.trigger.node +			end +			if self.trigger.target ~= 1 then +				return string.format(S("Mine blocks: %d×%s"), self.trigger.target, nname) +			else +				return string.format(S("Mine a block: %s"), nname) +			end  		else -			return string.format(S("Mine a block: %s"), nname) +			return string.format(S("Mine %d block(s)."), self.trigger.target)  		end  	end  end) @@ -57,21 +65,66 @@ awards.register_trigger("place", function(def)  	}  	table.insert(awards.on.place, tmp)  	def.getProgress = function(self, data) -		local itemcount = awards.get_item_count(data, "place", tmp.node) or 0 +		local itemcount +		if tmp.node then +			itemcount = awards.get_item_count(data, "place", tmp.node) or 0 +		else +			itemcount = awards.get_total_item_count(data, "place") +		end  		return {  			perc = itemcount / tmp.target,  			label = string.format(S("%d/%d placed"), itemcount, tmp.target)  		}  	end  	def.getDefaultDescription = function(self) -		local nname = minetest.registered_nodes[self.trigger.node].description -		if nname == nil then -			nname = self.trigger.node +		if self.trigger.node then +			local nname = minetest.registered_nodes[self.trigger.node].description +			if nname == nil then +				nname = self.trigger.node +			end +			if self.trigger.target ~= 1 then +				return string.format(S("Place blocks: %d×%s"), self.trigger.target, nname) +			else +				return string.format(S("Place a block: %s"), nname) +			end +		else +			return string.format(S("Place %d block(s)."), self.trigger.target)  		end -		if self.trigger.target ~= 1 then -			return string.format(S("Place blocks: %d×%s"), self.trigger.target, nname) +	end +end) + +awards.register_trigger("eat", function(def) +	local tmp = { +		award  = def.name, +		item = def.trigger.item, +		target = def.trigger.target, +	} +	table.insert(awards.on.eat, tmp) +	def.getProgress = function(self, data) +		local itemcount +		if tmp.item then +			itemcount = awards.get_item_count(data, "eat", tmp.item) or 0 +		else +			itemcount = awards.get_total_item_count(data, "eat") +		end +		return { +			perc = itemcount / tmp.target, +			label = string.format(S("%d/%d eaten"), itemcount, tmp.target) +		} +	end +	def.getDefaultDescription = function(self) +		if self.trigger.item then +			local iname = minetest.registered_items[self.trigger.item].description +			if iname == nil then +				iname = self.trigger.iode +			end +			if self.trigger.target ~= 1 then +				return string.format(S("Eat: %d×%s"), self.trigger.target, iname) +			else +				return string.format(S("Eat: %s"), iname) +			end  		else -			return string.format(S("Place a block: %s"), nname) +			return string.format(S("Eat %d item(s)."), self.trigger.target)  		end  	end  end) @@ -150,21 +203,30 @@ awards.register_trigger("craft", function(def)  	}  	table.insert(awards.on.craft, tmp)  	def.getProgress = function(self, data) -		local itemcount = awards.get_item_count(data, "craft", tmp.item) or 0 +		local itemcount +		if tmp.item then +			itemcount = awards.get_item_count(data, "craft", tmp.item) or 0 +		else +			itemcount = awards.get_total_item_count(data, "craft") +		end  		return {  			perc = itemcount / tmp.target,  			label = string.format(S("%d/%d crafted"), itemcount, tmp.target)  		}  	end  	def.getDefaultDescription = function(self) -		local iname = minetest.registered_items[self.trigger.item].description -		if iname == nil then -			iname = self.trigger.item -		end -		if self.trigger.target ~= 1 then -			return string.format(S("Craft: %d×%s"), self.trigger.target, iname) +		if self.trigger.item then +			local iname = minetest.registered_items[self.trigger.item].description +			if iname == nil then +				iname = self.trigger.item +			end +			if self.trigger.target ~= 1 then +				return string.format(S("Craft: %d×%s"), self.trigger.target, iname) +			else +				return string.format(S("Craft: %s"), iname) +			end  		else -			return string.format(S("Craft: %s"), iname) +			return string.format(S("Craft %d item(s)."), self.trigger.target)  		end  	end  end) @@ -188,13 +250,17 @@ minetest.register_on_dignode(function(pos, oldnode, digger)  		return  	end  	awards.run_trigger_callbacks(digger, data, "dig", function(entry) -		if entry.node and entry.target then -			local tnodedug = string.split(entry.node, ":") -			local tmod = tnodedug[1] -			local titem = tnodedug[2] -			if not tmod or not titem or not data.count[tmod] or not data.count[tmod][titem] then -				-- table running failed! -			elseif data.count[tmod][titem] > entry.target-1 then +		if entry.target then +			if entry.node then +				local tnodedug = string.split(entry.node, ":") +				local tmod = tnodedug[1] +				local titem = tnodedug[2] +				if not tmod or not titem or not data.count[tmod] or not data.count[tmod][titem] then +					-- table running failed! +				elseif data.count[tmod][titem] > entry.target-1 then +					return entry.award +				end +			elseif awards.get_total_item_count(data, "count") > entry.target-1 then  				return entry.award  			end  		end @@ -211,13 +277,43 @@ minetest.register_on_placenode(function(pos, node, digger)  	end  	awards.run_trigger_callbacks(digger, data, "place", function(entry) -		if entry.node and entry.target then -			local tnodedug = string.split(entry.node, ":") -			local tmod = tnodedug[1] -			local titem = tnodedug[2] -			if not tmod or not titem or not data.place[tmod] or not data.place[tmod][titem] then -				-- table running failed! -			elseif data.place[tmod][titem] > entry.target-1 then +		if entry.target then +			if entry.node then +				local tnodedug = string.split(entry.node, ":") +				local tmod = tnodedug[1] +				local titem = tnodedug[2] +				if not tmod or not titem or not data.place[tmod] or not data.place[tmod][titem] then +					-- table running failed! +				elseif data.place[tmod][titem] > entry.target-1 then +					return entry.award +				end +			elseif awards.get_total_item_count(data, "place") > entry.target-1 then +				return entry.award +			end +		end +	end) +end) + +minetest.register_on_item_eat(function(hp_change, replace_with_item, itemstack, user, pointed_thing) +	if not user or not itemstack or not user:get_player_name() or user:get_player_name()=="" then +		return +	end +	local data = awards.players[user:get_player_name()] +	if not awards.increment_item_counter(data, "eat", itemstack:get_name()) then +		return +	end +	awards.run_trigger_callbacks(user, data, "eat", function(entry) +		if entry.target then +			if entry.item then +				local titemstring = string.split(entry.item, ":") +				local tmod = titemstring[1] +				local titem = titemstring[2] +				if not tmod or not titem or not data.eat[tmod] or not data.eat[tmod][titem] then +					-- table running failed! +				elseif data.eat[tmod][titem] > entry.target-1 then +					return entry.award +				end +			elseif awards.get_total_item_count(data, "eat") > entry.target-1 then  				return entry.award  			end  		end @@ -235,13 +331,17 @@ minetest.register_on_craft(function(itemstack, player, old_craft_grid, craft_inv  	end  	awards.run_trigger_callbacks(player, data, "craft", function(entry) -		if entry.item and entry.target then -			local titemcrafted = string.split(entry.item, ":") -			local tmod = titemcrafted[1] -			local titem = titemcrafted[2] -			if not tmod or not titem or not data.craft[tmod] or not data.craft[tmod][titem] then -				-- table running failed! -			elseif data.craft[tmod][titem] > entry.target-1 then +		if entry.target then +			if entry.item then +				local titemcrafted = string.split(entry.item, ":") +				local tmod = titemcrafted[1] +				local titem = titemcrafted[2] +				if not tmod or not titem or not data.craft[tmod] or not data.craft[tmod][titem] then +					-- table running failed! +				elseif data.craft[tmod][titem] > entry.target-1 then +					return entry.award +				end +			elseif awards.get_total_item_count(data, "craft") > entry.target-1 then  				return entry.award  			end  		end  | 
