From 8adf859127a3cf3218811c3e6d9ff4b6a3aff1a8 Mon Sep 17 00:00:00 2001 From: rubenwardy Date: Fri, 2 May 2014 19:01:41 +0100 Subject: [PATCH] On chat trigger and code style --- api.lua | 47 ++++++++++++++++++++------------- triggers.lua | 73 +++++++++++++++++++++++++++++++++++----------------- 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)