// =========================================================================== // Asshat-Gaming Roleplay // https://github.com/VortrexFTW/gtac_asshat_rp // Copyright (c) 2020 Asshat-Gaming (https://asshatgaming.com) // --------------------------------------------------------------------------- // FILE: labels.js // DESC: Provides functionality for world labels (3D labels) // TYPE: Client (JavaScript) // =========================================================================== "use strict"; let businessLabels = []; let houseLabels = []; let jobLabels = []; let propertyLabelNameFont = null; let propertyLabelLockedFont = null; let propertyLabelHeight = 1.0; let jobNameLabelFont = null; let jobHelpLabelFont = null; let unlockedColour = toColour(50, 205, 50, 255); let lockedColour = toColour(205, 92, 92, 255); let jobHelpColour = toColour(234, 198, 126, 255); // ---------------------------------------------------------------------------- bindEventHandler("onResourceReady", thisResource, function(event, resource) { propertyLabelNameFont = lucasFont.createDefaultFont(16.0, "Roboto", "Regular"); propertyLabelLockedFont = lucasFont.createDefaultFont(12.0, "Roboto", "Light"); jobNameLabelFont = lucasFont.createDefaultFont(16.0, "Roboto", "Regular"); jobHelpLabelFont = lucasFont.createDefaultFont(10.0, "Roboto", "Light"); }); // ---------------------------------------------------------------------------- function renderPropertyEntranceLabel(name, position, locked, isBusiness, price) { if(localPlayer == null) { return false; } if(propertyLabelNameFont == null) { return false; } if(propertyLabelLockedFont == null) { return false; } if(localPlayer.position.distance(position) > 7.5) { return false; } let tempPosition = position; tempPosition.z = tempPosition.z + propertyLabelHeight; let screenPosition = getScreenFromWorldPosition(tempPosition); let text = ""; if(price > 0) { text = `For sale: $${price}`; let size = propertyLabelLockedFont.measure(text, game.width, 0.0, 0.0, propertyLabelLockedFont.size, true, true); propertyLabelLockedFont.render(text, [screenPosition.x-size[0]/2, screenPosition.y-size[1]/2], game.width, 0.0, 0.0, propertyLabelLockedFont.size, toColour(0, 150, 0, 255), false, true, false, true); screenPosition.y -= 18; } text = (locked) ? "LOCKED" : "UNLOCKED"; if(isBusiness) { text = (locked) ? "CLOSED" : "OPEN"; } let size = propertyLabelLockedFont.measure(text, game.width, 0.0, 0.0, propertyLabelLockedFont.size, true, true); propertyLabelLockedFont.render(text, [screenPosition.x-size[0]/2, screenPosition.y-size[1]/2], game.width, 0.0, 0.0, propertyLabelLockedFont.size, (locked) ? lockedColour : unlockedColour, false, true, false, true); screenPosition.y -= 22; text = name || " "; size = propertyLabelNameFont.measure(text, game.width, 0.0, 0.0, propertyLabelNameFont.size, true, true); propertyLabelNameFont.render(text, [screenPosition.x-size[0]/2, screenPosition.y-size[1]/2], game.width, 0.0, 0.0, propertyLabelNameFont.size, (isBusiness) ? toColour(0, 153, 255, 255) : toColour(17, 204, 17, 255), false, true, false, true); } // ---------------------------------------------------------------------------- function renderPropertyExitLabel(position) { if(localPlayer == null) { return false; } if(propertyLabelNameFont == null) { return false; } if(propertyLabelLockedFont == null) { return false; } if(localPlayer.position.distance(position) > 7.5) { return false; } let tempPosition = position; tempPosition.z = tempPosition.z + propertyLabelHeight; let screenPosition = getScreenFromWorldPosition(tempPosition); let text = "EXIT"; size = propertyLabelNameFont.measure(text, game.width, 0.0, 0.0, propertyLabelNameFont.size, true, true); propertyLabelNameFont.render(text, [screenPosition.x-size[0]/2, screenPosition.y-size[1]/2], game.width, 0.0, 0.0, propertyLabelNameFont.size, COLOUR_WHITE, false, true, false, true); } // ---------------------------------------------------------------------------- function renderJobLabel(name, position, jobType) { if(localPlayer == null) { return false; } if(jobNameLabelFont == null) { return false; } if(jobHelpLabelFont == null) { return false; } if(localPlayer.position.distance(position) > 7.5) { return false; } let tempPosition = position; tempPosition.z = tempPosition.z + propertyLabelHeight; let screenPosition = getScreenFromWorldPosition(tempPosition); let text = ""; if(jobType == localPlayerJobType) { if(localPlayerWorking) { text = "Use /uniform and /equip for job stuff, or /stopwork to go off duty"; } else { text = "Use /startwork to go on duty"; } } else { if(localPlayerJobType == 0) { text = "Use /takejob to work here"; } else { text = "You already have a job. Use /quitjob if you want this one"; } } let size = jobHelpLabelFont.measure(text, game.width, 0.0, 0.0, jobHelpLabelFont.size, true, true); jobHelpLabelFont.render(text, [screenPosition.x-size[0]/2, screenPosition.y-size[1]/2], game.width, 0.0, 0.0, jobHelpLabelFont.size, COLOUR_YELLOW, false, true, false, true); screenPosition.y -= 18; text = name + " Job"; size = jobNameLabelFont.measure(text, game.width, 0.0, 0.0, jobNameLabelFont.size, true, true); jobNameLabelFont.render(text, [screenPosition.x-size[0]/2, screenPosition.y-size[1]/2], game.width, 0.0, 0.0, jobNameLabelFont.size, COLOUR_WHITE, false, true, false, true); } // ---------------------------------------------------------------------------- addEventHandler("OnDrawnHUD", function (event) { if(localPlayer != null) { let pickups = getElementsByType(ELEMENT_PICKUP); for(let i in pickups) { if(pickups[i].getData("ag.label.type") != null) { //if(pickups[i].isOnScreen) { if(getDistance(localPlayer.position, pickups[i].position)) { //if(pickups[i].interior == localPlayer.interior) { //if(pickups[i].dimension == localPlayer.dimension) { let price = 0; if(pickups[i].getData("ag.label.price") != null) { price = pickups[i].getData("ag.label.price"); } switch(pickups[i].getData("ag.label.type")) { case AG_LABEL_BUSINESS: renderPropertyEntranceLabel(pickups[i].getData("ag.label.name"), pickups[i].position, pickups[i].getData("ag.label.locked"), true, price); break; case AG_LABEL_HOUSE: renderPropertyEntranceLabel(pickups[i].getData("ag.label.name"), pickups[i].position, pickups[i].getData("ag.label.locked"), false, price); break; case AG_LABEL_JOB: renderJobLabel(pickups[i].getData("ag.label.name"), pickups[i].position, pickups[i].getData("ag.label.jobType")); break; case AG_LABEL_EXIT: renderPropertyExitLabel(pickups[i].position); break; } //} //} } //} } } } }); // ----------------------------------------------------------------------------