diff --git a/scripts/server/job.js b/scripts/server/job.js index 00418c05..1eb04da1 100644 --- a/scripts/server/job.js +++ b/scripts/server/job.js @@ -14,7 +14,7 @@ function initJobScript() { createAllJobPickups(); createAllJobBlips(); - setAllJobIndexes(); + setAllJobDataIndexes(); logToConsole(LOG_INFO, "[VRR.Job]: Job script initialized successfully!"); return true; @@ -39,7 +39,7 @@ function loadJobsFromDatabase() { tempJobData.locations = loadJobLocationsFromDatabase(tempJobData.databaseId); tempJobData.equipment = loadJobEquipmentsFromDatabase(tempJobData.databaseId); tempJobData.uniforms = loadJobUniformsFromDatabase(tempJobData.databaseId); - //tempJobData.routes = loadJobRoutesFromDatabase(tempJobData.databaseId); + tempJobData.routes = loadJobRoutesFromDatabase(tempJobData.databaseId); tempJobs.push(tempJobData); logToConsole(LOG_DEBUG, `[VRR.Job]: Job '${tempJobData.name}' loaded from database successfully!`); } @@ -96,14 +96,14 @@ function loadJobRoutesFromDatabase(jobDatabaseId) { let dbAssoc; if(dbConnection) { - dbQuery = queryDatabase(dbConnection, "SELECT * FROM `job_route` WHERE `job_route_enabled` = 1 AND `job_route_job` = " + toString(jobDatabaseId)); + dbQuery = queryDatabase(dbConnection, `SELECT * FROM job_route WHERE job_route_enabled = 1 AND job_route_job = ${jobDatabaseId}`); if(dbQuery) { if(dbQuery.numRows > 0) { while(dbAssoc = fetchQueryAssoc(dbQuery)) { - let tempJobRouteData = new JobEquipmentData(dbAssoc); + let tempJobRouteData = new JobRouteData(dbAssoc); tempJobRouteData.locations = loadJobRouteLocationsFromDatabase(tempJobRouteData.databaseId); tempJobRoutes.push(tempJobRouteData); - logToConsole(LOG_DEBUG, `[VRR.Job]: Job equipment '${tempJobRouteData.name}' loaded from database successfully!`); + logToConsole(LOG_DEBUG, `[VRR.Job]: Job route '${tempJobRouteData.name}' loaded from database successfully!`); } } freeDatabaseQuery(dbQuery); @@ -126,7 +126,7 @@ function loadJobRouteLocationsFromDatabase(jobRouteId) { let dbAssoc; if(dbConnection) { - dbQuery = queryDatabase(dbConnection, "SELECT * FROM `job_route_loc` WHERE `job_route_loc_enabled` = 1 AND `job_route_loc_route` = " + toString(jobRouteId)); + dbQuery = queryDatabase(dbConnection, `SELECT * FROM job_route_loc WHERE job_route_loc_enabled = 1 AND job_route_loc_route = ${jobRouteId}`); if(dbQuery) { if(dbQuery.numRows > 0) { while(dbAssoc = fetchQueryAssoc(dbQuery)) { @@ -141,7 +141,7 @@ function loadJobRouteLocationsFromDatabase(jobRouteId) { } logToConsole(LOG_DEBUG, `[VRR.Job]: ${tempJobRouteLocations.length} locations for job route ${jobRouteId} loaded from database successfully!`); - return tempJobEquipmentItems; + return tempJobRouteLocations; } // =========================================================================== @@ -631,6 +631,7 @@ function stopWorking(client) { deleteJobItems(client); restorePlayerJobLockerItems(client); respawnJobVehicle(client); + sendPlayerStopJobRoute(client); let jobId = getPlayerJob(client); switch(getJobType(jobId)) { @@ -963,6 +964,8 @@ function createJob(name) { tempJobData.pickupModel = getGameData().pickupModels[getGame()].job; getServerData().jobs.push(tempJobData); + saveJobToDatabase(tempJobData); + setAllJobDataIndexes(); } // =========================================================================== @@ -992,15 +995,8 @@ function deleteJobLocationCommand(command, params, client) { messageAdmins(`{ALTCOLOUR}${getPlayerName(client)} {MAINCOLOUR}deleted location {ALTCOLOUR}${closestJobLocation.index} (DB ID ${closestJobLocation.databaseId}) {MAINCOLOUR}for the {jobYellow}${getJobData(closestJobLocation.jobIndex).name} {MAINCOLOUR}job`); - if(closestJobLocation.databaseId > 0) { - quickDatabaseQuery(`DELETE FROM job_loc WHERE job_loc_id = ${closestJobLocation.databaseId}`); - } - - let tempIndex = closestJobLocation.index; - let tempJob = closestJobLocation.job; deleteJobLocation(closestJobLocation); - getJobData(getJobIdFromDatabaseId(tempJob)).locations.splice(tempIndex, 1); } // =========================================================================== @@ -1150,7 +1146,7 @@ function setJobPickupCommand(command, params, client) { // =========================================================================== function toggleJobRouteEnabledCommand(command, params, client) { - let jobId = getPlayerJobRoute(client); + let jobId = getPlayerJob(client); let jobRoute = getPlayerJobRoute(client); let clients = getClients(); @@ -1187,7 +1183,7 @@ function setJobRouteNameCommand(command, params, client) { return false; } - let jobId = getPlayerJobRoute(client); + let jobId = getPlayerJob(client); let jobRoute = getPlayerJobRoute(client); let oldName = getJobData(jobId).routes[jobRoute].name; @@ -1197,6 +1193,41 @@ function setJobRouteNameCommand(command, params, client) { // =========================================================================== +function setJobRouteAllLocationDelaysCommand(command, params, client) { + if(!isPlayerWorking(client)) { + messagePlayerError(client, getLocaleString(client, "NeedToBeWorking", "{ALTCOLOUR}/startwork{MAINCOLOUR}")); + return false; + } + + if(!isPlayerOnJobRoute(client)) { + messagePlayerError(client, getLocaleString(client, "NeedToBeOnJobRoute", "{ALTCOLOUR}/startroute{MAINCOLOUR}")); + return false; + } + + if(areParamsEmpty(params)) { + messagePlayerSyntax(client, getCommandSyntaxText(command)); + return false; + } + + let jobId = getPlayerJob(client); + let jobRoute = getPlayerJobRoute(client); + let delay = getParam(params, " ", 1); + + if(isNaN(delay)) { + messagePlayerError(client, getLocaleString(client, "TimeNotNumber")) + return false; + } + + for(let i in getJobData(jobId).routes[jobRoute].locations) { + getJobData(jobId).routes[jobRoute].locations[i].stopDelay = delay; + getJobData(jobId).routes[jobRoute].locations[i].needsSaved = true; + } + + messageAdmins(`${getPlayerName(client)} {MAINCOLOUR}${getEnabledDisabledFromBool(getJobData(jobId).enabled)}{MAINCOLOUR} set route {ALTCOLOUR}${oldName}{MAINCOLOUR} location's stop delays to {ALTCOLOUR}${delay/1000}{MAINCOLOUR} seconds for the {jobYellow}${getJobData(jobId).name}{MAINCOLOUR} job`); +} + +// =========================================================================== + function setJobRouteVehicleColoursCommand(command, params, client) { if(!isPlayerWorking(client)) { messagePlayerError(client, getLocaleString(client, "NeedToBeWorking", "{ALTCOLOUR}/startwork{MAINCOLOUR}")); @@ -1213,14 +1244,14 @@ function setJobRouteVehicleColoursCommand(command, params, client) { return false; } - let jobId = getPlayerJobRoute(client); + let jobId = getPlayerJob(client); let jobRoute = getPlayerJobRoute(client); let colour1 = getParam(params, " ", 1); let colour2 = getParam(params, " ", 2); - getJobData(jobId).routes[jobRoute].vehicleColour1 = colour1; - getJobData(jobId).routes[jobRoute].vehicleColour1 = colour2; + getJobData(jobId).routes[jobRoute].vehicleColour1 = toInteger(colour1); + getJobData(jobId).routes[jobRoute].vehicleColour1 = toInteger(colour2); getJobData(jobId).routes[jobRoute].needsSaved = true; let clients = getClients(); @@ -1228,7 +1259,7 @@ function setJobRouteVehicleColoursCommand(command, params, client) { if(isPlayerWorking(clients[i])) { if(isPlayerOnJobRoute(clients[i])) { if(getPlayerJob(clients[i]) == jobId && getPlayerJobRoute(clients[i]) == jobRoute) { - setVehicleColours(getPlayerJobVehicle(clients[i]), getJobRouteData(getPlayerJob(clients[i], getPlayerJobRoute(clients[i])).vehicleColour1, getJobRouteData(getPlayerJob(clients[i], getPlayerJobRoute(clients[i])).vehicleColour2, 1, 1))); + setVehicleColours(getPlayerVehicle(clients[i]), getJobRouteData(getPlayerJob(clients[i]), getPlayerJobRoute(clients[i])).vehicleColour1, toInteger(colour1), toInteger(colour2), 1, 1); messagePlayerAlert(clients[i], ); messagePlayerAlert(clients[i], getLocaleString(client, "CurrentJobRouteVehicleColoursChanged")); } @@ -1257,7 +1288,7 @@ function setJobRouteFinishMessageCommand(command, params, client) { return false; } - let jobId = getPlayerJobRoute(client); + let jobId = getPlayerJob(client); let jobRoute = getPlayerJobRoute(client); getJobData(jobId).routes[jobRoute].finishMessage = params; @@ -1283,7 +1314,7 @@ function setJobRouteStartMessageCommand(command, params, client) { return false; } - let jobId = getPlayerJobRoute(client); + let jobId = getPlayerJob(client); let jobRoute = getPlayerJobRoute(client); getJobData(jobId).routes[jobRoute].startMessage = params; @@ -1309,7 +1340,7 @@ function setJobRouteLocationArriveMessageCommand(command, params, client) { return false; } - let jobId = getPlayerJobRoute(client); + let jobId = getPlayerJob(client); let jobRoute = getPlayerJobRoute(client); getJobData(jobId).routes[jobRoute].locationArriveMessage = params; @@ -1335,7 +1366,7 @@ function setJobRouteLocationNextMessageCommand(command, params, client) { return false; } - let jobId = getPlayerJobRoute(client); + let jobId = getPlayerJob(client); let jobRoute = getPlayerJobRoute(client); getJobData(jobId).routes[jobRoute].locationNextMessage = params; @@ -1361,7 +1392,7 @@ function setJobRoutePayCommand(command, params, client) { return false; } - let jobId = getPlayerJobRoute(client); + let jobId = getPlayerJob(client); let jobRoute = getPlayerJobRoute(client); let amount = getParam(params, " ", 1); @@ -1547,7 +1578,7 @@ function jobStartRouteCommand(command, params, client) { } if(getJobData(getPlayerJob(client)).routes.length == 0) { - messagePlayerError(client, "Your job doesn't have any routes!"); + messagePlayerError(client, "Your job doesn't have any routes for this location!"); return false; } @@ -1556,7 +1587,22 @@ function jobStartRouteCommand(command, params, client) { return false; } - startJobRoute(client); + if(isPlayerOnJobRoute(client)) { + messagePlayerError(client, "You're already on a job route! Finish the route or use /stoproute"); + return false; + } + + let forceRoute = -1; + if(doesPlayerHaveStaffPermission(client, getStaffFlagValue("ManageJobs"))) { + if(!areParamsEmpty(params)) { + let tempRoute = getJobRouteFromParams(params, getPlayerJob(client)); + if(tempRoute != false) { + forceRoute = tempRoute; + } + } + } + + startJobRoute(client, forceRoute); return true; } @@ -1573,17 +1619,17 @@ function jobStopRouteCommand(command, params, client) { return false; } - if(!doesPlayerHaveJobType(client, VRR_JOB_BUS) && !doesPlayerHaveJobType(client, VRR_JOB_GARBAGE)) { - messagePlayerError(client, "Your job doesn't use a route!"); - return false; - } + //if(!doesPlayerHaveJobType(client, VRR_JOB_BUS) && !doesPlayerHaveJobType(client, VRR_JOB_GARBAGE)) { + // messagePlayerError(client, "Your job doesn't use a route!"); + // return false; + //} if(!isPlayerOnJobRoute(client)) { messagePlayerError(client, "You aren't on a job route!"); return false; } - stopJobRoute(client); + stopJobRoute(client, false, false); return true; } @@ -1611,38 +1657,65 @@ function isPlayerWorking(client) { // =========================================================================== -function startJobRoute(client) { - let jobRoute = getRandomJobRoute(getClosestJobLocationForJob(getPlayerPosition(client), getPlayerJob(client))); +function startJobRoute(client, forceRoute = -1) { + let jobId = getPlayerJob(client); + let jobRoute = 0; + + if(forceRoute == -1) { + jobRoute = getRandomJobRouteForLocation(getClosestJobLocationForJob(getPlayerPosition(client), jobId)); + } else { + jobRoute = forceRoute; + } + + if(jobRoute == -1) { + messagePlayerError(client, `There are no routes for this location.`); + return false; + } + + logToConsole(LOG_DEBUG, `${getPlayerDisplayForConsole(client)} is starting job route ${jobRoute} for job ${jobId}`); + getPlayerData(client).jobRoute = jobRoute; - getPlayerData(client).jobRouteStop = 0; + getPlayerData(client).jobRouteLocation = 0; getPlayerData(client).jobRouteVehicle = getPlayerVehicle(client); - getPlayerVehicle(client).colour1 = getJobRouteData(getPlayerJob(client), jobRoute).vehicleColour1; - getPlayerVehicle(client).colour2 = getJobRouteData(getPlayerJob(client), jobRoute).vehicleColour2; - if(getJobRouteData(getPlayerJob(client), jobRoute).locations.length > 0) { - showCurrentJobStop(client); - } - messagePlayerNormal(client, getJobRouteData(getPlayerJob(client), jobRoute).startMessage); + + getPlayerVehicle(client).colour1 = getJobRouteData(jobId, jobRoute).vehicleColour1; + getPlayerVehicle(client).colour2 = getJobRouteData(jobId, jobRoute).vehicleColour2; + + messagePlayerNormal(client, getJobRouteData(jobId, jobRoute).startMessage); + if(getJobRouteData(jobId, jobRoute).locations.length > 0) { + showCurrentJobLocation(client); + } else { + messagePlayerError(client, `There are no locations for this route.`); + } } // =========================================================================== function stopJobRoute(client, successful = false, alertPlayer = true) { + let jobId = getPlayerJob(client); + + if(alertPlayer) { + messagePlayerAlert(client, replaceJobRouteStringsInMessage(getJobRouteData(jobId, getPlayerJobRoute(client)).finishMessage), jobId, getPlayerJobRoute(client)); + } + + if(successful == true) { + finishSuccessfulJobRoute(client); + return false; + } + stopReturnToJobVehicleCountdown(client); sendPlayerStopJobRoute(client); respawnVehicle(getPlayerData(client).jobRouteVehicle); - getPlayerData(client).jobRouteVehicle = false; - getPlayerData(client).jobRoute = false; - getPlayerData(client).jobRouteStop = false; - if(alertPlayer) { - messagePlayerAlert(client, getJobRouteData(getPlayerJob(client), jobRoute).finishMessage); - } + getPlayerData(client).jobRouteVehicle = false; + getPlayerData(client).jobRoute = -1; + getPlayerData(client).jobRouteLocation = -1; } // =========================================================================== function isPlayerOnJobRoute(client) { - if(getPlayerData(client).jobRoute != false) { + if(getPlayerData(client).jobRoute != -1) { return true; } @@ -1718,23 +1791,30 @@ function canPlayerUseJob(client, jobId) { // =========================================================================== function deleteJobLocation(jobLocationData) { - if(jobLocationData.pickup) { - deleteGameElement(jobLocationData.pickup); + if(jobLocationData.databaseId > 0) { + quickDatabaseQuery(`DELETE FROM job_loc WHERE job_loc_id = ${jobLocationData.databaseId}`); } + + deleteJobLocationBlip(tempJob, tempLocation); + deleteJobLocationPickup(tempJob, tempLocation); + getJobData(getJobIdFromDatabaseId(tempJob)).locations.splice(tempLocation, 1); + setAllJobDataIndexes(); } // =========================================================================== -function freezeJobVehicleForRouteStop(client) { +function freezePlayerJobVehicleForRouteLocation(client) { getVehicleData(getPlayerVehicle(client)).engine = false; - getPlayerVehicle(client).engine = false; + setVehicleEngine(getPlayerVehicle(client), getVehicleData(getPlayerVehicle(client)).engine); + //setPlayerControlState(client, false); } // =========================================================================== -function unFreezeJobVehicleForRouteStop(client) { +function unFreezePlayerJobVehicleForRouteLocation(client) { getVehicleData(getPlayerVehicle(client)).engine = true; - getPlayerVehicle(client).engine = true; + setVehicleEngine(getPlayerVehicle(client), getVehicleData(getPlayerVehicle(client)).engine); + //setPlayerControlState(client, true); } // =========================================================================== @@ -1823,7 +1903,7 @@ function saveJobToDatabase(jobData) { return false; } - if(!jobData.needsSaved) { + if(jobData.needsSaved == false) { logToConsole(LOG_DEBUG, `[VRR.Job]: Job ${jobData.name} doesn't need saved. Skipping ...`); return false; } @@ -1876,8 +1956,8 @@ function saveJobRouteToDatabase(jobRouteData) { return false; } - if(!jobRouteData.needsSaved) { - logToConsole(LOG_DEBUG, `[VRR.Job]: Job route ${jobRouteData.name} (${jobRouteData.databaseId}) doesn't need saved. Skipping ...`); + if(jobRouteData.needsSaved == false) { + logToConsole(LOG_DEBUG, `[VRR.Job]: Job route ${jobRouteData.name} (DB ID ${jobRouteData.databaseId}) doesn't need saved. Skipping ...`); return false; } @@ -1895,8 +1975,8 @@ function saveJobRouteToDatabase(jobRouteData) { ["job_route_job_loc", jobRouteData.locationId], ["job_route_enabled", boolToInt(jobRouteData.enabled)], ["job_route_name", safeName], - ["job_route_col1_r", jobRouteData.vehicleColour1], - ["job_route_col2_r", jobRouteData.vehicleColour2], + ["job_route_veh_colour1", jobRouteData.vehicleColour1], + ["job_route_veh_colour2", jobRouteData.vehicleColour2], ["job_route_start_msg", safeStartMessage], ["job_route_finish_msg", safeFinishMessage], ["job_route_loc_arrive_msg", safeLocationArriveMessage], @@ -1927,14 +2007,14 @@ function saveJobRouteToDatabase(jobRouteData) { // =========================================================================== -function saveJobRouteLocationsToDatabase(jobRouteLocationData) { +function saveJobRouteLocationToDatabase(jobRouteLocationData) { if(!jobRouteLocationData) { // Invalid job route position data return false; } - if(!jobRouteLocationData.needsSaved) { - logToConsole(LOG_DEBUG, `[VRR.Job]: Job route location ${jobRouteLocationData.name} (${jobRouteLocationData.databaseId}) doesn't need saved. Skipping ...`); + if(jobRouteLocationData.needsSaved == false) { + logToConsole(LOG_DEBUG, `[VRR.Job]: Job route location ${jobRouteLocationData.name} (DB ID ${jobRouteLocationData.databaseId}) doesn't need saved. Skipping ...`); return false; } @@ -1951,7 +2031,7 @@ function saveJobRouteLocationsToDatabase(jobRouteLocationData) { ["job_route_loc_z", jobRouteLocationData.position.z], ["job_route_loc_pay", jobRouteLocationData.pay], ["job_route_loc_delay", jobRouteLocationData.stopDelay], - ["job_route_loc_prev", jobRouteLocationData.previousStop] + ]; let dbQuery = null; @@ -2177,7 +2257,7 @@ function saveAllJobsToDatabase() { for(let p in getServerData().jobs[i].routes) { saveJobRouteToDatabase(getServerData().jobs[i].routes[p]); - for(let q in getServerData().jobs[i].routes[p].routes) { + for(let q in getServerData().jobs[i].routes[p].locations) { saveJobRouteLocationToDatabase(getServerData().jobs[i].routes[p].locations[q]); } } @@ -2325,12 +2405,32 @@ function isPlayerOnJobBlackList(client, jobId) { // =========================================================================== -function playerArrivedAtJobRouteStop(client) { +function playerArrivedAtJobRouteLocation(client) { + let jobId = getPlayerJob(client); + if(!isPlayerOnJobRoute(client)) { return false; } - playerArrivedAtJobRouteLocationStop(client); + if(isLastLocationOnJobRoute(jobId, getPlayerJobRoute(client), getPlayerJobRouteLocation(client))) { + finishSuccessfulJobRoute(client); + return false; + } + + showGameMessage(client, removeColoursInMessage(getJobRouteData(jobId, getPlayerJobRoute(client)).locationArriveMessage), getJobData(jobId).colour, 3500); + if(getJobRouteLocationData(jobId, getPlayerJobRoute(client),getPlayerJobRouteLocation(client)).stopDelay > 0) { + freezePlayerJobVehicleForRouteLocation(client); + getPlayerData(client).jobRouteLocation = getNextLocationOnJobRoute(jobId, getPlayerJobRoute(client), getPlayerJobRouteLocation(client)); + setTimeout(function() { + showCurrentJobLocation(client); + showGameMessage(client, removeColoursInMessage(getJobRouteData(jobId, getPlayerJobRoute(client)).locationNextMessage), getJobData(jobId).colour, 3500); + unFreezePlayerJobVehicleForRouteLocation(client); + }, getJobRouteLocationData(jobId, getPlayerJobRoute(client),getPlayerJobRouteLocation(client)).stopDelay); + } else { + getPlayerData(client).jobRouteLocation = getNextLocationOnJobRoute(jobId, getPlayerJobRoute(client), getPlayerJobRouteLocation(client)); + showCurrentJobLocation(client); + showGameMessage(client, removeColoursInMessage(getJobRouteData(jobId, getPlayerJobRoute(client)).locationNextMessage), getJobData(jobId).colour, 3500); + } } // =========================================================================== @@ -2458,7 +2558,7 @@ function createJobRouteLocationCommand(command, params, client) { let routeId = getPlayerData(client).jobRoute; let jobRouteData = getServerData().jobs[jobId].routes[routeId]; - let routeLocationName = getParam(params, " ", 1); + let routeLocationName = params; createJobRouteLocation(routeLocationName, getPlayerPosition(client), jobRouteData); messageAdmins(`${getPlayerName(client)}{MAINCOLOUR} created location {ALTCOLOUR}${routeLocationName}{MAINCOLOUR} for route {ALTCOLOUR}${jobRouteData.name}{MAINCOLOUR} for job {jobYellow}${getJobData(jobId).name}`); @@ -2477,26 +2577,30 @@ function createJobRoute(routeName, closestJobLocation) { tempJobRouteData.vehicleColour1 = 1; tempJobRouteData.vehicleColour2 = 1; tempJobRouteData.pay = 500; - tempJobRouteData.startMessage = `You are now on route {ALTCOLOUR}${routeName}{MAINCOLOUR} for the {jobYellow}${getJobData(closestJobLocation.jobIndex).name} job!`; - tempJobRouteData.finishMessage = `You have finished route {ALTCOLOUR}${routeName}{MAINCOLOUR} for the {jobYellow}${getJobData(closestJobLocation.jobIndex).name} job, and will receive $${tempJobRouteData.pay} next payday!`; - tempJobRouteData.locationArriveMessage = `You arrived at a point in job route {ALTCOLOUR}${routeName}{MAINCOLOUR}.`; - tempJobRouteData.locationNextMessage = `Drive to the next point on the route (looking for the blinking dot on the map).`; + tempJobRouteData.jobIndex = closestJobLocation.jobIndex; + tempJobRouteData.startMessage = `You are now on route {ALTCOLOUR}{JOBROUTENAME}{MAINCOLOUR} for the {jobYellow}{JOBNAME}{MAINCOLOUR} job!`; + tempJobRouteData.finishMessage = `You have finished the {ALTCOLOUR}{JOBROUTENAME}{MAINCOLOUR} route and {ALTCOLOUR}{JOBROUTEPAY}{MAINCOLOUR} has been added to your next paycheck!`; + tempJobRouteData.locationArriveMessage = `You arrived at a stop.`; + tempJobRouteData.locationNextMessage = `Drive to the next stop.`; getJobData(closestJobLocation.jobIndex).routes.push(tempJobRouteData); + saveJobRouteToDatabase(tempJobRouteData); setAllJobDataIndexes(); } // =========================================================================== function createJobRouteLocation(routeLocationName, position, jobRouteData) { - let tempJobRouteData = new JobRouteData(false); + let tempJobRouteLocationData = new JobRouteLocationData(false); tempJobRouteLocationData.name = routeLocationName; - tempJobRouteLocationData.jobRoute = jobRouteData.databaseId; + tempJobRouteLocationData.routeId = jobRouteData.databaseId; tempJobRouteLocationData.enabled = true; tempJobRouteLocationData.needsSaved = true; tempJobRouteLocationData.position = position; + tempJobRouteLocationData.routeIndex = jobRouteData.index; - getJobData(jobRouteData.jobIndex).routes[jobRouteData.index].push(tempJobRouteLocationData); + getJobData(jobRouteData.jobIndex).routes[jobRouteData.index].locations.push(tempJobRouteLocationData); + saveJobRouteLocationToDatabase(tempJobRouteLocationData); setAllJobDataIndexes(); } @@ -2505,7 +2609,7 @@ function createJobRouteLocation(routeLocationName, position, jobRouteData) { function deleteJobRouteLocationCommand(command, params, client) { let closestJobRouteLocation = getClosestJobRouteLocation(getPlayerPosition(client)); - messageAdmins(`{ALTCOLOUR}${getPlayerName(client)} {MAINCOLOUR}deleted route location {ALTCOLOUR}${closestJobRouteLocation.index} (DB ID ${closestJobRouteLocation.databaseId}) {MAINCOLOUR}for the {ALTCOLOUR}${closestJobRouteLocation.name}{jobYellow} route of the ${getJobData(closestJobLocation.jobIndex).name} {MAINCOLOUR}job`); + messageAdmins(`{ALTCOLOUR}${getPlayerName(client)}{MAINCOLOUR} deleted route location {ALTCOLOUR}${closestJobRouteLocation.index} (DB ID ${closestJobRouteLocation.databaseId}){MAINCOLOUR} for the {ALTCOLOUR}${closestJobRouteLocation.name}{jobYellow} route of the {jobYellow}${getJobData(closestJobLocation.jobIndex).name}{MAINCOLOUR} job`); if(closestJobRouteLocation.databaseId > 0) { quickDatabaseQuery(`DELETE FROM job_route_loc WHERE job_route_loc_id = ${closestJobRouteLocation.databaseId}`); @@ -2516,6 +2620,7 @@ function deleteJobRouteLocationCommand(command, params, client) { getJobData(getJobIdFromDatabaseId(tempJob)).routes[tempJobRoute].locations.splice(tempIndex, 1); setAllJobDataIndexes(); + collectAllGarbage(); } // =========================================================================== @@ -2524,6 +2629,10 @@ function deleteJobRouteCommand(command, params, client) { let jobId = getPlayerJob(client); let jobRoute = getPlayerData(client).jobRoute; + if(!areParamsEmpty(client)) { + jobRoute = getJobRouteFromParams(params); + } + let jobRouteData = getServerData().jobs[jobId].routes[jobRoute]; let clients = getClients(); @@ -2538,10 +2647,12 @@ function deleteJobRouteCommand(command, params, client) { } } - messageAdmins(`{ALTCOLOUR}${getPlayerName(client)} {MAINCOLOUR}deleted route {ALTCOLOUR}${jobRouteData.name} (DB ID ${jobRouteData.databaseId}) {MAINCOLOUR}for the ${getJobData(jobId).name} {MAINCOLOUR}job`); + messageAdmins(`{ALTCOLOUR}${getPlayerName(client)}{MAINCOLOUR} deleted route {ALTCOLOUR}${jobRouteData.name} (DB ID ${jobRouteData.databaseId}) {MAINCOLOUR}for the {jobYellow}${getJobData(jobId).name}{MAINCOLOUR} job`); - quickDatabaseQuery(`DELETE FROM job_route_loc WHERE job_route_loc_route = ${jobRouteData.databaseId}`); - quickDatabaseQuery(`DELETE FROM job_route WHERE job_route_id = ${jobRouteData.databaseId}`); + if(jobRouteData.databaseId > 0) { + quickDatabaseQuery(`DELETE FROM job_route WHERE job_route_id = ${jobRouteData.databaseId}`); + quickDatabaseQuery(`DELETE FROM job_route_loc WHERE job_route_loc_route = ${jobRouteData.databaseId}`); + } clearArray(getServerData().jobs[jobId].routes[jobRoute].locations); getServerData().jobs[jobId].routes.splice(jobRoute, 1); @@ -2552,44 +2663,6 @@ function deleteJobRouteCommand(command, params, client) { // =========================================================================== -function setAllJobIndexes() { - for(let i in getServerData().jobs) { - getServerData().jobs[i].index = i; - - for(let j in getServerData().jobs[i].locations) { - getServerData().jobs[i].locations[j].index = j; - getServerData().jobs[i].locations[j].jobIndex = i; - } - - for(let k in getServerData().jobs[i].uniforms) { - getServerData().jobs[i].uniforms[k].index = k; - getServerData().jobs[i].uniforms[k].jobIndex = i; - } - - for(let m in getServerData().jobs[i].equipment) { - getServerData().jobs[i].equipment[m].index = m; - getServerData().jobs[i].equipment[m].jobIndex = i; - - for(let n in getServerData().jobs[i].equipment[m].items) { - getServerData().jobs[i].equipment[m].items[n].index = n; - getServerData().jobs[i].equipment[m].items[n].equipmentIndex = m; - } - } - - for(let p in getServerData().jobs[i].routes) { - getServerData().jobs[i].routes[j].index = p; - getServerData().jobs[i].routes[j].jobIndex = i; - - for(let q in getServerData().jobs[i].routes[p].locations) { - getServerData().jobs[i].routes[p].items[q].index = n; - getServerData().jobs[i].routes[p].items[q].routeIndex = p; - } - } - } -} - -// =========================================================================== - function getJobFromParams(params) { if(isNaN(params)) { for(let i in getServerData().jobs) { @@ -2664,9 +2737,13 @@ function getPlayerJobVehicle(client) { // =========================================================================== -function getRandomJobRoute(closestJobLocation) { - let randomRoute = getRandom(0, closestJobLocation.routeCache.length-1); - return getJobData(closestJobLocation.jobIndex).routes[randomRoute].index; +function getRandomJobRouteForLocation(closestJobLocation) { + if(closestJobLocation.routeCache.length > 0) { + let randomRoute = getRandom(0, closestJobLocation.routeCache.length-1); + let routeId = closestJobLocation.routeCache[randomRoute]; + return getJobRouteData(closestJobLocation.jobIndex, routeId).index; + } + return -1; } // =========================================================================== @@ -2682,6 +2759,17 @@ function getJobRouteData(jobId, routeId) { // =========================================================================== +/** + * @param {number} jobIndex - The data index of the job + * @param {number} routeIndex - The data index of the job route + * @return {JobRouteLocationData} The jobroutes's data (class instance) + */ + function getJobRouteLocationData(jobId, routeId, routeLocationId) { + return getServerData().jobs[jobId].routes[routeId].locations[routeLocationId]; +} + +// =========================================================================== + function getClosestJobLocationForJob(position, jobId) { let closestJobLocation = false; for(let i in getServerData().jobs[jobId].locations) { @@ -2690,4 +2778,101 @@ function getClosestJobLocationForJob(position, jobId) { } } return closestJobLocation; -} \ No newline at end of file +} + +// =========================================================================== + +function getPlayerJobRoute(client) { + return getPlayerData(client).jobRoute; +} + +// =========================================================================== + +function getPlayerJobRouteLocation(client) { + return getPlayerData(client).jobRouteLocation; +} + +// =========================================================================== + +function showCurrentJobLocation(client) { + let jobId = getPlayerJob(client); + sendJobRouteLocationToPlayer(client, getJobRouteLocationData(jobId, getPlayerJobRoute(client), getPlayerJobRouteLocation(client)).position, getJobData(jobId).colour); +} + +// =========================================================================== + +function finishSuccessfulJobRoute(client) { + let jobId = getPlayerJob(client); + let jobRouteData = getJobRouteData(jobId, getPlayerJobRoute(client)); + let payout = toInteger(applyServerInflationMultiplier(jobRouteData.pay)); + getPlayerData(client).payDayAmount = getPlayerData(client).payDayAmount + payout; + + messagePlayerSuccess(client, replaceJobRouteStringsInMessage(jobRouteData.finishMessage, jobId, jobRouteData.index)); + + stopReturnToJobVehicleCountdown(client); + sendPlayerStopJobRoute(client); + respawnVehicle(getPlayerData(client).jobRouteVehicle); + + getPlayerData(client).jobRouteVehicle = false; + getPlayerData(client).jobRoute = -1; + getPlayerData(client).jobRouteLocation = -1; +} + +// =========================================================================== + +function getNextLocationOnJobRoute(jobId, routeId, currentLocationId) { + if(!isLastLocationOnJobRoute(jobId, routeId, currentLocationId)) { + return currentLocationId+1; + } else { + return getJobRouteData(jobId, routeId).locations.length-1; + } +} + +// =========================================================================== + +function isLastLocationOnJobRoute(jobId, routeId, currentLocationId) { + if(currentLocationId == getJobRouteData(jobId, routeId).locations.length-1) { + return true; + } + return false; +} + +// =========================================================================== + +function getJobRouteFromParams(params, jobId) { + if(isNaN(params)) { + for(let i in getServerData().jobs[jobId].routes) { + if(toLowerCase(getServerData().jobs[jobId].routes[i].name).indexOf(toLowerCase(params)) != -1) { + return i; + } + } + } else { + if(typeof getServerData().jobs[jobId].routes[params] != "undefined") { + return toInteger(params); + } + } + + return false; +} + +// =========================================================================== + +function replaceJobRouteStringsInMessage(messageText, jobId, jobRouteId) { + let tempJobRouteData = getJobRouteData(jobId, jobRouteId); + + let tempFind = `{JOBROUTENAME}`; + let tempRegex = new RegExp(tempFind, 'g'); + messageText = messageText.replace(tempRegex, tempJobRouteData.name); + + tempFind = `{JOBROUTEPAY}`; + tempRegex = new RegExp(tempFind, 'g'); + messageText = messageText.replace(tempRegex, `$${tempJobRouteData.pay}`); + + tempFind = `{JOBNAME}`; + tempRegex = new RegExp(tempFind, 'g'); + messageText = messageText.replace(tempRegex, getJobData(tempJobRouteData.jobIndex).name); + + return messageText; +} + +// =========================================================================== \ No newline at end of file