Add custom nametags
This commit is contained in:
192
scripts/client/nametags.js
Normal file
192
scripts/client/nametags.js
Normal file
@@ -0,0 +1,192 @@
|
||||
"use strict";
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
// Configuration
|
||||
let nametagFont = null;
|
||||
let afkStatusFont = null;
|
||||
let pingFont = null;
|
||||
let nametagDistance = 50.0;
|
||||
let nametagWidth = 70;
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
addEventHandler("OnResourceReady", function(event, resource) {
|
||||
if (resource == thisResource) {
|
||||
nametagFont = lucasFont.createDefaultFont(12.0, "Roboto", "Light");
|
||||
afkStatusFont = lucasFont.createDefaultFont(18.0, "Roboto", "Light");
|
||||
}
|
||||
});
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
function createColour(alpha, red, green, blue) {
|
||||
return alpha << 24 | red << 16 | green << 8 | blue;
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
function getDistance(pos1, pos2) {
|
||||
let dx = pos1[0] - pos2[0];
|
||||
let dy = pos1[1] - pos2[1];
|
||||
let dz = pos1[2] - pos2[2];
|
||||
return Math.sqrt(dx*dx + dy*dy + dz*dz);
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
function drawNametag(x, y, health, armour, text, ping, alpha, distance, colour, afk) {
|
||||
if(nametagFont == null) {
|
||||
return false;
|
||||
}
|
||||
|
||||
alpha *= 0.75;
|
||||
let width = nametagWidth;
|
||||
health = Math.max(0.0, Math.min(1.0, health));
|
||||
armour = Math.max(0.0, Math.min(1.0, armour));
|
||||
|
||||
// Starts at bottom and works it's way up
|
||||
// -------------------------------------------
|
||||
// Health Bar
|
||||
|
||||
if(skin == 109) {
|
||||
y -= 20;
|
||||
} else {
|
||||
y -= 5;
|
||||
}
|
||||
|
||||
if(health > 0.0) {
|
||||
let hx = x-width/2;
|
||||
let hy = y-10/2;
|
||||
let colourB = toColour(0, 0, 0, Math.floor(255.0*alpha)); // Background colour (black)
|
||||
drawing.drawRectangle(null, [hx, hy], [width, 8], colourB, colourB, colourB, colourB);
|
||||
let colour = createColour(Math.floor(255.0*alpha), Math.floor(255.0-(health*255.0)), Math.floor(health*255.0), 0); // Health bar colour (varies, depending on health)
|
||||
drawing.drawRectangle(null, [hx+2, hy+2], [(width-4)*health, 10-6], colour, colour, colour, colour);
|
||||
}
|
||||
|
||||
// Armour Bar
|
||||
if (armour > 0.0)
|
||||
{
|
||||
// Go up 10 pixels to draw the next part
|
||||
y -= 10;
|
||||
let hx = x-width/2;
|
||||
let hy = y-10/2;
|
||||
let colourB = createColour(Math.floor(255.0*alpha), 0, 0, 0); // Background colour (black)
|
||||
drawing.drawRectangle(null, [hx, hy], [width, 8], colourB, colourB, colourB, colourB);
|
||||
let colour = createColour(Math.floor(255.0*alpha), 255, 255, 255); // Armour bar colour (white)
|
||||
drawing.drawRectangle(null, [hx+2, hy+2], [(width-4)*armour, 10-6], colour, colour, colour, colour);
|
||||
}
|
||||
|
||||
y -= 20;
|
||||
|
||||
// Nametag
|
||||
if(nametagFont != null) {
|
||||
let size = nametagFont.measure(text, game.width, 0.0, 0.0, nametagFont.size, false, false);
|
||||
let colourT = createColour(Math.floor(255.0*alpha), 255, 255, 255);
|
||||
nametagFont.render(text, [x-size[0]/2, y-size[1]/2], game.width, 0.0, 0.0, nametagFont.size, colour, false, false, false, true);
|
||||
}
|
||||
|
||||
// Go up another 10 pixels for the next part
|
||||
y -= 20;
|
||||
|
||||
// AFK Status
|
||||
if(afkStatusFont != null) {
|
||||
if(afk) {
|
||||
let size = afkStatusFont.measure("PAUSED", game.width, 0.0, 0.0, afkStatusFont.size, false, false);
|
||||
afkStatusFont.render("PAUSED", [x-size[0]/2, y-size[1]/2], game.width, 0.0, 0.0, afkStatusFont.size, toColour(255, 0, 0, 255), false, false, false, true);
|
||||
}
|
||||
}
|
||||
|
||||
// Go up another 50 pixels for the next part
|
||||
//y -= 30;
|
||||
|
||||
//if(ping != -1) {
|
||||
// if(pingFont != null) {
|
||||
// let size2 = pingFont.measure(ping, game.width, 0.0, 0.0, pingFont.size, false, false);
|
||||
// let colourT2 = createColour(Math.floor(255.0*alpha), 255, 255, 255);
|
||||
// pingFont.render(ping, [x-size2[0]/2, y-size2[1]/2], game.width, 0.0, 0.0, pingFont.size, colourT2, false, false, false, true);
|
||||
// }
|
||||
//}
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
function updateNametags(element) {
|
||||
if(localPlayer != null) {
|
||||
let playerPos = localPlayer.position;
|
||||
let elementPos = element.position;
|
||||
let client = getClientFromPlayerElement(element);
|
||||
|
||||
elementPos[2] += 0.9;
|
||||
|
||||
let screenPos = getScreenFromWorldPosition(elementPos);
|
||||
if (screenPos[2] >= 0.0) {
|
||||
let health = element.health/100.0;
|
||||
if(health > 1.0) {
|
||||
health = 1.0;
|
||||
}
|
||||
|
||||
//console.log("Armour: " + String(element.armour));
|
||||
let armour = element.armour/100.0;
|
||||
if(armour > 1.0) {
|
||||
armour = 1.0;
|
||||
}
|
||||
|
||||
let distance = getDistance(playerPos, elementPos);
|
||||
if(distance < nametagDistance) {
|
||||
if(element.type == ELEMENT_PLAYER) {
|
||||
|
||||
let name = element.name;
|
||||
let colour = COLOUR_WHITE;
|
||||
let afk = false;
|
||||
|
||||
if(element.getData("ag.name") != null) {
|
||||
name = element.getData("ag.name");
|
||||
}
|
||||
|
||||
if(element.getData("ag.afk") != null) {
|
||||
afk = true;
|
||||
}
|
||||
|
||||
if(element.getData("ag.colour") != null) {
|
||||
colour = element.getData("ag.colour");
|
||||
}
|
||||
|
||||
drawNametag(screenPos[0], screenPos[1], health, armour, name, 0, 1.0-distance/nametagDistance, distance, colour, afk);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
function getClientFromPlayer(player) {
|
||||
let clients = getClients();
|
||||
for(let i in clients) {
|
||||
if(clients[i].player == player) {
|
||||
return clients[i];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
addNetworkHandler("armour", function(client, ped, armour) {
|
||||
if(ped != null) {
|
||||
ped.armour = armour;
|
||||
}
|
||||
});
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
addEventHandler("OnDrawnHUD", function(event) {
|
||||
let peds = getPeds();
|
||||
for(let i in peds) {
|
||||
if(peds[i] != localPlayer) {
|
||||
updateNametags(peds[i]);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
Reference in New Issue
Block a user