diff --git a/scripts/server/business.js b/scripts/server/business.js index 8ed360fe..e8b1659b 100644 --- a/scripts/server/business.js +++ b/scripts/server/business.js @@ -894,98 +894,45 @@ function saveBusinessToDatabase(businessId) { let dbConnection = connectToDatabase(); if(dbConnection) { let safeBusinessName = escapeDatabaseString(dbConnection, tempBusinessData.name); - if(tempBusinessData.databaseId == 0) { - let dbQueryString = `INSERT INTO biz_main ( - biz_server, - biz_name, - biz_owner_type, - biz_owner_id, - biz_locked, - biz_entrance_fee, - biz_till, - biz_entrance_pos_x, - biz_entrance_pos_y, - biz_entrance_pos_z, - biz_entrance_rot_z, - biz_entrance_int, - biz_entrance_vw, - biz_entrance_pickup, - biz_entrance_blip, - biz_exit_pos_x, - biz_exit_pos_y, - biz_exit_pos_z, - biz_exit_rot_z, - biz_exit_int, - biz_exit_vw, - biz_exit_pickup, - biz_exit_blip, - biz_has_interior - ) VALUES ( - ${getServerId()}, - '${safeBusinessName}', - ${tempBusinessData.ownerType}, - ${tempBusinessData.ownerId}, - ${boolToInt(tempBusinessData.locked)}, - ${tempBusinessData.entranceFee}, - ${tempBusinessData.till}, - ${tempBusinessData.entrancePosition.x}, - ${tempBusinessData.entrancePosition.y}, - ${tempBusinessData.entrancePosition.z}, - ${tempBusinessData.entranceRotation}, - ${tempBusinessData.entranceInterior}, - ${tempBusinessData.entranceDimension}, - ${tempBusinessData.entrancePickupModel}, - ${tempBusinessData.entranceBlipModel}, - ${tempBusinessData.exitPosition.x}, - ${tempBusinessData.exitPosition.y}, - ${tempBusinessData.exitPosition.z}, - ${tempBusinessData.exitRotation}, - ${tempBusinessData.exitInterior}, - ${tempBusinessData.databaseId+getGlobalConfig().businessDimensionStart}, - ${tempBusinessData.exitPickupModel}, - ${tempBusinessData.exitBlipModel}, - ${boolToInt(tempBusinessData.hasInterior)} - )`; - dbQueryString = dbQueryString.replace(/(?:\r\n|\r|\n|\t)/g, ""); - queryDatabase(dbConnection, dbQueryString); + let data = [ + ["biz_server", getServerId()], + ["biz_name", safeBusinessName], + ["biz_owner_type", tempBusinessData.ownerType], + ["biz_owner_id", tempBusinessData.ownerId], + ["biz_locked", boolToInt(tempBusinessData.locked)], + ["biz_entrance_fee", tempBusinessData.entranceFee], + ["biz_till", tempBusinessData.till], + ["biz_entrance_pos_x", tempBusinessData.entrancePosition.x], + ["biz_entrance_pos_y", tempBusinessData.entrancePosition.x], + ["biz_entrance_pos_z", tempBusinessData.entrancePosition.z], + ["biz_entrance_rot_z", tempBusinessData.entranceRotation], + ["biz_entrance_int", tempBusinessData.entranceInterior], + ["biz_entrance_vw", tempBusinessData.entranceDimension], + ["biz_entrance_pickup", tempBusinessData.entrancePickupModel], + ["biz_entrance_blip", tempBusinessData.entranceBlipModel], + ["biz_exit_pos_x", tempBusinessData.exitPosition.x], + ["biz_exit_pos_y", tempBusinessData.exitPosition.y], + ["biz_exit_pos_z", tempBusinessData.exitPosition.z], + ["biz_exit_rot_z", tempBusinessData.exitRotation], + ["biz_exit_int", tempBusinessData.exitInterior], + ["biz_exit_vw", tempBusinessData.databaseId+getGlobalConfig().businessDimensionStart], + ["biz_exit_pickup", tempBusinessData.exitPickupModel], + ["biz_exit_blip", tempBusinessData.exitBlipModel], + ["biz_has_interior", boolToInt(tempBusinessData.hasInterior)], + ]; + + let dbQuery = null; + if(tempBusinessData.databaseId == 0) { + let queryString = createDatabaseInsertQuery("biz_main", data); + dbQuery = queryDatabase(dbConnection, queryString); getServerData().businesses[businessId].databaseId = getDatabaseInsertId(dbConnection); } else { - - let dbQueryString = - `UPDATE biz_main SET - biz_name='${safeBusinessName}', - biz_owner_type=${tempBusinessData.ownerType}, - biz_owner_id=${tempBusinessData.ownerId}, - biz_locked=${boolToInt(tempBusinessData.locked)}, - biz_entrance_fee=${tempBusinessData.entranceFee}, - biz_till=${tempBusinessData.till}, - biz_entrance_pos_x=${tempBusinessData.entrancePosition.x}, - biz_entrance_pos_y=${tempBusinessData.entrancePosition.y}, - biz_entrance_pos_z=${tempBusinessData.entrancePosition.z}, - biz_entrance_rot_z=${tempBusinessData.entranceRotation}, - biz_entrance_int=${tempBusinessData.entranceInterior}, - biz_entrance_vw=${tempBusinessData.entranceDimension}, - biz_entrance_pickup=${tempBusinessData.entrancePickupModel}, - biz_entrance_blip=${tempBusinessData.entranceBlipModel}, - biz_exit_pos_x=${tempBusinessData.exitPosition.x}, - biz_exit_pos_y=${tempBusinessData.exitPosition.y}, - biz_exit_pos_z=${tempBusinessData.exitPosition.z}, - biz_exit_rot_z=${tempBusinessData.exitRotation}, - biz_exit_int=${tempBusinessData.exitInterior}, - biz_exit_vw=${tempBusinessData.exitDimension}, - biz_exit_pickup=${tempBusinessData.exitPickupModel}, - biz_exit_blip=${tempBusinessData.exitBlipModel}, - biz_has_interior=${boolToInt(tempBusinessData.hasInterior)}, - biz_buy_price=${tempBusinessData.buyPrice} - WHERE biz_id=${tempBusinessData.databaseId}`; - - dbQueryString = dbQueryString.replace(/(?:\r\n|\r|\n|\t)/g, ""); - - let dbQuery = queryDatabase(dbConnection, dbQueryString); - freeDatabaseQuery(dbQuery); - disconnectFromDatabase(dbConnection); + let queryString = createDatabaseUpdateQuery("biz_main", data, `WHERE biz_id=${tempBusinessData.databaseId}`); + dbQuery = queryDatabase(dbConnection, queryString); } + + freeDatabaseQuery(dbQuery); disconnectFromDatabase(dbConnection); return true; } diff --git a/scripts/server/database.js b/scripts/server/database.js index ddd6d11a..b6d023a5 100644 --- a/scripts/server/database.js +++ b/scripts/server/database.js @@ -188,4 +188,43 @@ function setConstantsAsGlobalVariablesInDatabase() { function loadDatabaseConfiguration() { let databaseConfigFile = loadTextFile("config/database.json"); return JSON.parse(databaseConfigFile); -} \ No newline at end of file +} + +// =========================================================================== + +function createDatabaseInsertQuery(tableName, data) { + let fields = []; + let values = []; + + for(let i in data) { + fields.push(data[i][0]); + + if(typeof values[i][1] == "string") { + values.push(`'${data[i][1]}'`); + } else { + values.push(data[i][1]); + } + } + + let queryString = `INSERT INTO ${tableName} (${fields.join(", ")}) VALUES (${fields.join(", ")})`; + return queryString; +} + +// =========================================================================== + +function createDatabaseUpdateQuery(tableName, data, whereClause) { + let values = []; + + for(let i in data) { + if(typeof values[i][1] == "string") { + values.push(`${data[i][0]}='${data[i][1]}'`); + } else { + values.push(`${data[i][0]}=${data[i][1]}`); + } + } + + let queryString = `INSERT INTO ${tableName} SET ${values.join(", ")} WHERE ${whereClause}`; + return queryString; +} + +// =========================================================================== \ No newline at end of file diff --git a/scripts/server/house.js b/scripts/server/house.js index 0f6183a5..aae50f86 100644 --- a/scripts/server/house.js +++ b/scripts/server/house.js @@ -435,43 +435,46 @@ function saveHouseToDatabase(houseId) { let dbConnection = connectToDatabase(); if(dbConnection) { let safeHouseDescription = escapeDatabaseString(dbConnection, tempHouseData.description); - if(tempHouseData.databaseId == 0) { - let dbQueryString = `INSERT INTO house_main (house_server, house_description, house_owner_type, house_owner_id, house_locked, house_entrance_pos_x, house_entrance_pos_y, house_entrance_pos_z, house_entrance_rot_z, house_entrance_int, house_entrance_vw, house_exit_pos_x, house_exit_pos_y, house_exit_pos_z, house_exit_rot_z, house_exit_int, house_exit_vw, house_has_interior) VALUES (${getServerId()}, '${safeHouseDescription}', ${tempHouseData.ownerType}, ${tempHouseData.ownerId}, ${boolToInt(tempHouseData.locked)}, ${tempHouseData.entrancePosition.x}, ${tempHouseData.entrancePosition.y}, ${tempHouseData.entrancePosition.z}, ${tempHouseData.entranceRotation}, ${tempHouseData.entranceInterior}, ${tempHouseData.entranceDimension}, ${tempHouseData.exitPosition.x}, ${tempHouseData.exitPosition.y}, ${tempHouseData.exitPosition.z}, ${tempHouseData.exitRotation}, ${tempHouseData.exitInterior}, ${tempHouseData.exitDimension}, ${boolToInt(tempHouseData.hasInterior)})`; - queryDatabase(dbConnection, dbQueryString); + let data = [ + ["house_server", getServerId()], + ["house_description", safeHouseDescription], + ["house_owner_type", tempHouseData.ownerType], + ["house_owner_id", tempHouseData.ownerId], + ["house_locked", boolToInt(tempHouseData.locked)], + ["house_entrance_fee", tempHouseData.entranceFee], + ["house_entrance_pos_x", tempHouseData.entrancePosition.x], + ["house_entrance_pos_y", tempHouseData.entrancePosition.x], + ["house_entrance_pos_z", tempHouseData.entrancePosition.z], + ["house_entrance_rot_z", tempHouseData.entranceRotation], + ["house_entrance_int", tempHouseData.entranceInterior], + ["house_entrance_vw", tempHouseData.entranceDimension], + ["house_entrance_pickup", tempHouseData.entrancePickupModel], + ["house_entrance_blip", tempHouseData.entranceBlipModel], + ["house_exit_pos_x", tempHouseData.exitPosition.x], + ["house_exit_pos_y", tempHouseData.exitPosition.y], + ["house_exit_pos_z", tempHouseData.exitPosition.z], + ["house_exit_rot_z", tempHouseData.exitRotation], + ["house_exit_int", tempHouseData.exitInterior], + ["house_exit_vw", tempHouseData.databaseId+getGlobalConfig().houseDimensionStart], + ["house_exit_pickup", tempHouseData.exitPickupModel], + ["house_exit_blip", tempHouseData.exitBlipModel], + ["house_has_interior", boolToInt(tempHouseData.hasInterior)], + ["house_buy_price", tempHouseData.buyPrice], + ["house_rent_price", tempHouseData.rentPrice], + ]; + + let dbQuery = null; + if(tempHouseData.databaseId == 0) { + let queryString = createDatabaseInsertQuery("house_main", data); + dbQuery = queryDatabase(dbConnection, queryString); getServerData().houses[houseId].databaseId = getDatabaseInsertId(dbConnection); } else { - - let dbQueryString = - `UPDATE house_main SET - house_description='${safeHouseDescription}', - house_owner_type=${tempHouseData.ownerType}, - house_owner_id=${tempHouseData.ownerId}, - house_locked=${boolToInt(tempHouseData.locked)}, - house_entrance_pos_x=${tempHouseData.entrancePosition.x}, - house_entrance_pos_y=${tempHouseData.entrancePosition.y}, - house_entrance_pos_z=${tempHouseData.entrancePosition.z}, - house_entrance_rot_z=${tempHouseData.entranceRotation}, - house_entrance_int=${tempHouseData.entranceInterior}, - house_entrance_vw=${tempHouseData.entranceDimension}, - house_exit_pos_x=${tempHouseData.exitPosition.x}, - house_exit_pos_y=${tempHouseData.exitPosition.y}, - house_exit_pos_z=${tempHouseData.exitPosition.z}, - house_exit_rot_z=${tempHouseData.exitRotation}, - house_exit_int=${tempHouseData.exitInterior}, - house_exit_vw=${tempHouseData.exitDimension}, - house_buy_price=${tempHouseData.buyPrice}, - house_rent_price=${tempHouseData.rentPrice}, - house_has_interior=${boolToInt(tempHouseData.hasInterior)} - WHERE house_id=${tempHouseData.databaseId}`; - - //dbQueryString = dbQueryString.trim(); - dbQueryString = dbQueryString.replace(/(?:\r\n|\r|\n|\t)/g, ""); - - let dbQuery = queryDatabase(dbConnection, dbQueryString); - freeDatabaseQuery(dbQuery); - disconnectFromDatabase(dbConnection); + let queryString = createDatabaseUpdateQuery("house_main", data, `WHERE house_id=${tempHouseData.databaseId}`); + dbQuery = queryDatabase(dbConnection, queryString); } + + freeDatabaseQuery(dbQuery); disconnectFromDatabase(dbConnection); return true; } diff --git a/scripts/server/vehicle.js b/scripts/server/vehicle.js index 33ac723c..1a82b584 100644 --- a/scripts/server/vehicle.js +++ b/scripts/server/vehicle.js @@ -45,7 +45,9 @@ function saveAllVehiclesToDatabase() { logToConsole(LOG_INFO, "[VRR.Vehicle]: Saving all vehicles to database ..."); let vehicles = getServerData().vehicles; for(let i in vehicles) { - saveVehicleToDatabase(vehicles[i]); + if(vehicles[i].needsSaved) { + saveVehicleToDatabase(vehicles[i]); + } } logToConsole(LOG_INFO, "[VRR.Vehicle]: Saved all vehicles to database!"); @@ -54,43 +56,118 @@ function saveAllVehiclesToDatabase() { // =========================================================================== -function saveVehicleToDatabase(vehicleData) { - if(vehicleData == null) { +function saveVehicleToDatabase(vehicleDataId) { + if(getVehicleData(vehicleDataId) == null) { // Invalid vehicle data return false; } - if(vehicleData.databaseId == -1) { + let tempVehicleData = getServerData().vehicles[vehicleDataId]; + + if(tempVehicleData.databaseId == -1) { // Temp vehicle, no need to save return false; } - logToConsole(LOG_VERBOSE, `[VRR.Vehicle]: Saving vehicle ${vehicleData.databaseId} to database ...`); + if(!tempVehicleData.needsSaved) { + // Vehicle hasn't changed. No need to save. + return false; + } + + logToConsole(LOG_VERBOSE, `[VRR.Vehicle]: Saving vehicle ${tempVehicleData.databaseId} to database ...`); let dbConnection = connectToDatabase(); if(dbConnection) { - if(!vehicleData.spawnLocked) { - if(!isGTAIV()) { - vehicleData.spawnPosition = vehicleData.vehicle.position; - vehicleData.spawnRotation = vehicleData.vehicle.heading; + if(!tempVehicleData.spawnLocked) { + if(doesGameHaveServerElements()) { + tempVehicleData.spawnPosition = tempVehicleData.vehicle.position; + tempVehicleData.spawnRotation = tempVehicleData.vehicle.heading; } else { - vehicleData.spawnPosition = vehicleData.syncPosition; - vehicleData.spawnRotation = vehicleData.syncHeading; + tempVehicleData.spawnPosition = tempVehicleData.syncPosition; + tempVehicleData.spawnRotation = tempVehicleData.syncHeading; } } - // If vehicle hasn't been added to database, ID will be 0 - if(vehicleData.databaseId == 0) { - let dbQueryString = `INSERT INTO veh_main (veh_model, veh_pos_x, veh_pos_y, veh_pos_z, veh_rot_z, veh_owner_type, veh_owner_id, veh_col1, veh_col2, veh_col3, veh_col4, veh_server, veh_spawn_lock, veh_buy_price, veh_rent_price, veh_livery) VALUES (${vehicleData.model}, ${vehicleData.spawnPosition.x}, ${vehicleData.spawnPosition.y}, ${vehicleData.spawnPosition.z}, ${vehicleData.spawnRotation}, ${vehicleData.ownerType}, ${vehicleData.ownerId}, ${vehicleData.colour1}, ${vehicleData.colour2}, ${vehicleData.colour3}, ${vehicleData.colour4}, ${getServerId()}, ${boolToInt(vehicleData.spawnLocked)}, ${vehicleData.buyPrice}, ${vehicleData.rentPrice}, ${vehicleData.livery})`; - queryDatabase(dbConnection, dbQueryString); - getVehicleData(vehicleData.vehicle).databaseId = getDatabaseInsertId(dbConnection); + let colour1RGBA = rgbaArrayFromToColour(vehicleData.colour1RGBA); + let colour2RGBA = rgbaArrayFromToColour(vehicleData.colour2RGBA); + let colour3RGBA = rgbaArrayFromToColour(vehicleData.colour3RGBA); + let colour4RGBA = rgbaArrayFromToColour(vehicleData.colour4RGBA); + + let data = [ + ["veh_server", getServerId()], + ["veh_model", tempVehicleData.model], + ["veh_owner_type", tempVehicleData.ownerType], + ["veh_owner_id", tempVehicleData.ownerId], + ["veh_locked", boolToInt(tempVehicleData.locked)], + ["veh_spawn_lock", boolToInt(tempVehicleData.spawnLocked)], + ["veh_buy_price", boolToInt(tempVehicleData.buyPrice)], + ["veh_rent_price", boolToInt(tempVehicleData.rentPrice)], + ["veh_pos_x", tempVehicleData.spawnPosition.x], + ["veh_pos_y", tempVehicleData.spawnPosition.x], + ["veh_pos_z", tempVehicleData.spawnPosition.z], + ["veh_rot_z", tempVehicleData.spawnRotation], + ["veh_col1", tempVehicleData.spawnRotation], + ["veh_col2", tempVehicleData.spawnRotation], + ["veh_col3", tempVehicleData.spawnRotation], + ["veh_col4", tempVehicleData.spawnRotation], + ["veh_col1_isrgba", tempVehicleData.colour1IsRGBA], + ["veh_col2_isrgba", tempVehicleData.colour1IsRGBA], + ["veh_col3_isrgba", tempVehicleData.colour1IsRGBA], + ["veh_col4_isrgba", tempVehicleData.colour1IsRGBA], + ["veh_col1_r", colour1RGBA[0]], + ["veh_col1_g", colour1RGBA[1]], + ["veh_col1_b", colour1RGBA[2]], + ["veh_col1_a", colour1RGBA[3]], + ["veh_col2_r", colour2RGBA[0]], + ["veh_col2_g", colour2RGBA[1]], + ["veh_col2_b", colour2RGBA[2]], + ["veh_col2_a", colour2RGBA[3]], + ["veh_col3_r", colour3RGBA[0]], + ["veh_col3_g", colour3RGBA[1]], + ["veh_col3_b", colour3RGBA[2]], + ["veh_col3_a", colour3RGBA[3]], + ["veh_col4_r", colour4RGBA[0]], + ["veh_col4_g", colour4RGBA[1]], + ["veh_col4_b", colour4RGBA[2]], + ["veh_col4_a", colour4RGBA[3]], + ["veh_extra1", tempVehicleData.extras[0]], + ["veh_extra2", tempVehicleData.extras[1]], + ["veh_extra3", tempVehicleData.extras[2]], + ["veh_extra4", tempVehicleData.extras[3]], + ["veh_extra5", tempVehicleData.extras[4]], + ["veh_extra6", tempVehicleData.extras[5]], + ["veh_extra7", tempVehicleData.extras[6]], + ["veh_extra8", tempVehicleData.extras[7]], + ["veh_extra9", tempVehicleData.extras[8]], + ["veh_extra10", tempVehicleData.extras[9]], + ["veh_extra11", tempVehicleData.extras[10]], + ["veh_extra12", tempVehicleData.extras[11]], + ["veh_extra13", tempVehicleData.extras[12]], + ["veh_locked", intToBool(tempVehicleData.locked)], + ["veh_engine", intToBool(tempVehicleData.engine)], + ["veh_lights", intToBool(tempVehicleData.lights)], + ["veh_health", toInteger(tempVehicleData.health)], + ["veh_damage_engine", toInteger(tempVehicleData.engineDamage)], + ["veh_damage_visual", toInteger(tempVehicleData.visualDamage)], + ["veh_dirt_level", toInteger(tempVehicleData.dirtLevel)], + ]; + + let dbQuery = null; + if(tempVehicleData.databaseId == 0) { + let queryString = createDatabaseInsertQuery("veh_main", data); + dbQuery = queryDatabase(dbConnection, queryString); + getServerData().vehicles[vehicleDataId].databaseId = getDatabaseInsertId(dbConnection); + getServerData().vehicles[vehicleDataId].needsSaved = false; } else { - let dbQueryString = `UPDATE veh_main SET veh_model=${vehicleData.model}, veh_pos_x=${vehicleData.spawnPosition.x}, veh_pos_y=${vehicleData.spawnPosition.y}, veh_pos_z=${vehicleData.spawnPosition.z}, veh_rot_z=${vehicleData.spawnRotation}, veh_owner_type=${vehicleData.ownerType}, veh_owner_id=${vehicleData.ownerId}, veh_col1=${vehicleData.colour1}, veh_col2=${vehicleData.colour2}, veh_col3=${vehicleData.colour3}, veh_col4=${vehicleData.colour4}, veh_buy_price=${vehicleData.buyPrice}, veh_rent_price=${vehicleData.rentPrice}, veh_livery=${vehicleData.livery} WHERE veh_id=${vehicleData.databaseId}`; - queryDatabase(dbConnection, dbQueryString); + let queryString = createDatabaseUpdateQuery("veh_main", data, `WHERE veh_id=${tempVehicleData.databaseId}`); + dbQuery = queryDatabase(dbConnection, queryString); + getServerData().vehicles[vehicleDataId].needsSaved = false; } + + freeDatabaseQuery(dbQuery); disconnectFromDatabase(dbConnection); return true; } - logToConsole(LOG_VERBOSE, `[VRR.Vehicle]: Saved vehicle ${vehicleData.vehicle.id} to database!`); + logToConsole(LOG_VERBOSE, `[VRR.Vehicle]: Saved vehicle ${vehicleDataId} to database!`); return false; } @@ -108,10 +185,15 @@ function spawnAllVehicles() { // =========================================================================== function getVehicleData(vehicle) { - let dataIndex = getEntityData(vehicle, "vrr.dataSlot"); - if(typeof getServerData().vehicles[dataIndex] != "undefined") { - return getServerData().vehicles[dataIndex]; + if(isVehicleObject(vehicle)) { + let dataIndex = getEntityData(vehicle, "vrr.dataSlot"); + if(typeof getServerData().vehicles[dataIndex] != "undefined") { + return getServerData().vehicles[dataIndex]; + } + } else { + } + return false; } @@ -188,6 +270,8 @@ function vehicleLockCommand(command, params, client) { getVehicleData(vehicle).locked = !getVehicleData(vehicle).locked; vehicle.locked = getVehicleData(vehicle).locked; + getVehicleData(vehicle).needsSaved = true; + meActionToNearbyPlayers(client, `${toLowerCase(getLockedUnlockedFromBool(getVehicleData(vehicle).locked))} the ${getVehicleName(vehicle)}`); } @@ -214,6 +298,8 @@ function vehicleTrunkCommand(command, params, client) { getVehicleData(vehicle).trunk = !getVehicleData(vehicle).trunk; + getVehicleData(vehicle).needsSaved = true; + meActionToNearbyPlayers(client, `${toLowerCase(getOpenedClosedFromBool(getVehicleData(vehicle).trunk))} the ${getVehicleName(vehicle)}'s trunk.`); } @@ -241,6 +327,8 @@ function vehicleLightsCommand(command, params, client) { setEntityData(vehicle, "vrr.lights", getVehicleData(vehicle).lights); setVehicleLightsState(vehicle, getVehicleData(vehicle).lights); + getVehicleData(vehicle).needsSaved = true; + meActionToNearbyPlayers(client, `turned the ${getVehicleName(vehicle)}'s lights ${toLowerCase(getOnOffFromBool(getVehicleData(vehicle).lights))}`); } @@ -267,6 +355,8 @@ function deleteVehicleCommand(command, params, client) { getServerData().vehicles[dataIndex] = null; destroyElement(vehicle); + getVehicleData(vehicle).needsSaved = true; + messagePlayerSuccess(client, `The ${vehicleName} has been deleted!`); } @@ -298,6 +388,8 @@ function vehicleEngineCommand(command, params, client) { getVehicleData(vehicle).engine = !getVehicleData(vehicle).engine; vehicle.engine = getVehicleData(vehicle).engine; + getVehicleData(vehicle).needsSaved = true; + meActionToNearbyPlayers(client, `turned the ${getVehicleName(vehicle)}'s engine ${toLowerCase(getOnOffFromBool(getVehicleData(vehicle).engine))}`); } @@ -329,6 +421,8 @@ function vehicleSirenCommand(command, params, client) { getVehicleData(vehicle).siren = !getVehicleData(vehicle).siren; vehicle.siren = getVehicleData(vehicle).siren; + getVehicleData(vehicle).needsSaved = true; + meActionToNearbyPlayers(client, `turns the ${getVehicleName(vehicle)}'s siren ${toLowerCase(getOnOffFromBool(getVehicleData(vehicle).siren))}`); } @@ -375,6 +469,8 @@ function setVehicleColourCommand(command, params, client) { getVehicleData(vehicle).colour1 = colour1; getVehicleData(vehicle).colour2 = colour2; + getVehicleData(vehicle).needsSaved = true; + meActionToNearbyPlayers(client, `resprays the ${getVehicleName(vehicle)}'s colours`); } @@ -408,6 +504,8 @@ function vehicleRepairCommand(command, params, client) { takePlayerCash(client, getGlobalConfig().repairVehicleCost); repairVehicle(vehicle); + getVehicleData(vehicle).needsSaved = true; + meActionToNearbyPlayers(client, `repairs the ${getVehicleName(vehicle)}!`); } @@ -444,6 +542,8 @@ function buyVehicleCommand(command, params, client) { getVehicleData(vehicle).engine = true; vehicle.engine = true; + getVehicleData(vehicle).needsSaved = true; + meActionToNearbyPlayers(client, `receives a set of keys to test drive the ${getVehicleName(vehicle)} and starts the engine`); messagePlayerInfo(client, `Drive the vehicle away from the dealership to buy it, or get out to cancel.`); } @@ -488,6 +588,8 @@ function rentVehicleCommand(command, params, client) { getPlayerData(client).rentingVehicle = vehicle; getVehicleData(vehicle).rentStart = getCurrentUnixTimestamp(); + getVehicleData(vehicle).needsSaved = true; + meActionToNearbyPlayers(client, `rents the ${getVehicleName(vehicle)} and receives a set of vehicle keys!`); messagePlayerAlert(client, `You will be charged ${getVehicleData(vehicle).rentPrice} per minute to use this vehicle. To stop renting this vehicle, use /vehrent again.`); } @@ -509,6 +611,8 @@ function stopRentingVehicleCommand(command, params, client) { let vehicle = getPlayerData(client).rentingVehicle; messagePlayerAlert(client, `You are no longer renting the ${getVehicleName(vehicle)}`); stopRentingVehicle(client); + + getVehicleData(vehicle).needsSaved = true; } // =========================================================================== @@ -617,6 +721,8 @@ function setVehicleJobCommand(command, params, client) { getVehicleData(vehicle).ownerType = VRR_VEHOWNER_JOB; getVehicleData(vehicle).ownerId = jobId; + getVehicleData(vehicle).needsSaved = true; + messageAdmins(`${getInlineChatColourByName("lightGrey")}${getPlayerName(client)} ${getInlineChatColourByName("white")}set their ${getInlineChatColourByType("vehiclePurple")}${getVehicleName(vehicle)} ${getInlineChatColourByName("white")}owner to the ${getInlineChatColourByType("jobYellow")}${getJobData(jobId).name} ${getInlineChatColourByName("white")}job! (Job ID ${jobId})`); } @@ -649,6 +755,8 @@ function setVehicleRankCommand(command, params, client) { getVehicleData(vehicle).rank = rankId; messageAdmins(`${getInlineChatColourByName("lightGrey")}${getPlayerName(client)} ${getInlineChatColourByName("white")}set their ${getInlineChatColourByType("vehiclePurple")}${getVehicleName(vehicle)} ${getInlineChatColourByName("white")}rank to ${getInlineChatColourByName("lightGrey")}${rankId} ${getInlineChatColourByName("white")}of the ${getInlineChatColourByType("jobYellow")}${getJobData(getVehicleData(vehicle).ownerId).name} ${getInlineChatColourByName("white")}job!`); } + + getVehicleData(vehicle).needsSaved = true; } // =========================================================================== @@ -671,6 +779,8 @@ function setVehicleClanCommand(command, params, client) { getVehicleData(vehicle).ownerId = getClanData(clanId).databaseId; messageAdmins(`${getInlineChatColourByName("lightGrey")}${getPlayerName(client)} ${getInlineChatColourByName("white")}set their ${getInlineChatColourByType("vehiclePurple")}${getVehicleName(vehicle)} ${getInlineChatColourByName("white")}owner to the ${getInlineChatColourByType("clanOrange")}${getClanData(clanId).name} ${getInlineChatColourByName("white")}clan`); + + getVehicleData(vehicle).needsSaved = true; } // =========================================================================== @@ -688,6 +798,8 @@ function setVehicleToBusinessCommand(command, params, client) { getVehicleData(vehicle).ownerId = getBusinessData(businessId).databaseId; messageAdmins(`${getInlineChatColourByName("lightGrey")}${getPlayerName(client)} ${getInlineChatColourByName("white")}set their ${getInlineChatColourByType("vehiclePurple")}${getVehicleName(vehicle)} ${getInlineChatColourByName("white")}owner to the ${getInlineChatColourByType("businessBlue")}${getBusinessData(businessId).name} ${getInlineChatColourByName("white")}business`); + + getVehicleData(vehicle).needsSaved = true; } // =========================================================================== @@ -710,6 +822,8 @@ function setVehicleOwnerCommand(command, params, client) { getVehicleData(vehicle).ownerId = getPlayerCurrentSubAccount(targetClient).databaseId; messageAdmins(`${getInlineChatColourByName("lightGrey")}${getPlayerName(client)} ${getInlineChatColourByName("white")}set their ${getInlineChatColourByType("vehiclePurple")}${getVehicleName(vehicle)} ${getInlineChatColourByName("white")}owner to ${getInlineChatColourByName("lightGrey")}${getClientSubAccountName(targetClient)}`); + + getVehicleData(vehicle).needsSaved = true; } // =========================================================================== @@ -733,6 +847,8 @@ function setVehicleRentPriceCommand(command, params, client) { getVehicleData(vehicle).rentPrice = amount; messageAdmins(`${getInlineChatColourByName("lightGrey")}${getPlayerName(client)} ${getInlineChatColourByName("white")}set their ${getInlineChatColourByType("vehiclePurple")}${getVehicleName(vehicle)} ${getInlineChatColourByName("white")}rent price to ${getInlineChatColourByName("lightGrey")}$${amount}`); + + getVehicleData(vehicle).needsSaved = true; } // =========================================================================== @@ -756,6 +872,8 @@ function setVehicleBuyPriceCommand(command, params, client) { getVehicleData(vehicle).buyPrice = amount; messageAdmins(`${getInlineChatColourByName("lightGrey")}${getPlayerName(client)} ${getInlineChatColourByName("white")}set their ${getInlineChatColourByType("vehiclePurple")}${getVehicleName(vehicle)}'s ${getInlineChatColourByName("white")}buy price to ${getInlineChatColourByName("lightGrey")}$${amount}`); + + getVehicleData(vehicle).needsSaved = true; } // =========================================================================== @@ -896,6 +1014,8 @@ function toggleVehicleSpawnLockCommand(command, params, client) { } messageAdmins(`${getInlineChatColourByName("lightGrey")}${getPlayerName(client)} ${getInlineChatColourByName("white")}set their ${getInlineChatColourByType("vehiclePurple")}${getVehicleName(vehicle)} ${getInlineChatColourByName("white")}to spawn ${getInlineChatColourByName("lightGrey")}${(getVehicleData(vehicle).spawnLocked) ? "at it's current location" : "wherever a player leaves it."}`); + + getVehicleData(vehicle).needsSaved = true; } // =========================================================================== @@ -912,6 +1032,8 @@ function reloadAllVehiclesCommand(command, params, client) { spawnAllVehicles(); messageAdminAction(`All server vehicles have been reloaded by an admin!`); + + getVehicleData(vehicle).needsSaved = true; } // =========================================================================== @@ -936,6 +1058,8 @@ function stopRentingVehicle(client) { getPlayerData(client).rentingVehicle = false; getVehicleData(vehicle).rentedBy = false; respawnVehicle(vehicle); + + getVehicleData(vehicle).needsSaved = true; } // =========================================================================== @@ -950,6 +1074,8 @@ function respawnVehicle(vehicle) { setEntityData(newVehicle, "vrr.dataSlot", i, false); } } + + getVehicleData(vehicle).needsSaved = true; } // =========================================================================== @@ -996,37 +1122,6 @@ function isVehicleAtPayAndSpray(vehicle) { // =========================================================================== -function repairVehicle(vehicle) { - vehicle.fix(); -} - -// =========================================================================== - -function setVehicleColours(vehicle, colour1, colour2) { - vehicle.colour1 = colour1; - vehicle.colour2 = colour2; -} - -// =========================================================================== - -function setVehicleLights(vehicle, lights) { - vehicle.lights = lights; -} - -// =========================================================================== - -function setVehicleEngine(vehicle, engine) { - vehicle.engine = engine; -} - -// =========================================================================== - -function setVehicleLocked(vehicle, locked) { - vehicle.locked = locked; -} - -// =========================================================================== - function getVehicleOwnerTypeText(ownerType) { switch(ownerType) { case VRR_VEHOWNER_CLAN: @@ -1059,8 +1154,8 @@ function isVehicleOwnedByJob(vehicle, jobId) { async function getPlayerNewVehicle(client) { while(true) { - if(client.player.vehicle != null) { - return client.player.vehicle; + if(isPlayerInAnyVehicle(client)) { + return getPlayerVehicle(client); } await null; } @@ -1069,13 +1164,11 @@ async function getPlayerNewVehicle(client) { // =========================================================================== function createNewDealershipVehicle(model, spawnPosition, spawnRotation, price, dealershipId) { - let vehicleDataSlot = getServerData().vehicles.length; - - let vehicle = gta.createVehicle(model, spawnPosition, spawnRotation); + let vehicle = createGameVehicle(model, spawnPosition, spawnRotation); if(!vehicle) { return false; } - vehicle.heading = spawnRotation; + setVehicleHeading(spawnRotation); addToWorld(vehicle); let tempVehicleData = new serverClasses.vehicleData(false, vehicle); @@ -1086,17 +1179,18 @@ function createNewDealershipVehicle(model, spawnPosition, spawnRotation, price, tempVehicleData.spawnRotation = spawnRotation; tempVehicleData.ownerType = VRR_VEHOWNER_BIZ; tempVehicleData.ownerId = dealershipId; + tempVehicleData.needsSaved = true; - setEntityData(vehicle, "vrr.dataSlot", vehicleDataSlot, true); + let slot = getServerData().vehicles.push(tempVehicleData); - getServerData().vehicles.push(tempVehicleData); + setEntityData(vehicle, "vrr.dataSlot", slot, true); } // =========================================================================== function createTemporaryVehicle(modelId, position, heading) { - let vehicle = gta.createVehicle(modelId, position, heading); - vehicle.heading = heading; + let vehicle = createGameVehicle(modelId, position, heading); + setVehicleHeading(heading); addToWorld(vehicle); let tempVehicleData = new serverClasses.vehicleData(false, vehicle); @@ -1110,8 +1204,8 @@ function createTemporaryVehicle(modelId, position, heading) { // =========================================================================== function createPermanentVehicle(modelId, position, heading) { - let vehicle = gta.createVehicle(modelId, position, heading); - vehicle.heading = heading; + let vehicle = createGameVehicle(modelId, position, heading); + setVehicleHeading(vehicle, heading); addToWorld(vehicle); let tempVehicleData = new serverClasses.vehicleData(false, vehicle);