// =========================================================================== // Vortrex's Roleplay Resource // https://github.com/VortrexFTW/gtac_roleplay // =========================================================================== // FILE: utilities.js // DESC: Provides util functions and arrays with data // TYPE: Server (JavaScript) // =========================================================================== let disconnectReasons = [ "Lost Connection", "Disconnected", "Unsupported Client", "Wrong Game", "Incorrect Password", "Unsupported Executable", "Disconnected", "Banned", "Failed", "Invalid Name", "Crashed" ]; // =========================================================================== let weekDays = [ "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" ]; // =========================================================================== let months = [ "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December" ]; // =========================================================================== let cardinalDirections = [ "North", "Northeast", "East", "Southeast", "South", "Southwest", "West", "Northwest", "Unknown" ]; // =========================================================================== function getCardinalDirectionName(cardinalDirectionId) { let cardinalDirections = ["North", "Northeast", "East", "Southeast", "South", "Southwest", "West", "Northwest", "Unknown" ]; return cardinalDirections[cardinalDirectionId]; } // =========================================================================== function getWeekDayName(weekdayId) { let weekdayNames = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" ]; return weekdayNames[weekdayId]; } // =========================================================================== function getMonthName(monthId) { let monthNames = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"]; return monthNames[monthId]; } // =========================================================================== function openAllGarages() { } // =========================================================================== function closeAllGarages() { } // =========================================================================== function replaceEmojiIntoString(message) { for(let i in emojiReplaceString) { message = message.replace(emojiReplaceString[i][0], emojiReplaceString[i][1]); } return message; } // =========================================================================== function makeReadableTime(hour, minute) { let hourStr = toString(hour); let minuteStr = toString(minute); let meridianStr = "AM"; if(hour < 10) { hourStr = "0" + toString(hour); meridianStr = "AM"; } if(hour > 12) { let actualHour = hour-12; if(actualHour < 10) { hourStr = "0" + toString(hour-12); } else { hourStr = toString(hour-12); } meridianStr = "PM"; } if(minute < 10) { minuteStr = "0" + toString(minute); } return hourStr + ":" + minuteStr + " " + meridianStr; } // =========================================================================== function getClosestVehicle(position) { let vehicles = getServerData().vehicles; let closest = 0; for(let i in vehicles) { if(vehicles[i] != null) { if(vehicles[closest] == null || getDistance(getVehiclePosition(vehicles[i].vehicle), position) < getDistance(getVehiclePosition(vehicles[closest].vehicle), position)) { closest = i; } } } return vehicles[closest].vehicle; } // =========================================================================== function getClosestElementByType(elementType, position) { return getElementsByType(elementType).reduce((i, j) => ((i.position.distance(position) <= j.position.distance(position)) ? i : j)); } // =========================================================================== function getClosestJobLocation(position) { let closestJobLocation = false; for(let i in getServerData().jobs) { for(let j in getServerData().jobs[i].locations) { if(!closestJobLocation || getServerData().jobs[i].locations[j].position.distance(position) < closestJobLocation.position.distance(position)) { closestJobLocation = getServerData().jobs[i].locations[j]; } } } return closestJobLocation; } // =========================================================================== function getJobIndex(jobData) { return getServerData().jobs.indexOf(jobData); } // =========================================================================== function getJobPointsInRange(position, distance) { return getServerData().jobs[getServerGame()].filter(x => x.position.distance(position) <= distance); } // =========================================================================== function getWeaponName(weapon) { return weaponNames[getServerGame()][weapon]; } // =========================================================================== function isParamsInvalid(params) { if(params == null) { return true; } if(params == "") { return true; } if(params.length == 0) { return true; } return false; } // =========================================================================== function doesWordStartWithVowel(word) { switch(toLowerCase(word.substr(0,1))) { case "a": case "e": case "i": case "o": case "u": return true; default: return false; } return false; } // =========================================================================== function replaceEmojiIntoString(message) { for(let i in emojiReplaceString) { while(message.indexOf(emojiReplaceString[i][0]) != -1) { message = message.replace(emojiReplaceString[i][0], emojiReplaceString[i][1]); } } return message; } // =========================================================================== function getClientFromName(clientName) { let clients = getClients(); for(let i in clients) { if(toLowerCase(clients[i].name).indexOf(toLowerCase(clientName)) != -1) { return clients[i]; } let charName = `${getPlayerCurrentSubAccount(clients[i]).firstName} ${getPlayerCurrentSubAccount(clients[i]).lastName}`; if(toLowerCase(charName).indexOf(toLowerCase(clientName)) != -1) { return clients[i]; } } return false; } // =========================================================================== function getClientFromPlayer(player) { let clients = getClients(); for(let i in clients) { if(clients[i].player == player) { return clients[i]; } } return false; } // =========================================================================== function killDeathRatio(kills, deaths) { if(deaths == 0 || kills == 0) { return 0.0; } return Float((iKills*100/iDeaths) * 0.01); } // =========================================================================== function getCardinalDirection(pos1, pos2) { let a = pos1.x - pos2.x; let b = pos1.y - pos2.y; let c = pos1.z - pos2.z; let x = Math.abs(a); let y = Math.abs(b); let z = Math.abs(c); let no = 0; let ne = 1; let ea = 2; let se = 3; let so = 4; let sw = 5; let we = 6; let nw = 7; let na = 8; if(b < 0 && a < 0){ if(x < (y/2)){ return no; } else if(y < (x/2)){ return ea; } else { return ne; } } else if(b < 0 && a >= 0){ if(x < (y/2)){ return no; } else if(y < (x/2)){ return we; } else { return nw; } } else if(b >= 0 && a >= 0){ if(x < (y/2)){ return so; } else if(y < (x/2)){ return we; } else { return sw; } } else if(b >= 0 && a < 0){ if(x < (y/2)){ return so; } else if(y < (x/2)){ return ea; } else { return se; } } else { return na; } return na; } // =========================================================================== function getTimeDifferenceDisplay(timeStamp2, timeStamp1) { if(isNaN(timeStamp1) || isNaN(timeStamp2)) { return "Unknown"; } let millisecondDiff = timeStamp2 - timeStamp1; let days = Math.floor(millisecondDiff / 1000 / 60 / (60 * 24)); let diffDate = new Date(millisecondDiff); return `${days} days, ${diffDate.getHours()} hours, ${diffDate.getMinutes()} minutes`; } // =========================================================================== function getVehiclesInRange(position, range) { let vehicles = getVehicles(); let inRangeVehicles = []; for(let i in vehicles) { if(getDistance(position, vehicles[i].position) <= range) { inRangeVehicles.push(vehicles[i]); } } return inRangeVehicles; } // =========================================================================== function getPlayersInRange(position, range) { let clients = getClients(); let inRangePlayers = []; for(let i in clients) { if(isPlayerSpawned(clients[i])) { if(getDistance(position, getPlayerPosition(clients[i])) <= range) { inRangePlayers.push(clients[i]); } } } return inRangePlayers; } // =========================================================================== function getCiviliansInRange(position, range) { let peds = getPeds(); let inRangeCivilians = []; for(let i in peds) { if(peds[i].isType(ELEMENT_PED)) { if(getDistance(position, peds[i].position) <= range) { inRangeCivilians.push(peds[i]); } } } return inRangeCivilians; } // =========================================================================== function getFileData(filePath) { let file = openFile(filePath, false); if(!file) { return false; } let fileData = file.readBytes(file.length); file.close(); return fileData; } // =========================================================================== function setFileData(filePath, fileData) { let file = openFile(filePath, true); if(!file) { return false; } file.writeBytes(fileData, fileData.length); file.close(); return true; } // =========================================================================== function is2dPositionOnScreen(pos2d) { return pos2d.x >= 0 && pos2d.y >= 0 && pos2d.x <= game.width && pos2d.y <= game.height; } // =========================================================================== function breakText(text, maxLength) { let lines = []; let j = Math.floor(text.length / maxLength); for(let i = 0; i < j; i++) { lines.push(text.substr(i*maxLength,maxLength)); } let line = text.substr(j*maxLength, text.length % maxLength); if(line.length > 0) { lines.push(line); } return lines; } // =========================================================================== function getSpeedFromVelocity(vel) { return Math.sqrt(vel.x*vel.x + vel.y*vel.y + vel.z*vel.z); } // =========================================================================== function isValidSkin(skin, game = GAME_GTA_III) { if(game == GAME_GTA_III) { return true; } else if(game == GAME_GTA_VC) { switch(skin) { case 111: return false; default: return true; } } } // =========================================================================== function getPositionArea(position) { if(typeof position == "Vec3") { position = vec3ToVec2(position); } let gameAreas = getGameAreas(getServerGame()); for(let i in gameAreas) { if(isPositionInArea(position, gameAreas[i][1])) { return i; } } return false; } // =========================================================================== function getAreaName(position) { let areaId = getPositionArea(position); if(!areaId) { return false; } return getGameAreas()[areaId][0]; } // =========================================================================== function getGameAreas(gameId) { return gameAreas[gameId]; } // =========================================================================== function getPlayerData(client) { if(client != null) { return getServerData().clients[client.index]; } return false; } // =========================================================================== function createAllPoliceStationBlips() { if(getGameConfig().blipSprites[getServerGame()].policeStation != -1) { for(let i in getServerData().policeStations[getServerGame()]) { getServerData().policeStations[getServerGame()][i].blip = createBlip(getGameConfig().blipSprites[getServerGame()].policeStation, getServerData().policeStations[getServerGame()][i].position); } } } // =========================================================================== function createAllFireStationBlips() { if(getGameConfig().blipSprites[getServerGame()].fireStation != -1) { for(let i in getServerData().fireStations[getServerGame()]) { getServerData().fireStations[getServerGame()][i].blip = createBlip(getGameConfig().blipSprites[getServerGame()].fireStation, getServerData().fireStations[getServerGame()][i].position); } } } // =========================================================================== function createAllHospitalBlips() { if(getGameConfig().blipSprites[getServerGame()].hospital != -1) { for(let i in getServerData().hospitals[getServerGame()]) { getServerData().hospitals[getServerGame()][i].blip = createBlip(getGameConfig().blipSprites[getServerGame()].hospital, getServerData().hospitals[getServerGame()][i].position); } } } // =========================================================================== function createAllAmmunationBlips() { if(getGameConfig().blipSprites[getServerGame()].ammunation != -1) { for(let i in getServerData().ammunations[getServerGame()]) { getServerData().ammunations[getServerGame()][i].blip = createBlip(getGameConfig().blipSprites[getServerGame()].ammunation, getServerData().ammunations[getServerGame()][i].position); } } } // =========================================================================== function createAllPayAndSprayBlips() { if(getGameConfig().blipSprites[getServerGame()].payAndSpray != -1) { for(let i in getServerData().payAndSprays[getServerGame()]) { getServerData().payAndSprays[getServerGame()][i].blip = createBlip(getGameConfig().blipSprites[getServerGame()].payAndSpray, getServerData().payAndSprays[getServerGame()][i].position); } } } // =========================================================================== function createAllFuelStationBlips() { if(getGameConfig().blipSprites[getServerGame()].fuelStation != -1) { for(let i in getServerData().fuelStations[getServerGame()]) { getServerData().fuelStations[getServerGame()][i].blip = createBlip(getGameConfig().blipSprites[getServerGame()].fuelStation, getServerData().fuelStations[getServerGame()][i].position, 2, getColourByName("burntOrange")); } } } // =========================================================================== function getPickupOwnerType(pickup) { return pickup.getData("vrr.ownerType"); } // =========================================================================== function getPickupOwnerId(pickup) { return pickup.getData("vrr.ownerId"); } // =========================================================================== function canPlayerUsePoliceJob(client) { if(getPlayerData(client).accountData.flags.moderation & getServerBitFlags().moderationFlags.policeBanned) { return false; } return true; } // =========================================================================== function canClientUseFireJob(client) { if(getPlayerData(client).accountData.flags.moderation & getServerBitFlags().moderationFlags.fireBanned) { return false; } return true; } // =========================================================================== function canClientUseAmmunations(client) { if(getPlayerData(client).accountData.flags.moderation & getServerBitFlags().moderationFlags.ammuBanned) { return false; } return true; } // =========================================================================== function canClientUseGuns(client) { if(getPlayerData(client).accountData.flags.moderation & getServerBitFlags().moderationFlags.gunBanned) { return false; } return true; } // =========================================================================== function intToBool(intVal) { return (intVal == 1) ? true : false; } // =========================================================================== function boolToInt(boolVal) { return (boolVal) ? 1 : 0; } // =========================================================================== function sendAllBlips(client) { sendAllPoliceStationBlips(client); sendAllFireStationBlips(client); sendAllHospitalBlips(client); sendAllPayAndSprayBlips(client); sendAllAmmunationBlips(client); sendAllFuelStationBlips(client); sendAllJobBlips(client); } // =========================================================================== function initAllClients() { getClients().forEach(function(client) { initClient(client); }); } // =========================================================================== function getYesNoFromBool(boolVal) { return (boolVal) ? "Yes" : "No"; } // =========================================================================== function getOnOffFromBool(boolVal) { return (boolVal) ? "On" : "Off"; } // =========================================================================== function getEnabledDisabledFromBool(boolVal) { return (boolVal) ? "Enabled" : "Disabled"; } // =========================================================================== function getLockedUnlockedFromBool(boolVal) { return (boolVal) ? "Locked" : "Unlocked"; } // =========================================================================== function getOpenedClosedFromBool(boolVal) { return (boolVal) ? "Opened" : "Closed"; } // =========================================================================== function updateServerRules() { if(isTimeSupported()) { server.setRule("Time", makeReadableTime(getServerConfig().hour, getServerConfig().minute)); } if(isWeatherSupported()) { server.setRule("Weather", getGameData().weatherNames[getServerGame()][getServerConfig().weather]); } if(isSnowSupported()) { server.setRule("Snowing", getYesNoFromBool(getServerConfig().fallingSnow)); } } // =========================================================================== function getWeatherFromParams(params) { if(isNaN(params)) { for(let i in getGameData().weatherNames[getServerGame()]) { if(toLowerCase(getGameData().weatherNames[getServerGame()][i]).indexOf(toLowerCase(params)) != -1) { return i; } } } else { if(typeof getGameData().weatherNames[getServerGame()][params] != "undefined") { return toInteger(params); } } return 0; } // =========================================================================== function getAnimationFromParams(params) { if(isNaN(params)) { for(let i in getGameData().animations[getServerGame()]) { if(toLowerCase(getGameData().animations[getServerGame()][i][0]).indexOf(toLowerCase(params)) != -1) { return i; } } } else { if(typeof getGameData().animations[getServerGame()][params] != "undefined") { return toInteger(params); } } return 0; } // =========================================================================== function getClanFromParams(params) { if(isNaN(params)) { for(let i in getServerData().clans) { if(toLowerCase(getServerData().clans[i].name).indexOf(toLowerCase(params)) != -1) { return i; } } } else { if(typeof getServerData().clans[params] != "undefined") { return toInteger(params); } } return false; } // =========================================================================== function getClanRankFromParams(clanId, params) { if(isNaN(params)) { for(let i in getClanData(clanId).ranks) { if(toLowerCase(getClanData(clanId).ranks[i].name).indexOf(toLowerCase(params)) != -1) { return i; } } } else { if(typeof getClanData(clanId).ranks[params] != "undefined") { return toInteger(params); } } return false; } // =========================================================================== function getJobFromParams(params) { if(isNaN(params)) { for(let i in getServerData().jobs) { if(toLowerCase(getServerData().jobs[i].name).indexOf(toLowerCase(params)) != -1) { return i; } } } else { if(typeof getServerData().jobs[params] != "undefined") { return params; } } return false; } // =========================================================================== function getBusinessFromParams(params) { if(isNaN(params)) { for(let i in getServerData().businesses) { if(toLowerCase(getServerData().businesses[i].name).indexOf(toLowerCase(params)) != -1) { return i; } } } else { if(typeof getServerData().businesses[params] != "undefined") { return toInteger(params); } } return false; } // =========================================================================== function getGameLocationFromParams(params) { if(isNaN(params)) { for(let i in getGameData().locations[getServerGame()]) { if(toLowerCase(getGameData().locations[getServerGame()][i][0]).indexOf(toLowerCase(params)) != -1) { return i; } } } else { if(typeof getGameData().locations[getServerGame()][params] != "undefined") { return toInteger(params); } } return false; } // =========================================================================== function getHouseFromParams(params) { if(isNaN(params)) { for(let i in getServerData().houses) { if(toLowerCase(getServerData().houses[i].description).indexOf(toLowerCase(params)) != -1) { return i; } } } else { if(typeof getServerData().houses[params] != "undefined") { return toInteger(params); } } return false; } // =========================================================================== function getItemTypeFromParams(params) { if(isNaN(params)) { for(let i in getServerData().itemTypes) { if(toLowerCase(getServerData().itemTypes[i].name).indexOf(toLowerCase(params)) != -1) { return i; } } } else { if(typeof getServerData().itemTypes[params] != "undefined") { return toInteger(params); } } return false; } // =========================================================================== function clearChatBox(client) { //gta.messages.clear(); for(let i = 0; i <= 20; i++) { messageClient(" ", client, COLOUR_WHITE); } } // =========================================================================== function getSkinIdFromParams(params, gameId = getServerGame()) { if(isNaN(params)) { return getSkinIdFromName(params, gameId); } else { params = toInteger(params); if(gameId == GAME_GTA_IV || gameId == GAME_GTA_IV_EFLC) { return getGameData().gtaivSkinModels[params][1]; } else { return params; } } return false; } // =========================================================================== function getSkinNameFromId(modelId, gameId = getServerGame()) { if(gameId >= GAME_GTA_IV) { for(let i in getGameData().gtaivSkinModels) { if(getGameData().gtaivSkinModels[i][1] == modelId) { return getGameData().gtaivSkinModels[i][0]; } } } else { let modelIndex = modelId; return getGameData().skinNames[gameId][modelIndex]; } } // =========================================================================== function getSkinIdFromName(params, gameId = getServerGame()) { if(gameId == GAME_GTA_IV || gameId == GAME_GTA_IV_EFLC) { for(let i in gtaivSkinModels) { if(toLowerCase(getGameData().gtaivSkinModels[i][0]).indexOf(toLowerCase(params)) != -1) { return getGameData().gtaivSkinModels[i][1]; } } } else { for(let i in getGameData().skinNames[gameId]) { if(toLowerCase(getGameData().skinNames[gameId][i]).indexOf(toLowerCase(params)) != -1) { return i; } } } return false; } // =========================================================================== function getClosestHospital(position) { let closest = 0; for(let i in getGameData().hospitals[getServerGame()]) { if(getDistance(getGameData().hospitals[getServerGame()][i], position) < getDistance(getGameData().hospitals[getServerGame()][closest], position)) { closest = i; } } return getGameData().hospitals[getServerGame()][closest]; } // =========================================================================== function getClosestPoliceStation(position) { let closest = 0; for(let i in getGameData().policeStations[getServerGame()]) { if(getGameData().policeStations[getServerGame()][i].distance(position) < getGameData().policeStations[getServerGame()][closest]) { closest = i; } } return getGameData().policeStations[getServerGame()][closest]; } // =========================================================================== function getPlayerDisplayForConsole(client) { if(isNull(client)) { return "(Unknown client)"; } return `${getPlayerName(client)}[${client.index}]`; } // =========================================================================== function getPlayerNameForNameTag(client) { if(isPlayerSpawned(client)) { return `${getPlayerCurrentSubAccount(client).firstName} ${getPlayerCurrentSubAccount(client).lastName}`; } return getPlayerName(client); } // =========================================================================== function isPlayerSpawned(client) { if(!getPlayerData(client)) { return false; } return getPlayerData(client).spawned; } // =========================================================================== function getLockedUnlockedTextFromBool(boolVal) { return (boolVal) ? "locked" : "unlocked"; } // =========================================================================== function getLockedUnlockedEmojiFromBool(boolVal) { return (boolVal) ? "🔒" : "🔓"; } // =========================================================================== function getPlayerIsland(client) { return getIsland(getPlayerPosition(client)); } // =========================================================================== function isAtPayAndSpray(position) { for(let i in getGameData().payAndSprays[getServerGame()]) { if(getDistance(position, getGameData().payAndSprays[getServerGame()][i]) <= getGlobalConfig().payAndSprayDistance) { return true; } } return false; } // =========================================================================== async function waitUntil(condition) { return new Promise((resolve) => { let interval = setInterval(() => { if (!condition()) { return } clearInterval(interval); resolve(); }, 1); }); } // =========================================================================== function resetClientStuff(client) { logToConsole(LOG_DEBUG, `[VRR.Utilities] Resetting client data for ${getPlayerDisplayForConsole(client)}`); if(!getPlayerData(client)) { return false; } if(isPlayerOnJobRoute(client)) { stopJobRoute(client, false, false); } if(getPlayerData(client).rentingVehicle) { stopRentingVehicle(client); } deleteJobItems(client); getPlayerData(client).lastVehicle = null; } // =========================================================================== function getPlayerFromCharacterId(subAccountId) { let clients = getClients(); for(let i in clients) { for(let j in getPlayerData(clients[i]).subAccounts) { if(getPlayerData(clients[i]).subAccounts[j].databaseId == subAccountId) { return clients[i]; } } } return false; } // =========================================================================== function doesWordStartWithVowel(word) { switch(word.substr(0,1).toLowerCase()) { case "a": case "e": case "i": case "o": case "u": return true; default: return false; } return false; } // =========================================================================== function getProperDeterminerForName(word) { switch(word.substr(0,1).toLowerCase()) { case "a": case "e": case "i": case "o": return "an"; default: return "a"; } } // =========================================================================== function getPluralForm(name) { return name; } // =========================================================================== function removeColoursFromString(str) { let matchRegex = /#([a-f0-9]{3}|[a-f0-9]{4}(?:[a-f0-9]{2}){0,2})\b/gi; let matchedHexes = str.match(matchRegex); for(let i in matchHex) { str.replace(matchedHexes, `{${i}}`); } return [str, matchedHexes]; } // =========================================================================== function checkPlayerPedStates() { let clients = getClients(); for(let i in clients) { if(getPlayerData(clients[i])) { if(getPlayerData(clients[i]).pedState) { if(isPlayerInAnyVehicle(clients[i])) { if(getPlayerData(clients[i]).pedState == VRR_PEDSTATE_EXITINGVEHICLE) { getPlayerData(clients[i]).pedState == VRR_PEDSTATE_READY; } } } } } } // =========================================================================== function showConnectCameraToPlayer(client) { fadeCamera(client, true, 1); setPlayerCameraLookAt(client, getServerConfig().connectCameraPosition, getServerConfig().connectCameraLookAt); } // =========================================================================== function showCharacterSelectCameraToPlayer(client) { setPlayerCameraLookAt(client, getServerConfig().characterSelectCameraPosition, getServerConfig().characterSelectCameraPosition); } // =========================================================================== function generateRandomString(length) { var result = ''; var characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; var charactersLength = characters.length; for ( var i = 0; i < length; i++ ) { result += characters.charAt(Math.floor(Math.random() * charactersLength)); } return result; } // =========================================================================== function getVehiclesInRange(position, distance) { return getElementsByType(ELEMENT_VEHICLE).filter(x => x.player && x.position.distance(position) <= distance); } // =========================================================================== function getClientsInRange(position, distance) { return getPlayersInRange(position, distance); } // =========================================================================== function getCiviliansInRange(position, distance) { return getElementsByType(ELEMENT_PED).filter(x => x.position.distance(position) <= distance); } // =========================================================================== function getElementsByTypeInRange(elementType, position, distance) { return getElementsByType(elementType).filter(x => x.position.distance(position) <= distance); } // =========================================================================== function getClosestCivilian(position) { return getElementsByType(ELEMENT_PED).reduce((i, j) => ((i.position.distance(position) <= j.position.distance(position)) ? i : j)); } // =========================================================================== function getClosestPlayer(position, exemptClient) { let clients = getClients(); let closest = 0; for(let i in clients) { if(exemptClient != clients[i]) { if(getDistance(getPlayerPosition(clients[i]), position) < getDistance(getPlayerPosition(clients[closest]), position)) { closest = i; } } } return clients[closest]; } // =========================================================================== function isPlayerMuted(client) { return getPlayerData(client).muted; } // =========================================================================== function getCurrentUnixTimestamp() { return new Date().getTime()/1000; } // =========================================================================== function msToTime(duration) { let milliseconds = Math.floor(toInteger((duration % 1000) / 100)); let seconds = Math.floor(toInteger((duration / 1000) % 60)); let minutes = Math.floor(toInteger((duration / (1000 * 60)) % 60)); let hours = Math.floor(toInteger((duration / (1000 * 60 * 60)) % 24)); let days = Math.floor(toInteger((duration / (1000 * 60 * 60 * 24)) % 365)); //hours = (hours < 10) ? "0" + hours : hours; //minutes = (minutes < 10) ? "0" + minutes : minutes; //seconds = (seconds < 10) ? "0" + seconds : seconds; if (days !== 0) { return `${days} days, ${hours} hours, ${minutes} minutes`; } else { return `${hours} hours, ${minutes} minutes`; } } // =========================================================================== function isSamePlayer(client1, client2) { return (client1 == client2); } // =========================================================================== function getClientFromIndex(index) { let clients = getClients(); for(let i in clients) { if(clients[i].index == index) { return clients[i]; } } } // =========================================================================== function getConsoleClient() { let clients = getClients(); for(let i in clients) { if(isConsole(clients[i])) { return clients[i]; } } } // =========================================================================== function getPlayerFromParams(params) { let clients = getClients(); if(isNaN(params)) { for(let i in clients) { if(!clients[i].console) { if(toLowerCase(clients[i].name).indexOf(toLowerCase(params)) != -1) { return clients[i]; } if(toLowerCase(getCharacterFullName(clients[i])).indexOf(toLowerCase(params)) != -1) { return clients[i]; } } } } else { if(typeof clients[toInteger(params)] != "undefined") { return clients[toInteger(params)]; } } return false; } // =========================================================================== function getPosToRightOfPos(pos, angle, distance) { let x = (pos.x+((Math.cos((-angle+1.57)+(Math.PI/2)))*distance)); let y = (pos.y+((Math.sin((-angle+1.57)+(Math.PI/2)))*distance)); let rightPos = toVector3(x, y, pos.z); return rightPos; } // =========================================================================== function getPosToLeftOfPos(pos, angle, distance) { let x = (pos.x+((Math.cos((angle+1.57)+(Math.PI/2)))*distance)); let y = (pos.y+((Math.sin((angle+1.57)+(Math.PI/2)))*distance)); let leftPos = toVector3(x, y, pos.z); return leftPos; } // =========================================================================== function getPosInFrontOfPos(pos, angle, distance) { let x = (pos.x+((Math.cos(angle+(Math.PI/2)))*distance)); let y = (pos.y+((Math.sin(angle+(Math.PI/2)))*distance)); let z = pos.z; return toVector3(x, y, z); } // =========================================================================== function getPosBehindPos(pos, angle, distance) { let x = (pos.x+((Math.cos(angle-(Math.PI/2)))*distance)); let y = (pos.y+((Math.sin(angle-(Math.PI/2)))*distance)); let z = pos.z; return toVector3(x,y,z); } // =========================================================================== function getPosAbovePos(pos, distance) { return toVector3(pos.x, pos.y, pos.z+distance); } // =========================================================================== function getPosBelowPos(pos, distance) { return toVector3(pos.x, pos.y, pos.z-distance); } // =========================================================================== function applyOffsetToPos(position, position2) { return toVector3(position.x+position2.x, position.y+position2.y, position.z+position2.z); } // =========================================================================== function getRandom(min, max) { return Math.floor(Math.random() * (toInteger(max) - toInteger(min) + 1)) + toInteger(min) } // =========================================================================== function getArrayOfElementId(elements) { let tempArray = []; for(let i in elements) { tempArray.push(elements[i].id); } return tempArray; } // =========================================================================== function getSyncerFromId(syncerId) { let clients = getClients(); return clients[syncerId]; } // =========================================================================== function arrayBufferToString(arrayBuffer) { return String.fromCharCode.apply(null, new Uint8Array(arrayBuffer)); } // =========================================================================== function vec3ToVec2(pos) { return toVector2(pos[0], pos[1]); } // =========================================================================== function vec2ToVec3(pos, z) { return toVector3(pos[0], pos[1], z); } // =========================================================================== function degToRad(deg) { return deg * Math.PI / 180; } // =========================================================================== function radToDeg(rad) { return rad * 180 / Math.PI; } // =========================================================================== function getHeadingFromPosToPos(pos1, pos2) { let x = pos2.x-pos1.x; let y = pos2.y-pos1.y; let rad = Math.atan2(y, x); let deg = radToDeg(rad); deg -= 90; deg = deg % 360; return degToRad(deg); } // =========================================================================== function getAngleInCircleFromCenter(center, total, current) { let gap = 360 / total; let deg = Math.floor(gap*current); if(deg <= 0) { deg = 1; } else { if(deg >= 360) { deg = 359; } } return degToRad(deg); } // =========================================================================== function areParamsEmpty(params) { if(!params || params == "" || params.length == 0 || typeof params == "undefined") { return true; } return false; } // =========================================================================== function getParamsCount(params, delimiter = " ") { return params.split(delimiter).length; } // =========================================================================== function areThereEnoughParams(params, requiredAmount, delimiter = " ") { return (params.split(delimiter).length >= requiredAmount); } // =========================================================================== function getParams(params, delimiter, index) { return params.split(delimiter)[index]; } // =========================================================================== function isConsole(client) { if(client == null) { return false; } return client.console; } // =========================================================================== function updateConnectionLogOnQuit(client, quitReasonId) { quickDatabaseQuery(`UPDATE conn_main SET conn_when_disconnect=UNIX_TIMESTAMP(), conn_how_disconnect=${quitReasonId} WHERE conn_id = ${toInteger(getEntityData(client, "vrr.connection"))}`); } // =========================================================================== function updateConnectionLogOnAuth(client, authId) { quickDatabaseQuery(`UPDATE conn_main SET conn_auth=${authId} WHERE conn_id = ${toInteger(getEntityData(client, "vrr.connection"))}`); } // =========================================================================== function updateConnectionLogOnClientInfoReceive(client, clientVersion, screenWidth, screenHeight) { let dbConnection = connectToDatabase(); if(dbConnection) { let safeClientVersion = escapeDatabaseString(dbConnection, clientVersion); let safeScreenWidth = escapeDatabaseString(dbConnection, toString(screenWidth)); let safeScreenHeight = escapeDatabaseString(dbConnection, toString(screenHeight)); quickDatabaseQuery(`UPDATE conn_main SET conn_client_version='${safeClientVersion}', conn_screen_width='${safeScreenWidth}', conn_screen_height='${safeScreenHeight}' WHERE conn_id = ${toInteger(getEntityData(client, "vrr.connection"))}`); } } // =========================================================================== function generateRandomPhoneNumber() { return getRandom(100000, 999999); } // =========================================================================== function doesNameContainInvalidCharacters(name) { let disallowedCharacters = getGlobalConfig().subAccountNameAllowedCharacters; name = toLowerCase(name); for(let i = 0; i < name.length; i++) { if(disallowedCharacters.toLowerCase().indexOf(name.charAt(i)) == -1) { return true; } } return false; } // =========================================================================== function fixCharacterName(name) { return String(name.charAt(0).toUpperCase()) + String(name.slice(1).toLowerCase()); } // =========================================================================== function splitArrayIntoChunks(originalArray, perChunk) { let tempArray = []; for (let i = 0; i < originalArray.length; i += perChunk) { tempArray.push(originalArray.slice(i, i + perChunk)); } return tempArray; } // =========================================================================== function getAllVehiclesOwnedByPlayer(client) { return getServerData().vehicles.filter(v => v.ownerType == VRR_VEHOWNER_PLAYER && v.ownerId == getPlayerCurrentSubAccount(client)); } // =========================================================================== function getAllBusinessesOwnedByPlayer(client) { return getServerData().businesses.filter(v => v.ownerType == VRR_BIZOWNER_PLAYER && v.ownerId == getPlayerCurrentSubAccount(client)); } // =========================================================================== function getAllHousesOwnedByPlayer(client) { return getServerData().houses.filter(v => v.ownerType == VRR_HOUSEOWNER_PLAYER && v.ownerId == getPlayerCurrentSubAccount(client)); } // ===========================================================================