diff options
Diffstat (limited to 'triggers.lua')
-rw-r--r-- | triggers.lua | 431 |
1 files changed, 87 insertions, 344 deletions
diff --git a/triggers.lua b/triggers.lua index ac3afc8..6f39cf3 100644 --- a/triggers.lua +++ b/triggers.lua @@ -14,381 +14,124 @@ -- 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -- -local S, NS = awards.gettext, awards.ngettext -awards.register_trigger("dig", function(def) - local tmp = { - award = def.name, - node = def.trigger.node, - target = def.trigger.target, - } - table.insert(awards.on.dig, tmp) - def.getProgress = function(self, data) - 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 = S("@1/@2 dug", itemcount, tmp.target), - } - end - def.getDefaultDescription = function(self) - local n = self.trigger.target - if self.trigger.node then - local nname = minetest.registered_nodes[self.trigger.node].description - if nname == nil then - nname = self.trigger.node - end - -- Translators: @1 is count, @2 is description. - return NS("Mine: @2", "Mine: @1×@2", n, n, nname) - else - return NS("Mine @1 block.", "Mine @1 blocks.", n, n) - end - end -end) - -awards.register_trigger("place", function(def) - local tmp = { - award = def.name, - node = def.trigger.node, - target = def.trigger.target, - } - table.insert(awards.on.place, tmp) - def.getProgress = function(self, data) - 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 = S("@1/@2 placed", itemcount, tmp.target), - } - end - def.getDefaultDescription = function(self) - local n = self.trigger.target - if self.trigger.node then - local nname = minetest.registered_nodes[self.trigger.node].description - if nname == nil then - nname = self.trigger.node - end - -- Translators: @1 is count, @2 is description. - return NS("Place: @2", "Place: @1×@2", n, n, nname) - else - return NS("Place a block.", "Place @1 blocks.", n, n) - end +awards.register_trigger("chat", { + type = "counted", + progress = "@1/@2 chat messages", + auto_description = { "Send a chat message", "Chat @1 times" }, +}) +minetest.register_on_chat_message(function(name, message) + local player = minetest.get_player_by_name(name) + if not player or string.find(message, "/") then + return 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 = S("@1/@2 eaten", itemcount, tmp.target), - } - end - def.getDefaultDescription = function(self) - local n = self.trigger.target - if self.trigger.item then - local iname = minetest.registered_items[self.trigger.item].description - if iname == nil then - iname = self.trigger.iode - end - -- Translators: @1 is count, @2 is description. - return NS("Eat: @2", "Eat: @1×@2", n, n, iname) - else - return NS("Eat an item.", "Eat @1 items.", n, n) - end - end + awards.notify_chat(player) 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 +awards.register_trigger("join", { + type = "counted", + progress = "@1/@2 joins", + auto_description = { "Join once", "Join @1 times" }, +}) +minetest.register_on_joinplayer(awards.notify_join) + + +awards.register_trigger("death", { + type = "counted_key", + progress = "@1/@2 deaths", + auto_description = { "Die once of @2", "Die @1 times of @2" }, + auto_description_total = { "Die @1 times.", "Mine @1 times" }, + get_key = function(self, def) + return def.trigger.reason + end, +}) +minetest.register_on_dieplayer(function(player, reason) + if reason then + reason = reason.type + else + reason = "unknown" + end + awards.notify_death(player, reason) 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, - item = def.trigger.item, - target = def.trigger.target, - } - table.insert(awards.on.craft, tmp) - def.getProgress = function(self, data) - 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 = S("@1/@2 crafted", itemcount, tmp.target), - } - end - def.getDefaultDescription = function(self) - local n = self.trigger.target - if self.trigger.item then - local iname = minetest.registered_items[self.trigger.item].description - if iname == nil then - iname = self.trigger.item - end - -- Translators: @1 is count, @2 is description. - return NS("Craft: @2", "Craft: @1×@2", n, n, iname) - else - return NS("Craft an item.", "Craft @1 items.", n) - end +awards.register_trigger("dig", { + type = "counted_key", + progress = "@1/@2 dug", + auto_description = { "Mine: @2", "Mine: @1×@2" }, + auto_description_total = { "Mine @1 block.", "Mine @1 blocks." }, + get_key = function(self, def) + return minetest.registered_aliases[def.trigger.node] or def.trigger.node end -end) - --- Backwards compatibility -awards.register_onDig = awards.register_on_dig -awards.register_onPlace = awards.register_on_place -awards.register_onDeath = awards.register_on_death -awards.register_onChat = awards.register_on_chat -awards.register_onJoin = awards.register_on_join -awards.register_onCraft = awards.register_on_craft - --- Trigger Handles -minetest.register_on_dignode(function(pos, oldnode, digger) - if not digger or not pos or not oldnode then +}) +minetest.register_on_dignode(function(pos, node, player) + if not player or not pos or not node then return end - local data = awards.players[digger:get_player_name()] - if not awards.increment_item_counter(data, "count", oldnode.name) then - return - end - awards.run_trigger_callbacks(digger, data, "dig", function(entry) - if entry.target then - if entry.node then - local tnodedug = string.split(entry.node, ":") - local tmod = tnodedug[1] - local titem = tnodedug[2] - if not (not tmod or not titem or not data.count[tmod] or - not data.count[tmod][titem]) and - 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 - end) + local node_name = node.name + node_name = minetest.registered_aliases[node_name] or node_name + awards.notify_dig(player, node_name) end) -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 + +awards.register_trigger("place", { + type = "counted_key", + progress = "@1/@2 placed", + auto_description = { "Place: @2", "Place: @1×@2" }, + auto_description_total = { "Place @1 block.", "Place @1 blocks." }, + get_key = function(self, def) + return minetest.registered_aliases[def.trigger.node] or def.trigger.node end - local data = awards.players[digger:get_player_name()] - if not awards.increment_item_counter(data, "place", node.name) then +}) +minetest.register_on_placenode(function(pos, node, player) + if not player or not pos or not node then return end - awards.run_trigger_callbacks(digger, data, "place", function(entry) - if entry.target then - if entry.node then - local tnodedug = string.split(entry.node, ":") - local tmod = tnodedug[1] - local titem = tnodedug[2] - if not (not tmod or not titem or not data.place[tmod] or - not data.place[tmod][titem]) and - 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) + local node_name = node.name + node_name = minetest.registered_aliases[node_name] or node_name + awards.notify_place(player, node_name) 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 (not tmod or not titem or not data.eat[tmod] or - not data.eat[tmod][titem]) and - 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 - end) -end) -minetest.register_on_craft(function(itemstack, player, old_craft_grid, craft_inv) - if not player or not itemstack then - return +awards.register_trigger("craft", { + type = "counted_key", + progress = "@1/@2 crafted", + auto_description = { "Craft: @2", "Craft: @1×@2" }, + auto_description_total = { "Craft @1 item", "Craft @1 items." }, + get_key = function(self, def) + return minetest.registered_aliases[def.trigger.item] or def.trigger.item end - - local data = awards.players[player:get_player_name()] - if not awards.increment_item_counter(data, "craft", itemstack:get_name(), itemstack:get_count()) then +}) +minetest.register_on_craft(function(itemstack, player, old_craft_grid, craft_inv) + if not player or itemstack:empty() then return end - awards.run_trigger_callbacks(player, data, "craft", function(entry) - if entry.target then - if entry.item then - local titemcrafted = string.split(entry.item, ":") - local tmod = titemcrafted[1] - local titem = titemcrafted[2] - if not (not tmod or not titem or not data.craft[tmod] or - not data.craft[tmod][titem]) and - 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 - end) + local itemname = itemstack:get_name() + itemname = minetest.registered_aliases[itemname] or itemname + awards.notify_craft(player, itemname, itemstack:get_count()) 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 - 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_joinplayer(function(player) - -- Run checks - local name = player:get_player_name() - if not player or not name or name=="" then - return +awards.register_trigger("eat", { + type = "counted_key", + progress = "@1/@2 eaten", + auto_description = { "Eat @2", "Eat @1×@2" }, + auto_description_total = { "Eat @1 item", "Eat @1 items." }, + get_key = function(self, def) + return minetest.registered_aliases[def.trigger.item] or def.trigger.item 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 +}) +minetest.register_on_item_eat(function(_, _, itemstack, player, _) + if not player or itemstack:empty() 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.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) + local itemname = itemstack:get_name() + itemname = minetest.registered_aliases[itemname] or itemname + awards.notify_craft(player, itemname, itemstack:get_count()) end) |