diff --git a/init.lua b/init.lua index 060905d..2081702 100644 --- a/init.lua +++ b/init.lua @@ -142,15 +142,29 @@ local function hide_hud_waypoint(player_name, hud_ids) end end +local Announcement = {} + +function Announcement:new(announcer_name, radius, message, icon, timeout) + local a = { + announcer_name = announcer_name, + radius = radius, + message = message, + icon = icon, + timeout = timeout, + players_huds = {}, + } + setmetatable(a, self) + return a +end local prepared_announcements = {} -local function prepare_announcement(announcer_name, announce_radius, message, announce_icon, announce_timeout) +local function prepare_announcement(announcer_name, radius, message, icon, timeout) --prepared_announcements[select(1,...)] = table.pack(...) -- does not work in older lua? - prepared_announcements[announcer_name] = {announcer_name, announce_radius, message, announce_icon, announce_timeout} + prepared_announcements[announcer_name] = Announcement:new(announcer_name, radius, message, icon, timeout) end -local function add_announcement(announcer, announcer_name, radius, message, icon_name, timeout) +local function add_announcement(announcer, announcement) local player_pos = announcer:get_pos() -- TODO use pointed thing to provide some description? local pointed_pos, pointed_thing = get_pointed_position(announcer, point_range) @@ -159,33 +173,33 @@ local function add_announcement(announcer, announcer_name, radius, message, icon pointed_pos = player_pos end - for i, object in pairs(minetest.get_objects_inside_radius(player_pos, radius)) do + for i, object in pairs(minetest.get_objects_inside_radius(player_pos, announcement.radius)) do if object:is_player() then local player = object local player_name = player:get_player_name() - local hud_ids = show_hud_waypoint(player, pointed_pos, message, icon_name) + local hud_ids = show_hud_waypoint(player, pointed_pos, announcement.message, announcement.icon) minetest.after(announce_timeout, hide_hud_waypoint, player_name, hud_ids) end end local rounded_pos = vector.round(pointed_pos) local chat_message = "[ANNOUNCE] (" .. - announcer_name .. + announcement.announcer_name .. ") Look: " .. - message .. " " .. + announcement.message .. " " .. minetest.pos_to_string(rounded_pos) minetest.chat_send_all(minetest.colorize(chat_message_color, chat_message)) end local function check_click_for_prepared_players(dtime) - for player_name, prepared_args in pairs(prepared_announcements) do + for player_name, announcement in pairs(prepared_announcements) do local player = minetest.get_player_by_name(player_name) if player then local player_controls = player:get_player_control() if player_controls['dig'] then -- place prepared announcement at pointed position - add_announcement(player, unpack(prepared_args)) + add_announcement(player, announcement) prepared_announcements[player_name] = nil elseif player_controls['place'] then -- cancel prepared announcement @@ -229,7 +243,8 @@ minetest.register_chatcommand(announce_command_name, { local player = minetest.get_player_by_name(name) if player then -- player is online local player_name = player:get_player_name() - add_announcement(player, player_name, announce_radius, param, announce_icon, announce_timeout) + local announcement = Announcement:new(player_name, announce_radius, param, announce_icon, announce_timeout) + add_announcement(player, announcement) return true else return false