summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--api.lua26
-rw-r--r--description.txt1
-rw-r--r--mod.conf3
-rw-r--r--triggers.lua167
4 files changed, 83 insertions, 114 deletions
diff --git a/api.lua b/api.lua
index bae9b9e..6230814 100644
--- a/api.lua
+++ b/api.lua
@@ -54,6 +54,32 @@ function awards.register_trigger(name, tfunc)
end
end
+-- Registers a trigger which replies on counting
+function awards.register_trigger_counted(tname, tfunc)
+ awards.register_trigger(tname, tfunc)
+
+ local key = tname .. "s"
+
+ awards["notify_" .. tname] = function(player)
+ assert(player and player.is_player and player:is_player())
+ local name = player:get_player_name()
+
+ awards.assertPlayer(name)
+ local data = awards.players[name]
+
+ -- Increment counter
+ data[key] = data[key] + 1
+ local currentVal = data[key]
+
+ awards.run_trigger_callbacks(player, data, tname, function(entry)
+ if entry.target and entry.award and currentVal and
+ currentVal >= entry.target then
+ return entry.award
+ end
+ end)
+ end
+end
+
function awards.run_trigger_callbacks(player, data, trigger, table_func)
for i = 1, #awards.on[trigger] do
local res = nil
diff --git a/description.txt b/description.txt
deleted file mode 100644
index f2b9944..0000000
--- a/description.txt
+++ /dev/null
@@ -1 +0,0 @@
-Adds achievements to Minetest, and an API to register new ones.
diff --git a/mod.conf b/mod.conf
index 24042f2..9de4e0a 100644
--- a/mod.conf
+++ b/mod.conf
@@ -2,6 +2,7 @@ name = awards
title = Achievements
author = rubenwardy
description = Adds achievements to Minetest, and an API to register new ones.
-license = LGPL 2.1 or later
+optional_depends = intllib,sfinv,unified_inventory,default,stairs,farming,dye,beds,wool,vessels,moreblocks,fire,flowers
+license = LGPLv2.1+
forum = https://forum.minetest.net/viewtopic.php?t=4870
version = 2.3.0
diff --git a/triggers.lua b/triggers.lua
index ac3afc8..7d028ee 100644
--- a/triggers.lua
+++ b/triggers.lua
@@ -118,63 +118,6 @@ awards.register_trigger("eat", function(def)
end
end)
-awards.register_trigger("death", function(def)
- local tmp = {
- award = def.name,
- target = def.trigger.target,
- }
- table.insert(awards.on.death, tmp)
- def.getProgress = function(self, data)
- local itemcount = data.deaths or 0
- return {
- perc = itemcount / tmp.target,
- label = S("@1/@2 deaths", itemcount, tmp.target),
- }
- end
- def.getDefaultDescription = function(self)
- local n = self.trigger.target
- return NS("Die.", "Die @1 times.", n, n)
- end
-end)
-
-awards.register_trigger("chat", function(def)
- local tmp = {
- award = def.name,
- target = def.trigger.target,
- }
- table.insert(awards.on.chat, tmp)
- def.getProgress = function(self, data)
- local itemcount = data.chats or 0
- return {
- perc = itemcount / tmp.target,
- label = S("@1/@2 chat messages", itemcount, tmp.target),
- }
- end
- def.getDefaultDescription = function(self)
- local n = self.trigger.target
- return NS("Write something in chat.", "Write @1 chat messages.", n, n)
- end
-end)
-
-awards.register_trigger("join", function(def)
- local tmp = {
- award = def.name,
- target = def.trigger.target,
- }
- table.insert(awards.on.join, tmp)
- def.getProgress = function(self, data)
- local itemcount = data.joins or 0
- return {
- perc = itemcount / tmp.target,
- label = S("@1/@2 game joins", itemcount, tmp.target),
- }
- end
- def.getDefaultDescription = function(self)
- local n = self.trigger.target
- return NS("Join the game.", "Join the game @1 times.", n, n)
- end
-end)
-
awards.register_trigger("craft", function(def)
local tmp = {
award = def.name,
@@ -326,69 +269,69 @@ minetest.register_on_craft(function(itemstack, player, old_craft_grid, craft_inv
end)
end)
-minetest.register_on_dieplayer(function(player)
- -- Run checks
- local name = player:get_player_name()
- if not player or not name or name=="" then
- return
+awards.register_trigger_counted("death", function(def)
+ local tmp = {
+ award = def.name,
+ target = def.trigger.target,
+ }
+ table.insert(awards.on.death, tmp)
+ def.getProgress = function(self, data)
+ local itemcount = data.deaths or 0
+ return {
+ perc = itemcount / tmp.target,
+ label = S("@1/@2 deaths", itemcount, tmp.target),
+ }
+ end
+ def.getDefaultDescription = function(self)
+ local n = self.trigger.target
+ return NS("Die.", "Die @1 times.", n, n)
end
-
- -- Get player
- awards.assertPlayer(name)
- local data = awards.players[name]
-
- -- Increment counter
- data.deaths = data.deaths + 1
-
- awards.run_trigger_callbacks(player, data, "death", function(entry)
- if entry.target and entry.award and data.deaths and
- data.deaths >= entry.target then
- return entry.award
- end
- end)
end)
+minetest.register_on_dieplayer(awards.notify_death)
-minetest.register_on_joinplayer(function(player)
- -- Run checks
- local name = player:get_player_name()
- if not player or not name or name=="" then
- return
+awards.register_trigger_counted("chat", function(def)
+ local tmp = {
+ award = def.name,
+ target = def.trigger.target,
+ }
+ table.insert(awards.on.chat, tmp)
+ def.getProgress = function(self, data)
+ local itemcount = data.chats or 0
+ return {
+ perc = itemcount / tmp.target,
+ label = S("@1/@2 chat messages", itemcount, tmp.target),
+ }
+ end
+ def.getDefaultDescription = function(self)
+ local n = self.trigger.target
+ return NS("Write something in chat.", "Write @1 chat messages.", n, n)
end
-
- -- Get player
- awards.assertPlayer(name)
- local data = awards.players[name]
-
- -- Increment counter
- data.joins = data.joins + 1
-
- awards.run_trigger_callbacks(player, data, "join", function(entry)
- if entry.target and entry.award and data.joins and
- data.joins >= entry.target then
- return entry.award
- end
- end)
end)
-
minetest.register_on_chat_message(function(name, message)
- -- Run checks
- local idx = string.find(message,"/")
- if not name or (idx ~= nil and idx <= 1) then
+ local player = minetest.get_player_by_name(name)
+ if not player or string.find(message, "/") then
return
end
- -- Get player
- awards.assertPlayer(name)
- local data = awards.players[name]
- local player = minetest.get_player_by_name(name)
-
- -- Increment counter
- data.chats = data.chats + 1
+ awards.notify_chat(player)
+end)
- awards.run_trigger_callbacks(player, data, "chat", function(entry)
- if entry.target and entry.award and data.chats and
- data.chats >= entry.target then
- return entry.award
- end
- end)
+awards.register_trigger_counted("join", function(def)
+ local tmp = {
+ award = def.name,
+ target = def.trigger.target,
+ }
+ table.insert(awards.on.join, tmp)
+ def.getProgress = function(self, data)
+ local itemcount = data.joins or 0
+ return {
+ perc = itemcount / tmp.target,
+ label = S("@1/@2 game joins", itemcount, tmp.target),
+ }
+ end
+ def.getDefaultDescription = function(self)
+ local n = self.trigger.target
+ return NS("Join the game.", "Join the game @1 times.", n, n)
+ end
end)
+minetest.register_on_joinplayer(awards.notify_join)