diff --git a/scripts/client/gui/localepicker.js b/scripts/client/gui/localepicker.js new file mode 100644 index 00000000..0b74a858 --- /dev/null +++ b/scripts/client/gui/localepicker.js @@ -0,0 +1,69 @@ +// =========================================================================== +// Vortrex's Roleplay Resource +// https://github.com/VortrexFTW/gtac_roleplay +// =========================================================================== +// FILE: localechooser.js +// DESC: Provides locale chooser GUI +// TYPE: Client (JavaScript) +// =========================================================================== + +let localeChooser = { + window: null, + flagImages: [] +}; + +// =========================================================================== + +function initLocaleChooserGUI() { + logToConsole(LOG_DEBUG, `[VRR.GUI] Creating locale chooser GUI ...`); + localeChooser.window = mexui.window(game.width/2-200, game.height/2-70, 400, 140, 'Choose a language', { + main: { + backgroundColour: toColour(secondaryColour[0], secondaryColour[1], secondaryColour[2], windowAlpha), + }, + title: { + textSize: 11.0, + textColour: toColour(primaryTextColour[0], primaryTextColour[1], primaryTextColour[2], 255), + backgroundColour: toColour(primaryColour[0], primaryColour[1], primaryColour[2], windowTitleAlpha), + }, + icon: { + textSize: 0.0, + textColour: toColour(0, 0, 0, 0), + backgroundColour: toColour(0, 0, 0, 0), + }, + }); + login.window.titleBarShown = false; + + for(let i in localeOptions) { + let flagImage = localeChooser.window.image(25, 25, 100, 100, localeOptions[i].flagImage, { + focused: { + borderColour: toColour(0, 0, 0, 0), + }, + }); + + flagImage.callback = function() { + localeChooserSetLocale(localeOptions[i].locale); + } + + localeChooser.flagImages.push(flagImage); + } + + logToConsole(LOG_DEBUG, `[VRR.GUI] Created locale chooser GUI`); +} + +// =========================================================================== + +function closeLocaleChooser() { + logToConsole(LOG_DEBUG, `[VRR.GUI] Closing locale chooser window`); + localeChooser.window.shown = false; + mexui.setInput(false); +} + +// =========================================================================== + +function showLocaleChooser() { + closeAllWindows(); + logToConsole(LOG_DEBUG, `[VRR.GUI] Showing locale chooser window`); + mexui.setInput(true); +} + +// =========================================================================== \ No newline at end of file diff --git a/scripts/client/locale.js b/scripts/client/locale.js index 9a2ab7d9..d2cd94da 100644 --- a/scripts/client/locale.js +++ b/scripts/client/locale.js @@ -7,9 +7,6 @@ // TYPE: Client (JavaScript) // =========================================================================== -let flagImagesPosition = toVector2(getScreenWidth()/2, login.window.position.y+100); -let flagImageSize = toVector2(50, 50); - function getLocaleString(stringName, ...args) { if(typeof getServerData().localeStrings[stringName] == undefined) { return ""; @@ -31,4 +28,13 @@ function receiveLocaleStringFromServer(stringName, stringValue) { getServerData().localeStrings[stringName] = stringValue; } +// =========================================================================== + +function receiveLocaleStringsFromServer(strings) { + for(let i in strings) { + let stringName = strings[i][0]; + getServerData().localeStrings[stringName] = strings[i][1]; + } +} + // =========================================================================== \ No newline at end of file diff --git a/scripts/client/native/connected.js b/scripts/client/native/connected.js index 59425940..46104209 100644 --- a/scripts/client/native/connected.js +++ b/scripts/client/native/connected.js @@ -579,4 +579,70 @@ function getScreenHeight() { return game.height; } +// =========================================================================== + +// =========================================================================== + +function openAllGarages() { + switch(getGame()) { + case VRR_GAME_GTA_III: + for(let i=0;i<=26;i++) { + openGarage(i); + game.NO_SPECIAL_CAMERA_FOR_THIS_GARAGE(i); + } + break; + + case VRR_GAME_GTA_VC: + for(let i=0;i<=32;i++) { + openGarage(i); + game.NO_SPECIAL_CAMERA_FOR_THIS_GARAGE(i); + } + break; + + case VRR_GAME_GTA_SA: + for(let i=0;i<=44;i++) { + openGarage(i); + } + break; + + default: + break; + } +} + +// =========================================================================== + +function closeAllGarages() { + switch(getGame()) { + case VRR_GAME_GTA_III: + for(let i=0;i<=26;i++) { + closeGarage(i); + game.NO_SPECIAL_CAMERA_FOR_THIS_GARAGE(i); + } + break; + + case VRR_GAME_GTA_VC: + for(let i=0;i<=32;i++) { + closeGarage(i); + game.NO_SPECIAL_CAMERA_FOR_THIS_GARAGE(i); + } + break; + + case VRR_GAME_GTA_SA: + for(let i=0;i<=44;i++) { + closeGarage(i); + } + break; + + default: + break; + } +} + +// =========================================================================== + +function setPedInvincible(ped, state) { + ped.invincible = state; +} + // =========================================================================== \ No newline at end of file diff --git a/scripts/client/server.js b/scripts/client/server.js index acb53360..3ea7a523 100644 --- a/scripts/client/server.js +++ b/scripts/client/server.js @@ -94,6 +94,7 @@ function addAllNetworkHandlers() { // Locale addNetworkEventHandler("vrr.localeString", receiveLocaleStringFromServer); + addNetworkEventHandler("vrr.localeStrings", receiveLocaleStringsFromServer); // Misc addNetworkEventHandler("vrr.mouseCursor", toggleMouseCursor); diff --git a/scripts/client/startup.js b/scripts/client/startup.js index 2dca8116..b7d41523 100644 --- a/scripts/client/startup.js +++ b/scripts/client/startup.js @@ -161,7 +161,7 @@ function setUpInitialGame() { natives.requestAnims("DANCING"); // Some last steps - natives.loadAllObjectsNow(); + //natives.loadAllObjectsNow(); break; case VRR_GAME_MAFIA_ONE: diff --git a/scripts/client/utilities.js b/scripts/client/utilities.js index 109d337b..0051fa2f 100644 --- a/scripts/client/utilities.js +++ b/scripts/client/utilities.js @@ -7,173 +7,6 @@ // TYPE: Client (JavaScript) // =========================================================================== -let weaponSlots = [ - false, - [ - 0, - 1, - 2, - 3, - 4, - 5, - 6, - 7, - 8, - 9, - 10, - 11 - ], - [ - 0, - 0, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 2, - 2, - 2, - 2, - 2, - 3, - 3, - 4, - 4, - 4, - 5, - 5, - 5, - 5, - 6, - 6, - 8, - 8, - 7, - 7, - 7, - 7, - 9, - -1, - 9, - ], - [ - 0, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 8, - 8, - 8, - -1, - -1, - -1, - 2, - 2, - 2, - 3, - 3, - 3, - 4, - 4, - 5, - 5, - 4, - 6, - 6, - 7, - 7, - 7, - 7, - 8, - 12, - 9, - 9, - 9, - 9, - 9, - 11, - 9, - 9, - 9, - ], -]; - -function openAllGarages() { - switch(getGame()) { - case VRR_GAME_GTA_III: - for(let i=0;i<=26;i++) { - openGarage(i); - game.NO_SPECIAL_CAMERA_FOR_THIS_GARAGE(i); - } - break; - - case VRR_GAME_GTA_VC: - for(let i=0;i<=32;i++) { - openGarage(i); - game.NO_SPECIAL_CAMERA_FOR_THIS_GARAGE(i); - } - break; - - case VRR_GAME_GTA_SA: - for(let i=0;i<=44;i++) { - openGarage(i); - } - break; - - default: - break; - } -} - -// =========================================================================== - -function closeAllGarages() { - switch(getGame()) { - case VRR_GAME_GTA_III: - for(let i=0;i<=26;i++) { - closeGarage(i); - game.NO_SPECIAL_CAMERA_FOR_THIS_GARAGE(i); - } - break; - - case VRR_GAME_GTA_VC: - for(let i=0;i<=32;i++) { - closeGarage(i); - game.NO_SPECIAL_CAMERA_FOR_THIS_GARAGE(i); - } - break; - - case VRR_GAME_GTA_SA: - for(let i=0;i<=44;i++) { - closeGarage(i); - } - break; - - default: - break; - } -} - -// =========================================================================== - function setLocalPlayerFrozenState(state) { logToConsole(LOG_DEBUG, `[VRR.Utilities] Setting frozen state to ${state}`); gui.showCursor(state, !state); @@ -186,11 +19,9 @@ function setLocalPlayerControlState(controlState, cursorState = false) { controlsEnabled = controlState; if(getGame() == VRR_GAME_GTA_III || getGame() == VRR_GAME_GTA_VC) { game.SET_PLAYER_CONTROL(game.GET_PLAYER_ID(), boolToInt(controlState)); - } - - if(getGame() != VRR_GAME_GTA_IV) { - localPlayer.collisionsEnabled = controlState; - localPlayer.invincible = true; + } else if(getGame() != VRR_GAME_GTA_IV) { + setElementCollisionsEnabled(localPlayer, controlState); + setPedInvincible(localPlayer, true); } } @@ -371,12 +202,12 @@ function setLocalPlayerInterior(interior) { //} } - //let vehicles = getElementsByType(ELEMENT_VEHICLE); - //for(let i in vehicles) { - // if(getEntityData(vehicles[i], "vrr.interior")) { - // vehicles[i].interior = getEntityData(vehicles[i], "vrr.interior"); - // } - //} + let vehicles = getElementsByType(ELEMENT_VEHICLE); + for(let i in vehicles) { + if(getEntityData(vehicles[i], "vrr.interior")) { + vehicles[i].interior = getEntityData(vehicles[i], "vrr.interior"); + } + } } // =========================================================================== @@ -398,12 +229,6 @@ function setLocalPlayerHealth(health) { // =========================================================================== -function isSnowEnabled() { - return (typeof snowing != "undefined"); -} - -// =========================================================================== - function playPedSpeech(pedName, speechId) { logToConsole(LOG_DEBUG, `[VRR.Utilities] Making ${pedName}'s ped talk (${speechId})`); if(getMultiplayerMod() == VRR_MPMOD_GTAC) { @@ -421,18 +246,14 @@ function clearLocalPedState() { // =========================================================================== function getWeaponSlot(weaponId) { - if(getGame() == VRR_GAME_GTA_IV) { - return false; - } - - return weaponSlots[getGame()][weaponId]; + return getGameConfig().weaponSlots[getGame()][weaponId]; } // =========================================================================== function setLocalPlayerDrunkEffect(amount, duration) { if(getMultiplayerMod() == VRR_MPMOD_GTAC) { - logToConsole(LOG_DEBUG, `[VRR.Utilities] Drunk effect set to ${amount} for ${duration}ms`); + logToConsole(LOG_DEBUG, `[VRR.Utilities] Drunk effect set to ${amount} for ${duration} ms`); drunkEffectAmount = 0; drunkEffectDurationTimer = setInterval(function() { drunkEffectAmount = drunkEffectAmount; @@ -599,28 +420,6 @@ function processLocalPlayerVehicleControlState() { // =========================================================================== -function processLocalPlayerSphereEntryExitHandling() { - let position = getLocalPlayerPosition(); - - if(areMarkersSupported()) { - getElementsByType(ELEMENT_MARKER).forEach(function(sphere) { - if(getDistance(position, sphere.position) <= sphere.radius) { - if(!inSphere) { - inSphere = sphere; - triggerEvent("OnLocalPlayerEnterSphere", null, sphere); - } - } else { - if(inSphere) { - inSphere = false; - triggerEvent("OnLocalPlayerExitSphere", null, sphere); - } - } - }); - } -} - -// =========================================================================== - function processJobRouteSphere() { if(getGame() == VRR_GAME_GTA_SA) { let position = getLocalPlayerPosition(); @@ -670,29 +469,11 @@ function getLocalPlayerPosition() { // =========================================================================== -function processLocalPlayerVehicleEntryExitHandling() { - if(localPlayer.vehicle) { - if(!inVehicle) { - inVehicle = localPlayer.vehicle; - inVehicleSeat = getLocalPlayerVehicleSeat(); - triggerEvent("OnLocalPlayerEnteredVehicle", inVehicle, inVehicleSeat); - } - } else { - if(inVehicle) { - triggerEvent("OnLocalPlayerExitedVehicle", inVehicle, inVehicleSeat); - inVehicle = false; - inVehicleSeat = false; - } - } -} - -// =========================================================================== - function getVehicleForNetworkEvent(vehicle) { if(getGame() == VRR_GAME_GTA_IV) { return natives.getNetworkIdFromVehicle(vehicle); } - return vehicle; + return vehicle.id; } // =========================================================================== @@ -781,59 +562,6 @@ function processGameSpecifics() { // =========================================================================== -function processVehiclePurchasing() { - if(vehiclePurchaseState == VRR_VEHBUYSTATE_TESTDRIVE) { - if(inVehicle == false) { - vehiclePurchaseState = VRR_VEHBUYSTATE_EXITVEH; - sendNetworkEventToServer("vrr.vehBuyState", VRR_VEHBUYSTATE_EXITVEH); - return false; - } else { - if(vehiclePurchasing == inVehicle) { - if(getDistance(inVehicle.position, vehiclePurchasePosition) >= 25) { - vehiclePurchaseState = VRR_VEHBUYSTATE_FARENOUGH; - sendNetworkEventToServer("vrr.vehBuyState", VRR_VEHBUYSTATE_FARENOUGH); - } - } else { - vehiclePurchaseState = VRR_VEHBUYSTATE_WRONGVEH; - sendNetworkEventToServer("vrr.vehBuyState", VRR_VEHBUYSTATE_WRONGVEH); - } - } - } -} - -// =========================================================================== - -function setVehiclePurchaseState(state, vehicleId, position) { - vehiclePurchaseState = state; - - if(vehicleId != null) { - vehiclePurchasing = getElementFromId(vehicleId); - } else { - vehiclePurchasing = null; - } - - vehiclePurchasePosition = position; -} - -// =========================================================================== - -function processVehicleFires() { - /* - let vehicles = getElementsByType(ELEMENT_VEHICLE); - for(let i in vehicles) { - if(vehicles[i].isSyncer) { - if(!doesEntityDataExist(vehicles[i], "vrr.fire")) { - triggerNetworkEvent("vrr.vehFire", vehicles[i].id); - } else { - vehicles[i].health = 249; - } - } - } - */ -} - -// =========================================================================== - function getServerData() { return serverData; } diff --git a/scripts/client/vehicle.js b/scripts/client/vehicle.js index 2b28e5a2..700ff7be 100644 --- a/scripts/client/vehicle.js +++ b/scripts/client/vehicle.js @@ -15,4 +15,48 @@ function receiveVehicleFromServer(vehicleId, position, model, colour1, colour2, } } +// =========================================================================== + +function processVehiclePurchasing() { + if(vehiclePurchaseState == VRR_VEHBUYSTATE_TESTDRIVE) { + if(getLocalPlayerVehicle() == false) { + vehiclePurchaseState = VRR_VEHBUYSTATE_EXITVEH; + sendNetworkEventToServer("vrr.vehBuyState", VRR_VEHBUYSTATE_EXITVEH); + return false; + } else { + if(vehiclePurchasing == getLocalPlayerVehicle()) { + if(getDistance(getLocalPlayerVehicle().position, vehiclePurchasePosition) >= 25) { + vehiclePurchaseState = VRR_VEHBUYSTATE_FARENOUGH; + sendNetworkEventToServer("vrr.vehBuyState", VRR_VEHBUYSTATE_FARENOUGH); + } + } else { + vehiclePurchaseState = VRR_VEHBUYSTATE_WRONGVEH; + sendNetworkEventToServer("vrr.vehBuyState", VRR_VEHBUYSTATE_WRONGVEH); + } + } + } +} + +// =========================================================================== + +function processVehicleBurning() { + getElementsByType(ELEMENT_VEHICLE).filter(vehicle => vehicle.isSyncer && vehicle.health < 250).forEach((vehicle) => { + vehicle.health = 250; + }); +} + +// =========================================================================== + +function setVehiclePurchaseState(state, vehicleId, position) { + vehiclePurchaseState = state; + + if(vehicleId != null) { + vehiclePurchasing = getElementFromId(vehicleId); + } else { + vehiclePurchasing = null; + } + + vehiclePurchasePosition = position; +} + // =========================================================================== \ No newline at end of file diff --git a/scripts/server/config.js b/scripts/server/config.js index 2bfa76b0..548229d5 100644 --- a/scripts/server/config.js +++ b/scripts/server/config.js @@ -72,6 +72,7 @@ let globalConfig = { vehicleInactiveRespawnDelay: 1800000, // 20 minutes chatSectionHeaderLength: 96, useServerSideVehiclePurchaseCheck: true, + useServerSideVehicleBurnCheck: false, businessPickupStreamInDistance: 100, businessPickupStreamOutDistance: 120, housePickupStreamInDistance: 100, diff --git a/scripts/server/core.js b/scripts/server/core.js index d7e71ef4..c0ffbbbf 100644 --- a/scripts/server/core.js +++ b/scripts/server/core.js @@ -9,7 +9,7 @@ let scriptVersion = "1.1"; let serverStartTime = 0; -let logLevel = LOG_INFO|LOG_ERROR|LOG_WARN|LOG_DEBUG; +let logLevel = LOG_INFO|LOG_ERROR|LOG_WARN; // =========================================================================== @@ -20,8 +20,6 @@ let logLevel = LOG_INFO|LOG_ERROR|LOG_WARN|LOG_DEBUG; * @property {Array.} businesses * @property {Array.} houses * @property {Array.} commands - * @property {Array} groundItemCache - * @property {Array} groundPlantCache * @property {Array.} items * @property {Array.} itemTypes * @property {Array.} clans @@ -30,6 +28,10 @@ let logLevel = LOG_INFO|LOG_ERROR|LOG_WARN|LOG_DEBUG; * @property {Array.} races * @property {Array.} jobs * @property {Array.} gates + * @property {Array} groundItemCache + * @property {Array} groundPlantCache + * @property {Array} purchasingVehicleCache + * @property {Array} rentingVehicleCache */ let serverData = { vehicles: [], @@ -37,8 +39,6 @@ let serverData = { businesses: [], houses: [], commands: {}, - groundItemCache: [], - groundPlantCache: [], items: [], itemTypes: [], clans: [], @@ -50,6 +50,10 @@ let serverData = { races: [], jobs: [], gates: [], + groundItemCache: [], + groundPlantCache: [], + purchasingVehicleCache: [], + rentingVehicleCache: [], }; // =========================================================================== diff --git a/scripts/server/item.js b/scripts/server/item.js index ff1adad5..ddfc5a7d 100644 --- a/scripts/server/item.js +++ b/scripts/server/item.js @@ -1297,7 +1297,7 @@ function getClosestItemOnGround(position) { // =========================================================================== -function setItemDataIndexes() { +function setAllItemDataIndexes() { for(let i in getServerData().items) { if(getServerData().items[i]) { getServerData().items[i].index = i; @@ -1308,7 +1308,7 @@ function setItemDataIndexes() { // =========================================================================== -function setItemTypeDataIndexes() { +function setAllItemTypeDataIndexes() { for(let i in getServerData().itemTypes) { if(getServerData().itemTypes[i]) { getServerData().itemTypes[i].index = i; @@ -1460,7 +1460,7 @@ function deleteItem(itemId) { quickDatabaseQuery(`DELETE FROM item_main WHERE item_id = ${getItemData(itemId).databaseId}`); } getServerData().items[itemId] = false; - setItemDataIndexes(); + setAllItemDataIndexes(); } // =========================================================================== diff --git a/scripts/server/job.js b/scripts/server/job.js index bd81fb7b..ea6bc39b 100644 --- a/scripts/server/job.js +++ b/scripts/server/job.js @@ -926,17 +926,15 @@ function takeJob(client, jobId) { function reloadAllJobsCommand(command, params, client) { forceAllPlayersToStopWorking(); + deleteAllJobBlips(); + deleteAllJobPickups(); clearArray(getServerData().jobs); - getServerData().jobs = loadJobsFromDatabase(); - for(let i in getServerData().jobs) { - for(let j in getServerData().jobs[i].locations) { - deleteJobLocationPickup(i, j); - deleteJobLocationBlip(i, j); - createJobLocationPickup(i, j); - createJobLocationBlip(i, j); - } - } + Promise.resolve().then(() => { + getServerData().jobs = loadJobsFromDatabase(); + createJobLocationPickup(i, j); + createJobLocationBlip(i, j); + }); announceAdminAction("AllJobsReloaded"); } diff --git a/scripts/server/native/connected.js b/scripts/server/native/connected.js index 3bb9c2d3..1b4f8c68 100644 --- a/scripts/server/native/connected.js +++ b/scripts/server/native/connected.js @@ -799,9 +799,16 @@ function disconnectFromDatabase(dbConnection) { // =========================================================================== -function queryDatabase(dbConnection, queryString) { +function queryDatabase(dbConnection, queryString, useThread = false) { logToConsole(LOG_DEBUG, `[VRR.Database] Query string: ${queryString}`); - return dbConnection.query(queryString); + if(useThread == true) { + Promise.resolve().then(() => { + let queryResult = dbConnection.query(queryString); + return queryResult; + }); + } else { + return dbConnection.query(queryString); + } } // =========================================================================== diff --git a/scripts/server/startup.js b/scripts/server/startup.js index 7a75ecc0..ef3e3a6b 100644 --- a/scripts/server/startup.js +++ b/scripts/server/startup.js @@ -47,8 +47,6 @@ function initServerScripts() { // Load all the server data loadServerDataFromDatabase(); - - // Set indexes and cache necessary data setAllServerDataIndexes(); createAllServerElements(); @@ -122,7 +120,6 @@ function loadServerDataFromDatabase() { getServerData().localeStrings = loadAllLocaleStrings(); getServerData().allowedSkins = getAllowedSkins(getGame()); - // Translation Cache getServerData().cachedTranslations = new Array(getGlobalConfig().locale.locales.length); getServerData().cachedTranslationFrom = new Array(getGlobalConfig().locale.locales.length); @@ -150,8 +147,8 @@ function loadServerDataFromDatabase() { // =========================================================================== function setAllServerDataIndexes() { - setItemTypeDataIndexes(); - setItemDataIndexes(); + setAllItemTypeDataIndexes(); + setAllItemDataIndexes(); setBusinessDataIndexes(); setHouseDataIndexes(); setAllClanDataIndexes(); diff --git a/scripts/server/timers.js b/scripts/server/timers.js index eef6f757..484a9998 100644 --- a/scripts/server/timers.js +++ b/scripts/server/timers.js @@ -105,7 +105,7 @@ function oneMinuteTimerFunction() { checkServerGameTime(); logToConsole(LOG_DEBUG, `[VRR.Event] Checking rentable vehicles`); - vehicleRentCheck(); + checkVehicleRenting(); logToConsole(LOG_DEBUG, `[VRR.Event] Updating all player name tags`); updateAllPlayerNameTags(); @@ -130,19 +130,18 @@ function thirtyMinuteTimerFunction() { // =========================================================================== -function vehicleRentCheck() { - // Loop through players, not vehicles. Much more efficient (and doesn't consume resources when no players are connected) - let clients = getClients(); - for(let i in clients) { - if(isClientInitialized(clients[i])) { - if(getPlayerData(clients[i]) != false) { - if(isPlayerLoggedIn(clients[i] && isPlayerSpawned(clients[i]))) { - if(getPlayerData(clients[i]).rentingVehicle != false) { - if(getPlayerCurrentSubAccount(clients[i]).cash < getServerData().vehicles[getPlayerData(clients[i]).rentingVehicle].rentPrice) { - messagePlayerAlert(clients[i], `You do not have enough money to continue renting this vehicle!`); - stopRentingVehicle(clients[i]); +function checkVehicleRenting() { + let renting = getServerData().rentingVehicleCache; + for(let i in renting) { + if(isClientInitialized(renting[i])) { + if(getPlayerData(renting[i]) != false) { + if(isPlayerLoggedIn(renting[i] && isPlayerSpawned(renting[i]))) { + if(getPlayerData(renting[i]).rentingVehicle != false) { + if(getPlayerCurrentSubAccount(renting[i]).cash < getServerData().vehicles[getPlayerData(renting[i]).rentingVehicle].rentPrice) { + messagePlayerAlert(renting[i], `You do not have enough money to continue renting this vehicle!`); + stopRentingVehicle(renting[i]); } else { - takePlayerCash(clients[i], getServerData().vehicles[getPlayerData(clients[i]).rentingVehicle].rentPrice); + takePlayerCash(renting[i], getServerData().vehicles[getPlayerData(renting[i]).rentingVehicle].rentPrice); } } } diff --git a/scripts/server/vehicle.js b/scripts/server/vehicle.js index 03fee580..82c8437b 100644 --- a/scripts/server/vehicle.js +++ b/scripts/server/vehicle.js @@ -144,7 +144,7 @@ function saveVehicleToDatabase(vehicleDataId) { getServerData().vehicles[vehicleDataId].needsSaved = false; } else { let queryString = createDatabaseUpdateQuery("veh_main", data, `veh_id=${tempVehicleData.databaseId}`); - dbQuery = queryDatabase(dbConnection, queryString); + dbQuery = queryDatabase(dbConnection, queryString, true); getServerData().vehicles[vehicleDataId].needsSaved = false; } @@ -547,6 +547,7 @@ function buyVehicleCommand(command, params, client) { setPlayerBuyingVehicleState(client, VRR_VEHBUYSTATE_TESTDRIVE, vehicle.id, getVehiclePosition(vehicle)); meActionToNearbyPlayers(client, `receives a set of keys to test drive the ${getVehicleName(vehicle)} and starts the engine`); messagePlayerInfo(client, getLocaleString(client, "DealershipPurchaseTestDrive")); + getServerData().purchasingVehicleCache.push(client); } // =========================================================================== @@ -593,7 +594,7 @@ function rentVehicleCommand(command, params, client) { getVehicleData(vehicle).rentedBy = client; getPlayerData(client).rentingVehicle = vehicle; getVehicleData(vehicle).rentStart = getCurrentUnixTimestamp(); - + getServerData().rentingVehicleCache.push(client); getVehicleData(vehicle).needsSaved = true; meActionToNearbyPlayers(client, `rents the ${getVehicleName(vehicle)} and receives a set of vehicle keys!`); @@ -1232,6 +1233,7 @@ function respawnBusinessVehiclesCommand(command, params, client) { // =========================================================================== function stopRentingVehicle(client) { + getServerData().rentingVehicleCache.splice(getServerData().rentingVehicleCache.indexOf(client), 1); let vehicle = getPlayerData(client).rentingVehicle; getPlayerData(client).rentingVehicle = false; getVehicleData(vehicle).rentedBy = false; @@ -1465,9 +1467,9 @@ function processVehiclePurchasing() { return false; } - let clients = getClients(); - for(let i in clients) { - checkVehicleBuying(clients[i]); + let purchasingVehicles = getServerData().purchasingVehicleCache; + for(let i in purchasingVehicles) { + checkVehiclePurchasing(purchasingVehicles[i]); } return false; @@ -1475,7 +1477,7 @@ function processVehiclePurchasing() { // =========================================================================== -function checkVehicleBuying(client) { +function checkVehiclePurchasing(client) { if(!isPlayerLoggedIn(client)) { setPlayerBuyingVehicleState(client, VRR_VEHBUYSTATE_NONE, null, null); return false; @@ -1498,6 +1500,7 @@ function checkVehicleBuying(client) { if(!isPlayerInAnyVehicle(client)) { if(getPlayerData(client).buyingVehicle != false) { + getServerData().purchasingVehicleCache.splice(getServerData().purchasingVehicleCache.indexOf(client), 1); messagePlayerError(client, getLocaleString(client, "DealershipPurchaseExitedVehicle")); respawnVehicle(getPlayerData(client).buyingVehicle); getPlayerData(client).buyingVehicle = false; @@ -1508,6 +1511,7 @@ function checkVehicleBuying(client) { if(getDistance(getVehiclePosition(getPlayerData(client).buyingVehicle), getVehicleData(getPlayerData(client).buyingVehicle).spawnPosition) > getGlobalConfig().buyVehicleDriveAwayDistance) { if(getPlayerCurrentSubAccount(client).cash < getVehicleData(getPlayerData(client).buyingVehicle).buyPrice) { + getServerData().purchasingVehicleCache.splice(getServerData().purchasingVehicleCache.indexOf(client), 1); messagePlayerError(client, getLocaleString(client, "VehiclePurchaseNotEnoughMoney")); respawnVehicle(getPlayerData(client).buyingVehicle); getPlayerData(client).buyingVehicle = false; @@ -1515,6 +1519,7 @@ function checkVehicleBuying(client) { return false; } + getServerData().purchasingVehicleCache.splice(getServerData().purchasingVehicleCache.indexOf(client), 1); createNewDealershipVehicle(getVehicleData(getPlayerData(client).buyingVehicle).model, getVehicleData(getPlayerData(client).buyingVehicle).spawnPosition, getVehicleData(getPlayerData(client).buyingVehicle).spawnRotation, getVehicleData(getPlayerData(client).buyingVehicle).buyPrice, getVehicleData(getPlayerData(client).buyingVehicle).ownerId); takePlayerCash(client, getVehicleData(getPlayerData(client).buyingVehicle).buyPrice); updatePlayerCash(client); @@ -1533,10 +1538,16 @@ function checkVehicleBuying(client) { // =========================================================================== function processVehicleBurning() { + if(!getGlobalConfig().useServerSideVehicleBurnCheck) { + return false; + } + let vehicles = getElementsByType(ELEMENT_VEHICLE); for(let i in vehicles) { - if(vehicles[i].health <= 250) { - return false; + if(vehicles[i].syncer == null) { + if(vehicles[i].health <= 250) { + vehicles[i].health = 250; + } } } } diff --git a/scripts/shared/utilities.js b/scripts/shared/utilities.js index a698e3c5..337d1142 100644 --- a/scripts/shared/utilities.js +++ b/scripts/shared/utilities.js @@ -1361,7 +1361,7 @@ function getDistance(vec1, vec2) { function logToConsole(tempLogLevel, text) { text = removeColoursInMessage(text); - if(hasBitFlag(logLevel, tempLogLevel) || hasBitFlag(logLevel, LOG_ERROR) || hasBitFlag(logLevel, LOG_WARN)) { + if(hasBitFlag(logLevel, tempLogLevel)) { if(tempLogLevel & LOG_ERROR) { consoleError(text); return true;