summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--api.lua13
-rw-r--r--readme.md8
-rw-r--r--triggers.lua55
3 files changed, 75 insertions, 1 deletions
diff --git a/api.lua b/api.lua
index e201cb5..ea3c86e 100644
--- a/api.lua
+++ b/api.lua
@@ -65,6 +65,7 @@ function awards.assertPlayer(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], "deaths", 0)
awards.tbv(awards.players[playern], "joins", 0)
awards.tbv(awards.players[playern], "chats", 0)
@@ -117,6 +118,13 @@ function awards.register_achievement(name,data_table)
target = data_table.trigger.target,
}
table.insert(awards.onPlace,tmp)
+ elseif data_table.trigger.type == "craft" then
+ local tmp = {
+ award = name,
+ item = data_table.trigger.item,
+ target = data_table.trigger.target,
+ }
+ table.insert(awards.onCraft,tmp)
elseif data_table.trigger.type == "death" then
local tmp = {
award = name,
@@ -181,6 +189,11 @@ function awards.register_onJoin(func)
table.insert(awards.onJoin,func)
end
+-- run a function when an item is crafted
+function awards.register_onCraft(func)
+ table.insert(awards.onCraft,func)
+end
+
-- This function is called whenever a target condition is met.
-- It checks if a player already has that achievement, and if they do not,
-- it gives it to them
diff --git a/readme.md b/readme.md
index e8cf8a2..1605915 100644
--- a/readme.md
+++ b/readme.md
@@ -20,8 +20,9 @@ The API
* sound [optional]
* image [optional]
* trigger [optional] [table]
- * type - "dig", "place", "death", "chat" or "join"
+ * 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
* secret [optional] - if true, then player needs to unlock to find out what it is.
* awards.give_achievement(name,award)
@@ -36,6 +37,8 @@ The API
* -- return award name or null
* awards.register_onJoin(func(player,data))
* -- return award name or null
+* awards.register_onCraft(func(player,data))
+ * -- return award name or null
Player Data
@@ -50,6 +53,9 @@ A list of data referenced/hashed by the player's name.
* place [table] - place counter
* modname [table]
* itemname [int]
+ * craft [table] - craft counter
+ * modname [table]
+ * itemname [int]
* deaths
* chats
* joins
diff --git a/triggers.lua b/triggers.lua
index 213d5c1..f4fb994 100644
--- a/triggers.lua
+++ b/triggers.lua
@@ -7,6 +7,7 @@
-- Function and table holders for Triggers
awards.onDig = {}
awards.onPlace = {}
+awards.onCraft = {}
awards.onChat = {}
awards.onDeath = {}
awards.onJoin = {}
@@ -122,6 +123,60 @@ minetest.register_on_placenode(function(pos,node,digger)
end
end)
+minetest.register_on_craft(function(itemstack, player, old_craft_grid, craft_inv)
+ if not player or not itemstack then
+ return
+ end
+ local itemcrafted = string.split(itemstack:get_name(), ":")
+ if #itemcrafted ~= 2 then
+ --minetest.log("error","Awards mod: "..itemstack:get_name().." is in wrong format!")
+ return
+ end
+ local mod = itemcrafted[1]
+ local item = itemcrafted[2]
+ local playern = player:get_player_name()
+
+ if (not playern or not itemcrafted or not mod or not item) then
+ return
+ end
+ awards.assertPlayer(playern)
+ awards.tbv(awards.players[playern].craft, mod)
+ awards.tbv(awards.players[playern].craft[mod], item, 0)
+
+ -- Increment counter
+ awards.players[playern].craft[mod][item]=awards.players[playern].craft[mod][item] + 1
+
+ -- Run callbacks and triggers
+ local data=awards.players[playern]
+ for i=1,# awards.onCraft do
+ local res = nil
+ if type(awards.onCraft[i]) == "function" then
+ -- Run trigger callback
+ res = awards.onDig[i](player,data)
+ elseif type(awards.onCraft[i]) == "table" then
+ -- Handle table trigger
+ if not awards.onCraft[i].item or not awards.onCraft[i].target or not awards.onCraft[i].award then
+ -- table running failed!
+ print("[ERROR] awards - onCraft trigger "..i.." is invalid!")
+ else
+ -- run the table
+ local titemcrafted = string.split(awards.onCraft[i].item, ":")
+ local tmod=titemcrafted[1]
+ local titem=titemcrafted[2]
+ if tmod==nil or titem==nil or not data.craft[tmod] or not data.craft[tmod][titem] then
+ -- table running failed!
+ elseif data.craft[tmod][titem] > awards.onCraft[i].target-1 then
+ res=awards.onCraft[i].award
+ end
+ end
+ end
+
+ if res then
+ awards.give_achievement(playern,res)
+ end
+ end
+end)
+
minetest.register_on_dieplayer(function(player)
-- Run checks
local name = player:get_player_name()