playertags/main.lua

146 lines
4.8 KiB
Lua

config =
modlib.conf.import(
"playertags",
{
type = "table",
children = {
glow = {
type = "number",
range = {0, 15}
},
size = {
type = "number",
range = {0}
},
step = {
type = "number",
range = {0}
}
}
}
)
modlib.table.add_all(getfenv(1), config)
y_size = size * (64 / 48)
function generate_texture(s)
local r = "playertag_bg.png^[resize:" .. tostring(string.len(s) * 48) .. "x64"
for i = 1, string.len(s) do
local char = "freemono_" .. string.byte(s, i) .. ".png"
r = r .. "^[combine:64x64:" .. tostring((i - 1) * 48) .. ",0" .. "=" .. char
end
return r
end
function generate_player_texture(player)
return generate_texture(player:get_player_name()) .. "^[multiply:" .. modlib.player.get_color(player)
end
function attach_tag(tag, player)
tag:set_attach(player, "", {x = 0, y = (player:get_properties().collisionbox[5] + y_size) * 10, z = 0}, {x = 0, y = 180, z = 0})
end
function get_visual_size(name)
return {
y = y_size,
x = size * name:len(),
z = 1
}
end
function make_nametag_invisible(player)
local color = player:get_nametag_attributes().color
color.a = 0
player:set_nametag_attributes{
-- Null nametag in order to counter poorly made hacked clients (isn't empty, but won't be rendered)
text = "\0",
color = color
}
end
if size > 0 then
minetest.register_entity(
"playertags:playertag",
{
initial_properties = {
max_hp = 1,
physical = false,
collide_with_objects = false,
pointable = false,
use_texture_alpha = true,
is_invisible = true,
visual = "sprite",
visual_size = {x = 1, y = 1, z = 1},
textures = {"freemono_30.png"},
collisionbox = {0, 0, 0, 0, 0, 0},
selectionbox = {0, 0, 0, 0, 0, 0},
glow = glow
},
on_step = function(self, dtime)
self.timer = self.timer + dtime
if self.timer >= step then
if not self.owner then
self.object:remove()
return
end
self.timer = 0
local owner = minetest.get_player_by_name(self.owner)
if not owner then
self.object:remove()
return
end
if owner:get_properties().is_invisible then
self.object:set_properties({visual_size = {x = 0, y = 0}, is_invisible = true})
else
local props = {
visual_size = get_visual_size(self.owner)
}
local color = owner:get_properties().nametag_color
if owner:get_properties().nametag_color.a ~= 0 then
make_nametag_invisible(owner)
end
local rgb = minetest.rgba(color.r, color.g, color.b)
if self.color ~= rgb then
self.color = rgb
props.textures = {generate_player_texture(owner)}
end
self.object:set_properties(props)
end
if not self.object:get_attach() ~= self.owner then
attach_tag(self.object, owner)
end
end
end,
on_activate = function(self, dtime)
self.timer = 0
self.object:set_armor_groups({immortal = 1})
end
}
)
minetest.register_on_joinplayer(
function(player)
make_nametag_invisible(player)
local pos = player:get_pos()
pos.y = player:get_properties().collisionbox[5] + y_size
local tag = minetest.add_entity(pos, "playertags:playertag")
tag:get_luaentity().owner = player:get_player_name()
tag:set_properties(
{
visual_size = get_visual_size(player:get_player_name()),
textures = {generate_player_texture(player)}
}
)
attach_tag(tag, player)
end
)
else
minetest.register_on_joinplayer(
function(player)
make_nametag_invisible(player)
end
)
modlib.minetest.register_globalstep(step, function()
for _, player in pairs(minetest.get_connected_players()) do
make_nametag_invisible(player)
end
end)
end