forked from mtcontrib/awards
Implement conted_key trigger type
This commit is contained in:
parent
d82972b448
commit
28c59340ea
118
api.lua
118
api.lua
|
@ -52,45 +52,6 @@ function awards.player_or_nil(name)
|
|||
return awards.players[name]
|
||||
end
|
||||
|
||||
--
|
||||
-- local function make_on_reg_wrapper()
|
||||
-- return function(def)
|
||||
-- local tmp = {
|
||||
-- award = def.name,
|
||||
-- key = def.trigger.node,
|
||||
-- target = def.trigger.target,
|
||||
-- }
|
||||
-- table.insert(awards.on.dig, tmp)
|
||||
--
|
||||
-- function def:getProgress(data)
|
||||
-- local itemcount
|
||||
-- if tmp.key then
|
||||
-- itemcount = data["dig"][tmp.key] or 0
|
||||
-- else
|
||||
-- itemcount = awards.get_total_keyed_count(data, "dig")
|
||||
-- end
|
||||
-- return {
|
||||
-- perc = itemcount / tmp.target,
|
||||
-- label = S("@1/@2 dug", itemcount, tmp.target),
|
||||
-- }
|
||||
-- end
|
||||
--
|
||||
-- function def:getDefaultDescription()
|
||||
-- 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
|
||||
-- end
|
||||
|
||||
local function run_trigger_callbacks(self, player, data, table_func)
|
||||
for i = 1, #self.on do
|
||||
local res = nil
|
||||
|
@ -113,9 +74,10 @@ function awards.register_trigger(tname, tdef)
|
|||
|
||||
tdef.name = tname
|
||||
tdef.run_callbacks = run_trigger_callbacks
|
||||
local datakey = tname .. "s"
|
||||
tdef.data_key = datakey
|
||||
|
||||
if tdef.type == "counted" then
|
||||
local datakey = tname .. "s"
|
||||
local old_reg = tdef.on_register
|
||||
|
||||
function tdef:on_register(def)
|
||||
|
@ -162,6 +124,82 @@ function awards.register_trigger(tname, tdef)
|
|||
end
|
||||
|
||||
awards["notify_" .. tname] = tdef.notify
|
||||
|
||||
elseif tdef.type == "counted_key" then
|
||||
local old_reg = tdef.on_register
|
||||
function tdef:on_register(def)
|
||||
local tmp = {
|
||||
award = def.name,
|
||||
key = tdef:get_key(def),
|
||||
target = def.trigger.target,
|
||||
}
|
||||
tdef.register(tmp)
|
||||
|
||||
function def.getProgress(_, data)
|
||||
local done
|
||||
data[datakey] = data[datakey] or {}
|
||||
if tmp.key then
|
||||
done = data[datakey][tmp.key] or 0
|
||||
else
|
||||
done = data[datakey].__total or 0
|
||||
end
|
||||
return {
|
||||
perc = done / tmp.target,
|
||||
label = S(tdef.progress, done, tmp.target),
|
||||
}
|
||||
end
|
||||
|
||||
function def.getDefaultDescription(_)
|
||||
local n = self.trigger.target
|
||||
if tmp.key then
|
||||
local nname = tmp.key
|
||||
return NS(tdef.auto_description[1],
|
||||
tdef.auto_description[2], n, n, nname)
|
||||
else
|
||||
return NS(tdef.auto_description_total[1],
|
||||
tdef.auto_description_total[2], n, n)
|
||||
end
|
||||
end
|
||||
|
||||
if old_reg then
|
||||
return old_reg(tdef, def)
|
||||
end
|
||||
end
|
||||
|
||||
function tdef.notify(player, key, n)
|
||||
n = n or 1
|
||||
|
||||
assert(player and player.is_player and player:is_player() and key)
|
||||
local name = player:get_player_name()
|
||||
local data = awards.player(name)
|
||||
print(dump(data))
|
||||
|
||||
-- Increment counter
|
||||
data[datakey] = data[datakey] or {}
|
||||
local currentVal = (data[datakey][key] or 0) + n
|
||||
data[datakey][key] = currentVal
|
||||
data[datakey].__total = (data[datakey].__total or 0) + n
|
||||
|
||||
tdef:run_callbacks(player, data, function(entry)
|
||||
local current
|
||||
if entry.key == key then
|
||||
current = currentVal
|
||||
elseif entry.key == nil then
|
||||
current = data[datakey].__total
|
||||
else
|
||||
return
|
||||
end
|
||||
|
||||
if current > entry.target then
|
||||
return entry.award
|
||||
end
|
||||
end)
|
||||
end
|
||||
|
||||
awards["notify_" .. tname] = tdef.notify
|
||||
|
||||
elseif tdef.type and tdef.type ~= "custom" then
|
||||
error("Unrecognised trigger type " .. tdef.type)
|
||||
end
|
||||
|
||||
awards.registered_triggers[tname] = tdef
|
||||
|
|
3
init.lua
3
init.lua
|
@ -47,7 +47,8 @@ awards.register_achievement("award_saint_maclou",{
|
|||
description = "Place 20 coal checkers.",
|
||||
icon = "awards_novicebuilder.png",
|
||||
trigger = {
|
||||
type = "chat",
|
||||
type = "dig",
|
||||
node = "default:stone",
|
||||
target = 3,
|
||||
},
|
||||
})
|
||||
|
|
40
triggers.lua
40
triggers.lua
|
@ -42,26 +42,26 @@ awards.register_trigger("join", {
|
|||
})
|
||||
minetest.register_on_joinplayer(awards.notify_join)
|
||||
|
||||
--
|
||||
-- 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
|
||||
-- })
|
||||
--
|
||||
-- minetest.register_on_dignode(function(pos, oldnode, player)
|
||||
-- if not player or not pos or not oldnode then
|
||||
-- return
|
||||
-- end
|
||||
--
|
||||
-- local node_name = oldnode.name
|
||||
-- node_name = minetest.registered_aliases[node_name] or node_name
|
||||
-- awards.notify_dig(player, node_name)
|
||||
-- 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
|
||||
})
|
||||
|
||||
minetest.register_on_dignode(function(pos, oldnode, player)
|
||||
if not player or not pos or not oldnode then
|
||||
return
|
||||
end
|
||||
|
||||
local node_name = oldnode.name
|
||||
node_name = minetest.registered_aliases[node_name] or node_name
|
||||
awards.notify_dig(player, node_name)
|
||||
end)
|
||||
--
|
||||
-- awards.register_trigger("place", {
|
||||
-- type = "counted_key",
|
||||
|
|
Loading…
Reference in New Issue
Block a user