summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWuzzy <wuzzy2@mail.ru>2016-11-15 01:57:01 +0100
committerGitHub <noreply@github.com>2016-11-15 01:57:01 +0100
commit38c504e938e169e0337591b7ffe13863ff21250d (patch)
treee35f4fdc8eda2f3eb67f2ee7bf806bbe7304efff
parentab7206e15050b050257c7e45b804dc9b1352d41d (diff)
Add eat trigger, extend existing triggers, add 9 awards (#35)
* Add eat trigger and 2 new awards * Add mushroom eating awards * Add support for counting any eat/dig/craft/place * Update readme * Add 4 builder awards * Update German locale * Update dependencies * Fix mistake in German translation * Revert removal of background
-rw-r--r--api.lua16
-rw-r--r--api_helpers.lua1
-rw-r--r--depends.txt1
-rw-r--r--init.lua105
-rw-r--r--locale/de.txt21
-rw-r--r--locale/template.txt17
-rw-r--r--readme.md31
-rw-r--r--textures/awards_house.pngbin0 -> 591 bytes
-rw-r--r--triggers.lua190
9 files changed, 333 insertions, 49 deletions
diff --git a/api.lua b/api.lua
index 916441e..f53ee0d 100644
--- a/api.lua
+++ b/api.lua
@@ -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?
diff --git a/init.lua b/init.lua
index 805ce3c..e841603 100644
--- a/init.lua
+++ b/init.lua
@@ -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. =
diff --git a/readme.md b/readme.md
index db5fc41..8323513 100644
--- a/readme.md
+++ b/readme.md
@@ -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
new file mode 100644
index 0000000..e23e30d
--- /dev/null
+++ b/textures/awards_house.png
Binary files differ
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