Add locale
[minetest_central_message.git] / init.lua
blob1d9276cf4df8f5efa118c7805e4f2013371059b4
1 local S = minetest.get_translator("central_message")
3 cmsg = {}
4 cmsg.hudids = {}
5 cmsg.messages = {}
6 cmsg.settings = {}
7 cmsg.next_msgids = {}
9 cmsg.settings.max_messages = 7
10 local setting = minetest.setting_get("central_message_max")
11 if type(tonumber(setting)) == "number" then
12 if tonumber(setting) == 0 then
13 -- Infinite messages
14 cmsg.settings.max_messages = nil
15 else
16 cmsg.settings.max_messages = tonumber(setting)
17 end
18 end
20 cmsg.settings.color = 0xFFFFFF
21 setting = minetest.setting_get("central_message_color")
22 if setting then
23 local r, g, b = string.match(setting, "%((%d+),(%d+),(%d+)%)")
24 r = tonumber(r)
25 g = tonumber(g)
26 b = tonumber(b)
27 if type(r) == "number" and type(g) == "number" and type(b) == "number" and
28 r >= 0 and r <= 255 and g >= 0 and g <= 255 and b >= 0 and b <= 255 then
29 cmsg.settings.color = r * 0x10000 + g * 0x100 + b
30 else
31 minetest.log("warning", "[central_message] Invalid syntax of central_message_color setting!")
32 end
33 end
35 cmsg.settings.display_time = 5
36 local setting = minetest.setting_get("central_message_time")
37 if type(tonumber(setting)) == "number" then
38 if tonumber(setting) >= 1 then
39 cmsg.settings.display_time = tonumber(setting)
40 else
41 minetest.log("warning", "[central_message] Invalid value for central_message_time! Using default display time of 5 seconds.")
42 end
43 end
47 local function update_display(player, pname)
48 local messages = {}
49 local start, stop
50 stop = #cmsg.messages[pname]
51 if cmsg.settings.max_messages ~= nil then
52 local max = math.min(cmsg.settings.max_messages, #cmsg.messages[pname])
53 if #cmsg.messages[pname] > cmsg.settings.max_messages then
54 start = stop - max
55 else
56 start = 1
57 end
58 else
59 start = 1
60 end
61 for i=start, stop do
62 table.insert(messages, cmsg.messages[pname][i].text)
63 end
64 local concat = table.concat(messages, "\n")
65 player:hud_change(cmsg.hudids[pname], "text", concat)
66 end
68 cmsg.push_message_player = function(player, text)
69 local function push(tbl)
70 -- Horrible Workaround code starts here
71 if not (cmsg.last_push < cmsg.steps) then
72 minetest.after(0, push, tbl)
73 return
74 end
76 local player = tbl.player
77 local text = tbl.text
78 -- Horrible Workaround code ends here
80 if not player then
81 return
82 end
83 local pname = player:get_player_name()
84 if (not pname) then
85 return
86 end
87 if cmsg.hudids[pname] == nil then
88 cmsg.hudids[pname] = player:hud_add({
89 hud_elem_type = "text",
90 text = text,
91 number = cmsg.settings.color,
92 position = {x=0.5, y=0.5},
93 offset = {x=-0,y=-256},
94 direction = 3,
95 alignment = {x=0,y=1},
96 scale = {x=800,y=20*cmsg.settings.max_messages},
97 z_index = 10,
99 cmsg.messages[pname] = {}
100 cmsg.next_msgids[pname] = 0
101 table.insert(cmsg.messages[pname], {text=text, msgid=cmsg.next_msgids[pname]})
102 else
103 cmsg.next_msgids[pname] = cmsg.next_msgids[pname] + 1
104 table.insert(cmsg.messages[pname], {text=text, msgid=cmsg.next_msgids[pname]})
105 update_display(player, pname)
108 minetest.after(cmsg.settings.display_time, function(param)
109 if not param.player then
110 return
112 local pname = param.player:get_player_name()
113 if (not pname) or (not cmsg.messages[pname]) then
114 return
116 for i=1, #cmsg.messages[pname] do
117 if param.msgid == cmsg.messages[pname][i].msgid then
118 table.remove(cmsg.messages[pname], i)
119 break
122 update_display(player, pname)
123 end, {player=player, msgid=cmsg.next_msgids[pname]})
125 -- Update timer for Horrible Workaround
126 cmsg.last_push = cmsg.steps
129 if cmsg.last_push < cmsg.steps then
130 push({player=player, text=text})
131 else
132 minetest.after(0, push, {player=player, text=text})
136 cmsg.push_message_all = function(text)
137 local players = minetest.get_connected_players()
138 for i=1,#players do
139 cmsg.push_message_player(players[i], text)
143 minetest.register_on_leaveplayer(function(player)
144 cmsg.hudids[player:get_player_name()] = nil
145 end)
147 minetest.register_privilege("announce", {
148 description = S("Can use /cmsg"),
149 give_to_singleplayer = false,
151 minetest.register_chatcommand("cmsg", {
152 description = S("Show message in the center of the screen to player (“*” sends to all players)"),
153 privs = {announce = true},
154 params = S("<player> <text>"),
155 func = function(name, params)
156 local player = minetest.get_player_by_name(name)
157 local targetname, text = string.match(params, "^(%S+)%s(.+)$")
158 if not targetname then
159 return false, S("Invalid usage, see “/help cmsg”.")
161 if targetname == "*" then
162 cmsg.push_message_all(text)
163 return true, S("Message sent.")
164 else
165 local target = minetest.get_player_by_name(targetname)
166 if not target then
167 return false, S("The player @1 is not online.", targetname)
169 cmsg.push_message_player(target, text)
170 return true, S("Message sent.")
172 end,
175 -- Horrible Workaround code starts here
176 cmsg.steps = 0
177 cmsg.last_push = -1
178 minetest.register_globalstep(function(dtime)
179 cmsg.steps = cmsg.steps + 1
180 end)
181 -- Horrible Workaround code ends here