summaryrefslogtreecommitdiff
path: root/triggers.lua
blob: 64bb63e77aa1eae98db3608a6abe9b4b7b053ec1 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
--	AWARDS
--		by Rubenwardy, CC-BY-SA
-------------------------------------------------------
-- this is the trigger handler file for the awards mod
-------------------------------------------------------

-- Function and table holders for Triggers
awards.onDig = {}
awards.onPlace = {}
awards.onTick = {}
awards.onDeath = {}

-- Trigger Handles
minetest.register_on_dignode(function(pos, oldnode, digger)
	if not digger or not pos or not oldnode then
		return
	end
	local nodedug = string.split(oldnode.name, ":")
	if #nodedug ~= 2 then
		minetest.log("error","Awards mod: "..oldnode.name.." is in wrong format!")
		return
	end
	local mod = nodedug[1]
	local item = nodedug[2]
	local playern = digger:get_player_name()

	if (not playern or not nodedug or not mod or not item) then
		return
	end
	awards.assertPlayer(playern)
	awards.tbv(awards.players[playern].count, mod)
	awards.tbv(awards.players[playern].count[mod], item, 0)

	-- Increment counter
	awards.players[playern].count[mod][item]=awards.players[playern].count[mod][item]+1

	-- Run callbacks and triggers
	local player=digger
	local data=awards.players[playern]
	for i=1,# awards.onDig do
		local res = nil
		if type(awards.onDig[i]) == "function" then
			-- Run trigger callback
			res = awards.onDig[i](player,data)
		elseif type(awards.onDig[i]) == "table" then
			-- Handle table trigger
			if not awards.onDig[i].node or not awards.onDig[i].target or not awards.onDig[i].award then
				-- table running failed!
				print("[ERROR] awards - onDig trigger "..i.." is invalid!")
			else
				-- run the table
				local tnodedug = string.split(awards.onDig[i].node, ":")
				local tmod=tnodedug[1]
				local titem=tnodedug[2]
				if tmod==nil or titem==nil or not data.count[tmod] or not data.count[tmod][titem] then
					-- table running failed!
				elseif data.count[tmod][titem] > awards.onDig[i].target-1 then
					res=awards.onDig[i].award
				end
			end
		end

		if res then
			awards.give_achievement(playern,res)
		end
	end
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
	end
	local nodedug = string.split(node.name, ":")
	if #nodedug ~= 2 then
		minetest.log("error","Awards mod: "..node.name.." is in wrong format!")
		return
	end
	local mod=nodedug[1]
	local item=nodedug[2]
	local playern = digger:get_player_name()

	-- Run checks
	if (not playern or not nodedug or not mod or not item) then
		return
	end
	awards.assertPlayer(playern)
	awards.tbv(awards.players[playern].place, mod)
	awards.tbv(awards.players[playern].place[mod], item, 0)

	-- Increment counter
	awards.players[playern].place[mod][item] = awards.players[playern].place[mod][item]+1

	-- Run callbacks and triggers
	local player = digger
	local data = awards.players[playern]
	for i=1,# awards.onPlace do
		local res = nil
		if type(awards.onPlace[i]) == "function" then
			-- Run trigger callback
			res = awards.onPlace[i](player,data)
		elseif type(awards.onPlace[i]) == "table" then
			-- Handle table trigger
			if not awards.onPlace[i].node or not awards.onPlace[i].target or not awards.onPlace[i].award then
				print("[ERROR] awards - onPlace trigger "..i.." is invalid!")
			else
				-- run the table
				local tnodedug = string.split(awards.onPlace[i].node, ":")
				local tmod = tnodedug[1]
				local titem = tnodedug[2]
				if tmod==nil or titem==nil or not data.place[tmod] or not data.place[tmod][titem] then
					-- table running failed!
				elseif data.place[tmod][titem] > awards.onPlace[i].target-1 then
					res = awards.onPlace[i].award
				end
			end
		end

		if res then
			awards.give_achievement(playern,res)
		end
	end
end)

minetest.register_on_dieplayer(function(player)
	-- Run checks
	if not player or not player:get_player_name() or player:get_player_name()=="" then
		return
	end
	local playern = player:get_player_name()
	awards.assertPlayer(playern)


	-- Increment counter
	awards.players[player:get_player_name()].deaths = awards.players[player:get_player_name()].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
				end
			end
		end

		if res~=nil then
			awards.give_achievement(playern,res)
		end
	end
end)

minetest.register_on_newplayer(function(player)
	local playern = player:get_player_name()
	awards.assertPlayer(playern)
end)

minetest.register_on_shutdown(function()
	awards.save()
end)