136 lines
3.4 KiB
Lua
136 lines
3.4 KiB
Lua
local nametags = {}
|
|
local tag_settings = {}
|
|
local ATTACH_POSITION = minetest.rgba and {x=0,y=20,z=0} or {x=0,y=10,z=0}
|
|
|
|
local TYPE_BUILTIN = 0
|
|
local TYPE_ENTITY = 1
|
|
playertag = {
|
|
TYPE_BUILTIN = TYPE_BUILTIN,
|
|
TYPE_ENTITY = TYPE_ENTITY,
|
|
}
|
|
|
|
local function add_entity_tag(player)
|
|
local ent = minetest.add_entity(player:get_pos(), "playertag:tag")
|
|
|
|
-- Build name from font texture
|
|
local color = "W"
|
|
local texture = "npcf_tag_bg.png"
|
|
local x = math.floor(134 - ((player:get_player_name():len() * 11) / 2))
|
|
local i = 0
|
|
player:get_player_name():gsub(".", function(char)
|
|
if char:byte() > 64 and char:byte() < 91 then
|
|
char = "U"..char
|
|
end
|
|
texture = texture.."^[combine:84x14:"..(x+i)..",0="..color.."_"..char..".png"
|
|
i = i + 11
|
|
end)
|
|
ent:set_properties({ textures={texture} })
|
|
|
|
-- Attach to player
|
|
ent:set_attach(player, "", ATTACH_POSITION, {x=0,y=0,z=0})
|
|
ent:get_luaentity().wielder = player:get_player_name()
|
|
|
|
-- Store
|
|
nametags[player:get_player_name()] = ent
|
|
|
|
-- Hide fixed nametag
|
|
player:set_nametag_attributes({
|
|
color = {a = 0, r = 0, g = 0, b = 0}
|
|
})
|
|
end
|
|
|
|
local function remove_entity_tag(player)
|
|
tag_settings[player:get_player_name()] = nil
|
|
local tag = nametags[player:get_player_name()]
|
|
if tag then
|
|
tag:remove()
|
|
tag = nil
|
|
end
|
|
end
|
|
|
|
local function update(player, settings)
|
|
tag_settings[player:get_player_name()] = settings
|
|
|
|
if settings.type == TYPE_BUILTIN then
|
|
remove_entity_tag(player)
|
|
print(dump(settings.color))
|
|
player:set_nametag_attributes({
|
|
color = settings.color
|
|
})
|
|
elseif settings.type == TYPE_ENTITY then
|
|
add_entity_tag(player)
|
|
end
|
|
end
|
|
|
|
function playertag.set(player, type, color)
|
|
local oldset = tag_settings[player:get_player_name()]
|
|
color = color or { a=255, r=255, g=255, b=255 }
|
|
if not oldset or oldset.type ~= type or oldset.color ~= color then
|
|
update(player, { type = type, color = color })
|
|
end
|
|
end
|
|
|
|
local nametag = {
|
|
npcf_id = "nametag",
|
|
physical = false,
|
|
collisionbox = {x=0, y=0, z=0},
|
|
visual = "sprite",
|
|
textures = {"default_dirt.png"},--{"npcf_tag_bg.png"},
|
|
visual_size = {x=2.16, y=0.18, z=2.16},--{x=1.44, y=0.12, z=1.44},
|
|
}
|
|
|
|
function nametag:on_activate(staticdata, dtime_s)
|
|
if staticdata == "expired" then
|
|
local name = self.wielder and self.wielder:get_player_name()
|
|
if name and nametags[name] == self.object then
|
|
nametags[name] = nil
|
|
end
|
|
|
|
self.object:remove()
|
|
end
|
|
end
|
|
|
|
function nametag:get_staticdata()
|
|
return "expired"
|
|
end
|
|
|
|
function nametag:on_step(dtime)
|
|
local name = self.wielder
|
|
local wielder = name and minetest.get_player_by_name(name)
|
|
if not wielder then
|
|
self.object:remove()
|
|
elseif not tag_settings[name] or tag_settings[name].type ~= TYPE_ENTITY then
|
|
if name and nametags[name] == self.object then
|
|
nametags[name] = nil
|
|
end
|
|
|
|
self.object:remove()
|
|
end
|
|
end
|
|
|
|
minetest.register_entity("playertag:tag", nametag)
|
|
|
|
local function step()
|
|
for _, player in pairs(minetest.get_connected_players()) do
|
|
local settings = tag_settings[player:get_player_name()]
|
|
if settings and settings.type == TYPE_ENTITY then
|
|
local ent = nametags[player:get_player_name()]
|
|
if not ent or ent:get_luaentity() == nil then
|
|
add_entity_tag(player)
|
|
else
|
|
ent:set_attach(player, "", ATTACH_POSITION, {x=0,y=0,z=0})
|
|
end
|
|
end
|
|
end
|
|
|
|
minetest.after(10, step)
|
|
end
|
|
minetest.after(10, step)
|
|
|
|
minetest.register_on_joinplayer(function(player)
|
|
playertag.set(player, TYPE_ENTITY)
|
|
end)
|
|
|
|
minetest.register_on_leaveplayer(function (player)
|
|
remove_entity_tag(player)
|
|
end)
|