summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorrubenwardy <anjayward@gmail.com>2014-05-02 19:01:41 +0100
committerrubenwardy <anjayward@gmail.com>2014-05-02 19:01:41 +0100
commit8adf859127a3cf3218811c3e6d9ff4b6a3aff1a8 (patch)
tree216da5193d79c7d7e66c719b6c53f5dc79a1f1e5
parent8180ab6755816e68e136357631d1a306aef01e4f (diff)
On chat trigger and code style
-rw-r--r--api.lua47
-rw-r--r--triggers.lua73
2 files changed, 78 insertions, 42 deletions
diff --git a/api.lua b/api.lua
index dcef787..b0bf068 100644
--- a/api.lua
+++ b/api.lua
@@ -43,7 +43,7 @@ function awards.tbv(tb,value,default)
if not value then
value = "[NULL]"
end
- minetest.log("error", "awards.tbv - table '"..value.."' is null, or not a table! Dump: "..dump(tb))
+ minetest.log("error", "awards.tbv - table "..dump(value).." is null, or not a table! Dump: "..dump(tb))
return
end
if not value then
@@ -74,26 +74,32 @@ dofile(minetest.get_modpath("awards").."/config.txt")
function awards.register_achievement(name,data_table)
-- see if a trigger is defined in the achievement definition
if data_table.trigger and data_table.trigger.type then
- if data_table.trigger.type=="dig" then
- local tmp={
- award=name,
- node=data_table.trigger.node,
- target=data_table.trigger.target,
+ if data_table.trigger.type == "dig" then
+ local tmp = {
+ award = name,
+ node = data_table.trigger.node,
+ target = data_table.trigger.target,
}
table.insert(awards.onDig,tmp)
- elseif data_table.trigger.type=="place" then
- local tmp={
- award=name,
- node=data_table.trigger.node,
- target=data_table.trigger.target,
+ elseif data_table.trigger.type == "place" then
+ local tmp = {
+ award = name,
+ node = data_table.trigger.node,
+ target = data_table.trigger.target,
}
table.insert(awards.onPlace,tmp)
- elseif data_table.trigger.type=="death" then
- local tmp={
- award=name,
- target=data_table.trigger.target,
+ elseif data_table.trigger.type == "death" then
+ local tmp = {
+ award = name,
+ target = data_table.trigger.target,
}
table.insert(awards.onDeath,tmp)
+ elseif data_table.trigger.type == "chat" then
+ local tmp = {
+ award = name,
+ target = data_table.trigger.target,
+ }
+ table.insert(awards.onChat,tmp)
end
end
@@ -113,21 +119,26 @@ function awards.register_achievement(name,data_table)
awards.def[name] = data_table
end
--- this function adds a trigger function or table to the ondig table
+-- run a function when a node is dug
function awards.register_onDig(func)
table.insert(awards.onDig,func)
end
--- this function adds a trigger function or table to the ondig table
+-- run a function when a node is placed
function awards.register_onPlace(func)
table.insert(awards.onPlace,func)
end
--- this function adds a trigger function or table to the ondeath table
+-- run a function when a player dies
function awards.register_onDeath(func)
table.insert(awards.onDeath,func)
end
+-- run a function when a player chats
+function awards.register_onChat(func)
+ table.insert(awards.onChat,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/triggers.lua b/triggers.lua
index 64bb63e..cdff4ae 100644
--- a/triggers.lua
+++ b/triggers.lua
@@ -8,6 +8,7 @@
awards.onDig = {}
awards.onPlace = {}
awards.onTick = {}
+awards.onChat = {}
awards.onDeath = {}
-- Trigger Handles
@@ -32,7 +33,7 @@ minetest.register_on_dignode(function(pos, oldnode, digger)
awards.tbv(awards.players[playern].count[mod], item, 0)
-- Increment counter
- awards.players[playern].count[mod][item]=awards.players[playern].count[mod][item]+1
+ awards.players[playern].count[mod][item]=awards.players[playern].count[mod][item] + 1
-- Run callbacks and triggers
local player=digger
@@ -88,7 +89,7 @@ minetest.register_on_placenode(function(pos,node,digger)
awards.tbv(awards.players[playern].place[mod], item, 0)
-- Increment counter
- awards.players[playern].place[mod][item] = awards.players[playern].place[mod][item]+1
+ awards.players[playern].place[mod][item] = awards.players[playern].place[mod][item] + 1
-- Run callbacks and triggers
local player = digger
@@ -126,37 +127,61 @@ minetest.register_on_dieplayer(function(player)
if not player or not player:get_player_name() or player:get_player_name()=="" then
return
end
- local playern = player:get_player_name()
+
+ -- Get player
+ local name = player:get_player_name()
awards.assertPlayer(playern)
-
+ local data = awards.players[name]
-- Increment counter
- awards.players[player:get_player_name()].deaths = awards.players[player:get_player_name()].deaths + 1
+ data.deaths = data.deaths + 1
-- Run callbacks and triggers
- local data=awards.players[playern]
- for i=1,# awards.onDeath do
- local res=nil
- if type(awards.onDeath[i]) == "function" then
- -- Run trigger callback
- res=awards.onDeath[i](player,data)
- elseif type(awards.onDeath[i]) == "table" then
- -- handle table here
- if not awards.onDeath[i].target or not awards.onDeath[i].award then
- -- table running failed!
- print("[ERROR] awards - onDeath trigger "..i.." is invalid!")
- else
- -- run the table
- if not data.deaths then
- -- table running failed!
- elseif data.deaths > awards.onDeath[i].target-1 then
- res=awards.onDeath[i].award
+ for _,trigger in pairs(awards.onDeath) do
+ local res = nil
+ if type(trigger) == "function" then
+ res = trigger(player,data)
+ elseif type(trigger) == "table" then
+ if trigger.target and trigger.award then
+ if data.deaths and data.deaths >= trigger.target then
+ res = trigger.award
end
end
end
+ if res ~= nil then
+ awards.give_achievement(name,res)
+ end
+ end
+end)
- if res~=nil then
- awards.give_achievement(playern,res)
+minetest.register_on_chat_message(function(name, message)
+ -- Run checks
+ if not name 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
+
+ -- Run callbacks and triggers
+ for _,trigger in pairs(awards.onChat) do
+ local res = nil
+ if type(trigger) == "function" then
+ res = trigger(player,data)
+ elseif type(trigger) == "table" then
+ if trigger.target and trigger.award then
+ if data.chats and data.chats >= trigger.target then
+ res = trigger.award
+ end
+ end
+ end
+ if res ~= nil then
+ awards.give_achievement(name,res)
end
end
end)