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
|
-- Table Save Load Functions
function save_playerD()
local file = io.open(minetest.get_worldpath().."/awards.txt", "w")
if file then
file:write(minetest.serialize(player_data))
file:close()
end
end
local function load_playerD()
local file = io.open(minetest.get_worldpath().."/awards.txt", "r")
if file then
local table = minetest.deserialize(file:read("*all"))
if type(table) == "table" then
return table
end
end
return {}
end
-- The global award namespace
awards={}
player_data=load_playerD()
-- A table of award definitions
awards.def={}
-- Load files
dofile(minetest.get_modpath("awards").."/triggers.lua")
dofile(minetest.get_modpath("awards").."/config.txt")
-- API Functions
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'],
}
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'],
}
table.insert(awards.onPlace,tmp)
elseif data_table['trigger']['type']=="death" then
local tmp={
award=name,
target=data_table['trigger']['target'],
}
table.insert(awards.onDeath,tmp)
end
end
-- check icon, background and custom_announce data
if data_table['icon'] == nil or data_table['icon'] == "" then
data_table['icon'] = "unknown.png"
end
if data_table['background'] == nil or data_table['background'] == "" then
data_table['background'] = "bg_default.png"
end
if data_table['custom_announce'] == nil or data_table['custom_announce'] == "" then
data_table['custom_announce'] = "Achievement Unlocked:"
end
-- add the achievement to the definition table
awards['def'][name] = data_table
end
-- this function adds a trigger function or table to the ondig table
function awards.register_onDig(func)
table.insert(awards.onDig,func);
end
-- this function adds a trigger function or table to the ondig table
function awards.register_onPlace(func)
table.insert(awards.onPlace,func);
end
-- this function adds a trigger function or table to the ondeath table
function awards.register_onDeath(func)
table.insert(awards.onDeath,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
----------------------------------------------
--awards.give_achievement(name,award)
-- name - the name of the player
-- award - the name of the award to give
function awards.give_achievement(name,award)
-- load the player's data table
local data=player_data[name]
-- check if the table that holds a player's achievements exists
if not data['unlocked'] then
data['unlocked']={}
end
-- check to see if the player does not already have that achievement
if not data['unlocked'][award] or data['unlocked'][award]~=award then
-- save the achievement to the player_data table
data['unlocked'][award]=award
-- define local variables, so award data can be saved
local title = award
local desc = ""
-- check definition table to get values
if awards['def'][award] and awards['def'][award]['title'] and awards['def'][award]['custom_announce'] and awards['def'][award]['background'] and awards['def'][award]['icon'] then
title=awards['def'][award]['title']
background=awards['def'][award]['background']
icon=awards['def'][award]['icon']
custom_announce=awards['def'][award]['custom_announce']
end
-- check definition table to get description
if awards['def'][award] and awards['def'][award]['description'] then
desc=awards['def'][award]['description']
end
-- send the won award message to the player
if Use_Formspec == true then
-- use a formspec to send it
minetest.show_formspec(name, "achievements:unlocked", "size[4,2]"..
"image_button_exit[0,0;4,2;"..background..";close1; ]"..
"image_button_exit[0.2,0.8;1,1;"..icon..";close2; ]"..
"label[1.1,1;"..title.."]"..
"label[0.3,0.1;"..custom_announce.."]")
else
-- use the chat console to send it
minetest.chat_send_player(name, "Achievement Unlocked: "..title)
if desc~="" then
minetest.chat_send_player(name, desc)
end
end
-- record this in the log
print(name.." Has unlocked"..title..".")
-- save playertable
save_playerD()
end
end
-- List a player's achievements
minetest.register_chatcommand("list_awards", {
params = "",
description = "list_awards: list your awards",
func = function(name, param)
minetest.chat_send_player(name, name.."'s awards:");
for _, str in pairs(player_data[name].unlocked) do
minetest.chat_send_player(name, str);
end
end,
})
|