76 lines
2.3 KiB
Lua
76 lines
2.3 KiB
Lua
local shown = {}
|
|
|
|
local settings = minetest.settings
|
|
local MSG_BUBBLE_LIFETIME = tonumber(settings:get("message_bubbles_lifetime")) or 10
|
|
local MAX_MSG_BUBBLE_LENGTH = tonumber(settings:get("message_bubbles_char_limit")) or 40
|
|
local MSG_BUBBLE_PREFIX = settings:get("message_bubbles_prefix") or "Says: "
|
|
|
|
local cumulativeTime = 0
|
|
|
|
local function trim(msg)
|
|
if not msg or not type(msg) == "string" then return "" end
|
|
if string.len(msg) > MAX_MSG_BUBBLE_LENGTH then
|
|
return string.sub(msg, 1, MAX_MSG_BUBBLE_LENGTH)
|
|
else
|
|
return msg
|
|
end
|
|
end
|
|
|
|
minetest.register_on_chat_message(function(name, origMessage)
|
|
if minetest.get_player_privs(name).shout then
|
|
local player = minetest.get_player_by_name(name)
|
|
if not player then return end
|
|
local msg = "\n"..MSG_BUBBLE_PREFIX..trim(origMessage)
|
|
local nametag = player:get_nametag_attributes()
|
|
local nametagText = nametag.text
|
|
local hadToAddName = false
|
|
if shown[name] then
|
|
local currText = shown[name].text
|
|
if shown[name].wasEmpty then
|
|
shown[name].text = name..msg
|
|
shown[name].addedMsg = msg
|
|
else
|
|
shown[name].text = string.gsub(nametagText, currText, msg)
|
|
shown[name].addedMsg = msg
|
|
end
|
|
shown[name].time = minetest.get_gametime()
|
|
else
|
|
local addedMsg = msg
|
|
if not nametagText or nametagText == "" then
|
|
msg = name..msg
|
|
hadToAddName = true
|
|
end
|
|
shown[name] = {
|
|
text = msg,
|
|
addedMsg = addedMsg,
|
|
time = minetest.get_gametime(),
|
|
wasEmpty = hadToAddName,
|
|
}
|
|
end
|
|
nametag.text = shown[name].text
|
|
player:set_nametag_attributes(nametag)
|
|
end
|
|
end)
|
|
|
|
minetest.register_globalstep(function(dtime)
|
|
cumulativeTime = cumulativeTime + dtime
|
|
if cumulativeTime > 1 then
|
|
cumulativeTime = 0
|
|
local currTime = minetest.get_gametime()
|
|
for playerName, info in pairs(shown) do
|
|
if currTime - info.time > MSG_BUBBLE_LIFETIME then
|
|
local player = minetest.get_player_by_name(playerName)
|
|
if player then
|
|
local nametag = player:get_nametag_attributes()
|
|
if info.wasEmpty then
|
|
nametag.text = ""
|
|
else
|
|
nametag.text = string.gsub(nametag.text, info.addedMsg, "")
|
|
end
|
|
player:set_nametag_attributes(nametag)
|
|
end
|
|
shown[playerName] = nil
|
|
end
|
|
end
|
|
end
|
|
end) |