From 7a3203fa57020df2954a7b808e5102d274496f8f Mon Sep 17 00:00:00 2001 From: Vortrex <3858226+VortrexFTW@users.noreply.github.com> Date: Thu, 30 Dec 2021 16:03:07 -0600 Subject: [PATCH 001/337] Revert "Use new stream distance stuff" This reverts commit bdda7caf4c9b73521a2f8ae9b9ecf3783b8c8cca. --- scripts/server/business.js | 19 +++++++++++-------- scripts/server/house.js | 11 ++--------- 2 files changed, 13 insertions(+), 17 deletions(-) diff --git a/scripts/server/business.js b/scripts/server/business.js index 5c23034b..e4e1fef6 100644 --- a/scripts/server/business.js +++ b/scripts/server/business.js @@ -1324,8 +1324,6 @@ function createBusinessEntrancePickup(businessId) { getBusinessData(businessId).entrancePickup = createGamePickup(pickupModelId, getBusinessData(businessId).entrancePosition, getGameConfig().pickupTypes[getServerGame()].business); setElementOnAllDimensions(getBusinessData(businessId).entrancePickup, false); setElementDimension(getBusinessData(businessId).entrancePickup, getBusinessData(businessId).entranceDimension); - setElementStreamInDistance(getBusinessData(businessId).entrancePickup, getGlobalConfig().businessPickupStreamInDistance); - setElementStreamOutDistance(getBusinessData(businessId).entrancePickup, getGlobalConfig().businessPickupStreamOutDistance); updateBusinessPickupLabelData(businessId); addToWorld(getBusinessData(businessId).entrancePickup); } @@ -1348,8 +1346,11 @@ function createBusinessEntranceBlip(businessId) { getBusinessData(businessId).entranceBlip = createGameBlip(getBusinessData(businessId).entrancePosition, blipModelId, 1, getColourByName("businessBlue")); setElementOnAllDimensions(getBusinessData(businessId).entranceBlip, false); setElementDimension(getBusinessData(businessId).entranceBlip, getBusinessData(businessId).entranceDimension); - setElementStreamInDistance(getBusinessData(businessId).entranceBlip, getGlobalConfig().businessBlipStreamInDistance); - setElementStreamOutDistance(getBusinessData(businessId).entranceBlip, getGlobalConfig().businessBlipStreamOutDistance); + //getBusinessData(businessId).entranceBlip.streamInDistance = 300; + //getBusinessData(businessId).entranceBlip.streamOutDistance = 350; + //getBusinessData(businessId).entranceBlip.interior = getBusinessData(businessId).entranceInterior; + //setEntityData(getBusinessData(businessId).entranceBlip, "vrr.owner.type", VRR_BLIP_BUSINESS_ENTRANCE, false); + //setEntityData(getBusinessData(businessId).entranceBlip, "vrr.owner.id", businessId, false); addToWorld(getBusinessData(businessId).entranceBlip); } } @@ -1372,8 +1373,9 @@ function createBusinessExitPickup(businessId) { getBusinessData(businessId).exitPickup = createGamePickup(pickupModelId, getBusinessData(businessId).exitPosition, getGameConfig().pickupTypes[getServerGame()].business); setElementDimension(getBusinessData(businessId).exitPickup, getBusinessData(businessId).exitDimension); setElementOnAllDimensions(getBusinessData(businessId).exitPickup, false); - setElementStreamInDistance(getBusinessData(businessId).exitPickup, getGlobalConfig().businessPickupStreamInDistance); - setElementStreamOutDistance(getBusinessData(businessId).exitPickup, getGlobalConfig().businessPickupStreamOutDistance); + //setEntityData(getBusinessData(businessId).entranceBlip, "vrr.owner.type", VRR_PICKUP_BUSINESS_EXIT, false); + //setEntityData(getBusinessData(businessId).entranceBlip, "vrr.owner.id", businessId, false); + //getBusinessData(businessId).exitPickup.interior = getBusinessData(businessId).exitInterior; updateBusinessPickupLabelData(businessId); addToWorld(getBusinessData(businessId).exitPickup); } @@ -1398,8 +1400,9 @@ function createBusinessExitBlip(businessId) { getBusinessData(businessId).exitBlip = createGameBlip(getBusinessData(businessId).exitPosition, blipModelId, 1, getColourByName("businessBlue")); setElementDimension(getBusinessData(businessId).exitBlip, getBusinessData(businessId).entranceDimension); setElementOnAllDimensions(getBusinessData(businessId).exitBlip, false); - setElementStreamInDistance(getBusinessData(businessId).exitBlip, getGlobalConfig().businessBlipStreamInDistance); - setElementStreamOutDistance(getBusinessData(businessId).exitBlip, getGlobalConfig().businessBlipStreamOutDistance); + //getBusinessData(businessId).exitBlip.interior = getBusinessData(businessId).exitInterior; + //setEntityData(getBusinessData(businessId).exitBlip, "vrr.owner.type", VRR_BLIP_BUSINESS_EXIT, false); + //setEntityData(getBusinessData(businessId).exitBlip, "vrr.owner.id", businessId, false); addToWorld(getBusinessData(businessId).exitBlip); } } diff --git a/scripts/server/house.js b/scripts/server/house.js index 8ac3b0ff..0031955e 100644 --- a/scripts/server/house.js +++ b/scripts/server/house.js @@ -861,9 +861,6 @@ function createHouseEntrancePickup(houseId) { getHouseData(houseId).entrancePickup = createGamePickup(pickupModelId, getHouseData(houseId).entrancePosition, getGameConfig().pickupTypes[getServerGame()].house); setElementOnAllDimensions(getHouseData(houseId).entrancePickup, false); setElementDimension(getHouseData(houseId).entrancePickup, getHouseData(houseId).entranceDimension); - setElementStreamInDistance(getBusinessData(businessId).entrancePickup, getGlobalConfig().housePickupStreamInDistance); - setElementStreamOutDistance(getBusinessData(businessId).entrancePickup, getGlobalConfig().housePickupStreamOutDistance); - setEntityData(getHouseData(houseId).entrancePickup, "vrr.owner.type", VRR_PICKUP_HOUSE_ENTRANCE, false); setEntityData(getHouseData(houseId).entrancePickup, "vrr.owner.id", houseId, false); setEntityData(getHouseData(houseId).entrancePickup, "vrr.label.type", VRR_LABEL_HOUSE, true); @@ -900,8 +897,8 @@ function createHouseEntranceBlip(houseId) { getHouseData(houseId).entranceBlip = createGameBlip(getHouseData(houseId).entrancePosition, blipModelId, 1, getColourByName("houseGreen")); setElementDimension(getHouseData(houseId).entranceBlip, getHouseData(houseId).entranceDimension); setElementOnAllDimensions(getHouseData(houseId).entranceBlip, false); - setElementStreamInDistance(getBusinessData(businessId).entranceBlip, getGlobalConfig().houseBlipStreamInDistance); - setElementStreamOutDistance(getBusinessData(businessId).entranceBlip, getGlobalConfig().houseBlipStreamOutDistance); + //getHouseData(houseId).entranceBlip.streamInDistance = 300; + //getHouseData(houseId).entranceBlip.streamOutDistance = 350; setEntityData(getHouseData(houseId).entranceBlip, "vrr.owner.type", VRR_BLIP_HOUSE_ENTRANCE, false); setEntityData(getHouseData(houseId).entranceBlip, "vrr.owner.id", houseId, false); addToWorld(getHouseData(houseId).entranceBlip); @@ -926,8 +923,6 @@ function createHouseExitPickup(houseId) { getHouseData(houseId).exitPickup = createGamePickup(pickupModelId, getHouseData(houseId).exitPosition, getGameConfig().pickupTypes[getServerGame()].house); setElementDimension(getHouseData(houseId).exitPickup, getHouseData(houseId).exitDimension); setElementOnAllDimensions(getHouseData(houseId).exitPickup, false); - setElementStreamInDistance(getBusinessData(businessId).exitPickup, getGlobalConfig().housePickupStreamInDistance); - setElementStreamOutDistance(getBusinessData(businessId).exitPickup, getGlobalConfig().housePickupStreamOutDistance); setEntityData(getHouseData(houseId).exitPickup, "vrr.owner.type", VRR_PICKUP_HOUSE_EXIT, false); setEntityData(getHouseData(houseId).exitPickup, "vrr.owner.id", houseId, false); setEntityData(getHouseData(houseId).exitPickup, "vrr.label.type", VRR_LABEL_EXIT, true); @@ -954,8 +949,6 @@ function createHouseExitBlip(houseId) { getHouseData(houseId).exitBlip = createGameBlip(blipModelId, getHouseData(houseId).exitPosition, 1, getColourByName("houseGreen")); setElementDimension(getHouseData(houseId).exitBlip, getHouseData(houseId).entranceDimension); setElementOnAllDimensions(getHouseData(houseId).exitBlip, false); - setElementStreamInDistance(getBusinessData(businessId).exitBlip, getGlobalConfig().houseBlipStreamInDistance); - setElementStreamOutDistance(getBusinessData(businessId).exitBlip, getGlobalConfig().houseBlipStreamOutDistance); setEntityData(getHouseData(houseId).exitBlip, "vrr.owner.type", VRR_BLIP_HOUSE_EXIT, false); setEntityData(getHouseData(houseId).exitBlip, "vrr.owner.id", houseId, false); addToWorld(getHouseData(houseId).exitBlip); From 11af577b4297049ca5e1075fa7d4d5a053f6a36d Mon Sep 17 00:00:00 2001 From: Vortrex <3858226+VortrexFTW@users.noreply.github.com> Date: Thu, 30 Dec 2021 16:03:17 -0600 Subject: [PATCH 002/337] Revert "Add blip/pickup distance to global cfg" This reverts commit 5a916c4a9853c1cbeb75be368050c01d5f5da253. --- scripts/server/config.js | 7 ------- 1 file changed, 7 deletions(-) diff --git a/scripts/server/config.js b/scripts/server/config.js index 65474917..78cd89a2 100644 --- a/scripts/server/config.js +++ b/scripts/server/config.js @@ -80,13 +80,6 @@ let globalConfig = { VRR_ITEM_USETYPE_VEHTIRE, ], vehicleInactiveRespawnDelay: 1800000, // 20 minutes - housePickupStreamInDistance: 50, - housePickupStreamOutDistance: 75, - businessPickupStreamInDistance: 50, - businessPickupStreamOutDistance: 75, - jobPickupStreamInDistance: 50, - jobPickupStreamOutDistance: 75, - vehicleTrunkRearDistance: 3, }; // =========================================================================== From dccefe335ff4bdf298ab90fbe23b46c74edf4cf7 Mon Sep 17 00:00:00 2001 From: Vortrex <3858226+VortrexFTW@users.noreply.github.com> Date: Thu, 30 Dec 2021 16:03:26 -0600 Subject: [PATCH 003/337] Revert "Don't clear temp peds/vehicles" This reverts commit 7a5167743bc5ff520688adf0d9093cb007fb9dc6. --- scripts/server/event.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/scripts/server/event.js b/scripts/server/event.js index ca3008e4..9aee4443 100644 --- a/scripts/server/event.js +++ b/scripts/server/event.js @@ -95,6 +95,9 @@ function onPlayerQuit(event, client, quitReasonId) { } messageDiscordEventChannel(`👋 ${getPlayerDisplayForConsole(client)} has left the server.`); + + clearTemporaryVehicles(); + clearTemporaryPeds(); } // =========================================================================== From d44a0792accad2b4ac2c571109051d8b6aad7150 Mon Sep 17 00:00:00 2001 From: Vortrex <3858226+VortrexFTW@users.noreply.github.com> Date: Thu, 30 Dec 2021 16:08:21 -0600 Subject: [PATCH 004/337] Revert "Add utils for new element streaming funcs" This reverts commit 22d39ceb69e806ba9e819285d016f6a8aa9076d9. --- scripts/server/native/connected.js | 40 ------------------------------ 1 file changed, 40 deletions(-) diff --git a/scripts/server/native/connected.js b/scripts/server/native/connected.js index 7dd3118c..4f88d10e 100644 --- a/scripts/server/native/connected.js +++ b/scripts/server/native/connected.js @@ -424,46 +424,6 @@ function setElementOnAllDimensions(element, state) { // =========================================================================== -function setElementDefaultExistance(element, state) { - if(!isNull(element) && element != false) { - element.defaultExistance = state; - } -} - -// =========================================================================== - -function setElementExistsFor(element, client, state) { - if(!isNull(element) && element != false) { - element.setExistsFor(client, state); - } -} - -// =========================================================================== - -function clearElementExistsFor(element) { - if(!isNull(element) && element != false) { - element.clearExistsFor(); - } -} - -// =========================================================================== - -function setElementStreamInDistance(element, distance) { - if(!isNull(element) && element != false) { - element.streamInDistance = distance; - } -} - -// =========================================================================== - -function setElementStreamOutDistance(element, distance) { - if(!isNull(element) && element != false) { - element.streamOutDistance = distance; - } -} - -// =========================================================================== - function destroyGameElement(element) { if(!isNull(element) && element != false) { destroyElement(element); From 6fc61c6ed0a286d10d944f87cf740b5bf07b4bfc Mon Sep 17 00:00:00 2001 From: Vortrex <3858226+VortrexFTW@users.noreply.github.com> Date: Sat, 1 Jan 2022 13:25:41 -0600 Subject: [PATCH 005/337] Use native for HUD on IV --- scripts/client/server.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/scripts/client/server.js b/scripts/client/server.js index aa46f493..2ac8df8b 100644 --- a/scripts/client/server.js +++ b/scripts/client/server.js @@ -123,7 +123,11 @@ function setPlayer2DRendering(hudState, labelState, smallGameMessageState, score renderHUD = hudState; if(typeof setHUDEnabled != "undefined") { - setHUDEnabled(hudState); + if(getGame() == VRR_GAME_GTA_IV) { + natives.displayHud(false); + } else { + setHUDEnabled(hudState); + } } renderLabels = labelState; From bec271fe948ba5530eb392860fc2df3f4f7f7dd8 Mon Sep 17 00:00:00 2001 From: Vortrex <3858226+VortrexFTW@users.noreply.github.com> Date: Sat, 1 Jan 2022 13:26:17 -0600 Subject: [PATCH 006/337] Disable loading job route from db until ready --- scripts/server/job.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/server/job.js b/scripts/server/job.js index 6f5749b0..4f3db3cd 100644 --- a/scripts/server/job.js +++ b/scripts/server/job.js @@ -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!`); } From d9897033704160073b23f484e7c46123997628c5 Mon Sep 17 00:00:00 2001 From: Vortrex <3858226+VortrexFTW@users.noreply.github.com> Date: Sat, 1 Jan 2022 13:26:28 -0600 Subject: [PATCH 007/337] More native utils --- scripts/server/native/connected.js | 34 +++++++++++++++++++++++++++++- 1 file changed, 33 insertions(+), 1 deletion(-) diff --git a/scripts/server/native/connected.js b/scripts/server/native/connected.js index 4f88d10e..7f369e5b 100644 --- a/scripts/server/native/connected.js +++ b/scripts/server/native/connected.js @@ -480,9 +480,41 @@ function setVehicleSiren(vehicle, siren) { // =========================================================================== -function setVehicleColours(vehicle, colour1, colour2) { +function getVehicleLights(vehicle) { + return vehicle.lights; +} + +// =========================================================================== + +function getVehicleEngine(vehicle) { + return vehicle.engine; +} + +// =========================================================================== + +function getVehicleLocked(vehicle) { + return vehicle.locked; +} + +// =========================================================================== + +function getVehicleSiren(vehicle) { + return vehicle.siren; +} + +// =========================================================================== + +function setVehicleColours(vehicle, colour1, colour2, colour3 = -1, colour4 = -1) { vehicle.colour1 = colour1; vehicle.colour2 = colour2; + + if(colour3 != -1) { + vehicle.colour3 = colour3; + } + + if(colour4 != -1) { + vehicle.colour4 = colour4; + } } // =========================================================================== From 94bb623e6ac1dd3b80afe5ff33042ee2b0a8aba4 Mon Sep 17 00:00:00 2001 From: Vortrex <3858226+VortrexFTW@users.noreply.github.com> Date: Sat, 1 Jan 2022 13:26:51 -0600 Subject: [PATCH 008/337] Make sure vehicle exists before saving pos/rot --- scripts/server/vehicle.js | 38 +++++++++++++++++++++++--------------- 1 file changed, 23 insertions(+), 15 deletions(-) diff --git a/scripts/server/vehicle.js b/scripts/server/vehicle.js index e25cf955..7baa250c 100644 --- a/scripts/server/vehicle.js +++ b/scripts/server/vehicle.js @@ -78,13 +78,15 @@ function saveVehicleToDatabase(vehicleDataId) { logToConsole(LOG_VERBOSE, `[VRR.Vehicle]: Saving vehicle ${tempVehicleData.databaseId} to database ...`); let dbConnection = connectToDatabase(); if(dbConnection) { - if(!tempVehicleData.spawnLocked) { - if(areServerElementsSupported()) { - tempVehicleData.spawnPosition = tempVehicleData.vehicle.position; - tempVehicleData.spawnRotation = tempVehicleData.vehicle.heading; - } else { - tempVehicleData.spawnPosition = tempVehicleData.syncPosition; - tempVehicleData.spawnRotation = tempVehicleData.syncHeading; + if(tempVehicleData.vehicle != false) { + if(!tempVehicleData.spawnLocked) { + if(areServerElementsSupported()) { + tempVehicleData.spawnPosition = tempVehicleData.vehicle.position; + tempVehicleData.spawnRotation = tempVehicleData.vehicle.heading; + } else { + tempVehicleData.spawnPosition = tempVehicleData.syncPosition; + tempVehicleData.spawnRotation = tempVehicleData.syncHeading; + } } } @@ -1174,6 +1176,7 @@ function respawnVehicle(vehicle) { // =========================================================================== function spawnVehicle(vehicleData) { + logToConsole(LOG_DEBUG, `[VRR.Vehicle]: Spawning ${getVehicleNameFromModel(vehicleData.model)} at ${vehicleData.spawnPosition.x}, ${vehicleData.spawnPosition.y}, ${vehicleData.spawnPosition.z} with heading ${vehicleData.spawnRotation}`); let vehicle = createGameVehicle(vehicleData.model, vehicleData.spawnPosition, vehicleData.spawnRotation); addToWorld(vehicle); @@ -1184,25 +1187,30 @@ function spawnVehicle(vehicleData) { if(isGameFeatureSupported("vehicleColours")) { if(vehicleData.colour1IsRGBA && vehicleData.colour2IsRGBA) { vehicle.setRGBColours(vehicleData.colour1RGBA, vehicleData.colour2RGBA); + let colour1 = rgbaArrayFromToColour(vehicleData.colour1RGBA); + let colour2 = rgbaArrayFromToColour(vehicleData.colour2RGBA); + logToConsole(LOG_VERBOSE, `[VRR.Vehicle]: Setting vehicle ${vehicle.id}'s colours to RGBA [${colour1[0]}, ${colour1[1]}, ${colour1[2]}, ${colour1[3]}], [(]${colour2[0]}, ${colour2[1]}, ${colour2[2]}, ${colour2[3]}]`); + vehicle.setRGBColours(vehicleData.colour1RGBA, vehicleData.colour2RGBA); } else { - vehicle.colour1 = vehicleData.colour1; - vehicle.colour2 = vehicleData.colour2; - vehicle.colour3 = vehicleData.colour3; - vehicle.colour4 = vehicleData.colour4; + setVehicleColours(vehicle, vehicleData.colour1, vehicleData.colour2, vehicleData.colour3, vehicleData.colour4); + logToConsole(LOG_VERBOSE, `[VRR.Vehicle]: Setting vehicle ${vehicle.id}'s colours to ${vehicleData.colour1}, ${vehicleData.colour2}, ${vehicleData.colour3}, ${vehicleData.colour4}`); } } if(vehicleData.spawnLocked == true) { - vehicle.engine = false; + setVehicleEngine(vehicle, false); + logToConsole(LOG_VERBOSE, `[VRR.Vehicle]: Setting vehicle ${vehicle.id}'s engine to OFF`); } else { - vehicle.engine = intToBool(vehicleData.engine); + setVehicleEngine(vehicle, intToBool(vehicleData.engine)); + logToConsole(LOG_VERBOSE, `[VRR.Vehicle]: Setting vehicle ${vehicle.id}'s engine to ${toUpperCase(getOnOffFromBool(getVehicleEngineState(vehicle)))}`); } if(typeof vehicle.locked != "undefined") { - vehicle.locked = intToBool(vehicleData.locked); + setVehicleLocked(vehicle, intToBool(vehicleData.locked)); + logToConsole(LOG_VERBOSE, `[VRR.Vehicle]: Setting vehicle ${vehicle.id}'s lock state to ${toUpperCase(getOnOffFromBool(getVehicleLockState(vehicle)))}`); } - vehicle.dimension = vehicleData.dimension; + setElementDimension(vehicle.dimension, vehicleData.dimension); vehicleData.vehicle = vehicle; From 2c70601cbbd23fcf04a5babcee4c8c9d06f3f794 Mon Sep 17 00:00:00 2001 From: Vortrex <3858226+VortrexFTW@users.noreply.github.com> Date: Sun, 2 Jan 2022 20:00:46 -0600 Subject: [PATCH 009/337] Fix vehicle heading --- scripts/server/vehicle.js | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/scripts/server/vehicle.js b/scripts/server/vehicle.js index 7baa250c..3566f8ec 100644 --- a/scripts/server/vehicle.js +++ b/scripts/server/vehicle.js @@ -1144,7 +1144,6 @@ function stopRentingVehicle(client) { getPlayerData(client).rentingVehicle = false; getVehicleData(vehicle).rentedBy = false; respawnVehicle(vehicle); - getVehicleData(vehicle).needsSaved = true; } @@ -1164,6 +1163,7 @@ function respawnVehicle(vehicle) { destroyElement(vehicle); vehicles[i].vehicle = false; + let newVehicle = spawnVehicle(vehicles[i]); vehicles[i].vehicle = newVehicle; setEntityData(newVehicle, "vrr.dataSlot", i, false); @@ -1178,6 +1178,7 @@ function respawnVehicle(vehicle) { function spawnVehicle(vehicleData) { logToConsole(LOG_DEBUG, `[VRR.Vehicle]: Spawning ${getVehicleNameFromModel(vehicleData.model)} at ${vehicleData.spawnPosition.x}, ${vehicleData.spawnPosition.y}, ${vehicleData.spawnPosition.z} with heading ${vehicleData.spawnRotation}`); let vehicle = createGameVehicle(vehicleData.model, vehicleData.spawnPosition, vehicleData.spawnRotation); + setVehicleHeading(vehicle, vehicleData.spawnRotation) addToWorld(vehicle); if(!vehicle) { @@ -1202,12 +1203,12 @@ function spawnVehicle(vehicleData) { logToConsole(LOG_VERBOSE, `[VRR.Vehicle]: Setting vehicle ${vehicle.id}'s engine to OFF`); } else { setVehicleEngine(vehicle, intToBool(vehicleData.engine)); - logToConsole(LOG_VERBOSE, `[VRR.Vehicle]: Setting vehicle ${vehicle.id}'s engine to ${toUpperCase(getOnOffFromBool(getVehicleEngineState(vehicle)))}`); + logToConsole(LOG_VERBOSE, `[VRR.Vehicle]: Setting vehicle ${vehicle.id}'s engine to ${toUpperCase(getOnOffFromBool(getVehicleEngine(vehicle)))}`); } if(typeof vehicle.locked != "undefined") { setVehicleLocked(vehicle, intToBool(vehicleData.locked)); - logToConsole(LOG_VERBOSE, `[VRR.Vehicle]: Setting vehicle ${vehicle.id}'s lock state to ${toUpperCase(getOnOffFromBool(getVehicleLockState(vehicle)))}`); + logToConsole(LOG_VERBOSE, `[VRR.Vehicle]: Setting vehicle ${vehicle.id}'s lock state to ${toUpperCase(getOnOffFromBool(getVehicleLocked(vehicle)))}`); } setElementDimension(vehicle.dimension, vehicleData.dimension); From 1e3b8c53775799587e7b4c47c4a7ed4f26079082 Mon Sep 17 00:00:00 2001 From: Vortrex <3858226+VortrexFTW@users.noreply.github.com> Date: Sun, 2 Jan 2022 20:08:15 -0600 Subject: [PATCH 010/337] House/biz loc const --- scripts/server/const.js | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/scripts/server/const.js b/scripts/server/const.js index 5fcb783b..0ac7fcdf 100644 --- a/scripts/server/const.js +++ b/scripts/server/const.js @@ -68,16 +68,16 @@ const VRR_GATEOWNER_PUBLIC = 5; // Is a public gate. Technically // Business Location Types const VRR_BIZLOC_NONE = 0; // None -const VRR_BIZLOC_MAINDOOR = 0; // Main entrance/exit -const VRR_BIZLOC_DOOR = 1; // Any other entrance/exit -const VRR_BIZLOC_FUEL = 2; // Fuel pump -const VRR_BIZLOC_DRIVETHRU = 3; // Drivethrough -const VRR_BIZLOC_VENDMACHINE = 4; // Vending machine +const VRR_BIZLOC_GATE = 1; // Center of any moveable gate that belongs to the biz +const VRR_BIZLOC_GARAGE = 2; // Location for attached garage (pos1 = outside, pos2 = inside). Use pos to teleport or spawn veh/ped +const VRR_BIZLOC_FUEL = 3; // Fuel pump +const VRR_BIZLOC_DRIVETHRU = 4; // Drivethrough +const VRR_BIZLOC_VENDMACHINE = 5; // Vending machine // House Location Types const VRR_HOUSELOC_NONE = 0; // None -const VRR_HOUSELOC_MAINDOOR = 0; // Main entrance/exit -const VRR_HOUSELOC_DOOR = 1; // Any other entrance/exit +const VRR_HOUSELOC_GATE = 1; // Center of any moveable gate that belongs to the house +const VRR_HOUSELOC_GARAGE = 2; // Location for garage (pos1 = outside, pos2 = inside). Use pos to teleport or spawn veh/ped // Account Contact Types const VRR_CONTACT_NONE = 0; From 7639f16c13c8a60e0bdc3742e7b6399805e88989 Mon Sep 17 00:00:00 2001 From: Vortrex <3858226+VortrexFTW@users.noreply.github.com> Date: Tue, 4 Jan 2022 15:09:51 -0600 Subject: [PATCH 011/337] Add insert as default GUI toggle keybind --- config/keybind.json | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/config/keybind.json b/config/keybind.json index 2eb9a14f..784f928b 100644 --- a/config/keybind.json +++ b/config/keybind.json @@ -104,6 +104,11 @@ "keyName": "9", "commandString": "item 9", "keyState": 1 + }, + { + "keyName": "insert", + "commandString": "gui", + "keyState": 1 } ] } \ No newline at end of file From ecd6c77de25462619ab4e41f9f16d9fa170bb6ba Mon Sep 17 00:00:00 2001 From: Vortrex <3858226+VortrexFTW@users.noreply.github.com> Date: Tue, 4 Jan 2022 15:10:02 -0600 Subject: [PATCH 012/337] Add some more strings to locale --- locale/english.json | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/locale/english.json b/locale/english.json index eedb7815..2f91621d 100644 --- a/locale/english.json +++ b/locale/english.json @@ -10,9 +10,9 @@ "AccentNotFound": "Accent not found", "AccentSet": "You set your accent to {ALTCOLOUR}{1}", "AnimationNotFound": "That animation doesn't exist", - "AnimationCommandTip": "Use {ALTCOLOUR}/animlist{MAINCOLOUR} to see a list of valid animations", + "AnimationCommandTip": "Use {1} to see a list of valid animations", "AnimationInvalidDistance": "The distance must be between 0 and 3", - "AnimationStopCommandTip": "Use {ALTCOLOUR}/stopanim{MAINCOLOUR} to stop your animation", + "AnimationStopCommandTip": "Use {1} to stop your animation", "CantBanClient": "You cannot ban this person", "PlayerAccountBanned": "{1} has been account banned", "ClanNotFound": "Clan not found", @@ -24,5 +24,19 @@ "ClanCantChangeMemberTag": "You can not change clan member's tags", "ClanPlayerNotInSameClan": "That player is not in your clan", "ClanCantChangeRankLevel": "You can not change clan rank's level", - "ClanCantChangeRankTag": "You can not change clan rank's tags" + "ClanCantChangeRankTag": "You can not change clan rank's tags", + "NameNotRegistered": "Your name is not registered! Use /register to make an account.", + "AutomaticLoginIPToggle": "Automatic login by IP is now {1}", + "RandomTipsToggle": "Random tips are now {1}", + "ActionTipsToggle": "Action tips are now {1}", + "AutoSpawnLastCharToggle": "Automatic spawn as last used character is {1}", + "AccountGUISettingToggle": "⚙️ GUI is now {1}", + "On": "On", + "Off": "Off", + "Yes": "Yes", + "No": "No", + "True": "True", + "False": "False", + "Locked": "Locked", + "Unlocked": "Unlocked" } \ No newline at end of file From deeda880ffb2351d491dc7978c705a49c2ffc33a Mon Sep 17 00:00:00 2001 From: Vortrex <3858226+VortrexFTW@users.noreply.github.com> Date: Tue, 4 Jan 2022 15:10:27 -0600 Subject: [PATCH 013/337] Use more locale strings + move keybinds to client data --- scripts/server/account.js | 29 +++++++++++++---------------- 1 file changed, 13 insertions(+), 16 deletions(-) diff --git a/scripts/server/account.js b/scripts/server/account.js index c12f2b7d..6da906f0 100644 --- a/scripts/server/account.js +++ b/scripts/server/account.js @@ -16,7 +16,7 @@ function initAccountScript() { function loginCommand(command, params, client) { if(!isPlayerRegistered(client)) { - messagePlayerError(client, "Your name is not registered! Use /register to make an account."); + messagePlayerError(client, getLocaleString(client, "NameNotRegistered")); return false; } @@ -36,10 +36,10 @@ function toggleAutoLoginByIPCommand(command, params, client) { if(hasBitFlag(getPlayerData(client).accountData.settings, flagValue)) { getPlayerData(client).accountData.settings = removeBitFlag(getPlayerData(client).accountData.settings, flagValue); - messagePlayerSuccess(client, `Automatic login by IP is now {softRed}OFF {white}`); + messagePlayerSuccess(client, getLocaleString(client, "AutomaticLoginIP", `{softRed}${toUpperCase(getLocaleString(client, "Off"))}`)); } else { getPlayerData(client).accountData.settings = addBitFlag(getPlayerData(client).accountData.settings, flagValue); - messagePlayerSuccess(client, `Automatic login by IP is now {softGreen}ON {white}(${client.ip})`); + messagePlayerSuccess(client, getLocaleString(client, "AutomaticLoginIPToggle", `{softGreen}${toUpperCase(getLocaleString(client, "On"))}`)); } return true; } @@ -51,10 +51,10 @@ function toggleNoRandomTipsCommand(command, params, client) { if(hasBitFlag(getPlayerData(client).accountData.settings, flagValue)) { getPlayerData(client).accountData.settings = removeBitFlag(getPlayerData(client).accountData.settings, flagValue); - messagePlayerSuccess(client, `Random tips are now {softRed}OFF`); + messagePlayerSuccess(client, getLocaleString(client, "RandomTipsToggle", `{softRed}${toUpperCase(getLocaleString(client, "Off"))}`)); } else { getPlayerData(client).accountData.settings = addBitFlag(getPlayerData(client).accountData.settings, flagValue); - messagePlayerSuccess(client, `Random tips are now {softGreen}ON`); + messagePlayerSuccess(client, getLocaleString(client, "RandomTipsToggle", `{softGreen}${toUpperCase(getLocaleString(client, "On"))}`)); } return true; } @@ -66,10 +66,10 @@ function toggleNoActionTipsCommand(command, params, client) { if(hasBitFlag(getPlayerData(client).accountData.settings, flagValue)) { getPlayerData(client).accountData.settings = removeBitFlag(getPlayerData(client).accountData.settings, flagValue); - messagePlayerSuccess(client, `Action tips are now {softRed}OFF`); + messagePlayerSuccess(client, getLocaleString(client, "ActionTipsToggle", `{softRed}${toUpperCase(getLocaleString(client, "Off"))}`)); } else { getPlayerData(client).accountData.settings = addBitFlag(getPlayerData(client).accountData.settings, flagValue); - messagePlayerSuccess(client, `Action tips are now {softGreen}ON`); + messagePlayerSuccess(client, getLocaleString(client, "ActionTipsToggle", `{softGreen}${toUpperCase(getLocaleString(client, "On"))}`)); } return true; } @@ -81,10 +81,10 @@ function toggleAutoSelectLastCharacterCommand(command, params, client) { if(hasBitFlag(getPlayerData(client).accountData.settings, flagValue)) { getPlayerData(client).accountData.settings = removeBitFlag(getPlayerData(client).accountData.settings, flagValue); - messagePlayerSuccess(client, `Automatic spawn as last used character is now {softRed}OFF`); + messagePlayerSuccess(client, getLocaleString(client, "AutoSpawnLastCharToggle", `{softRed}${toUpperCase(getLocaleString(client, "Off"))}`)); } else { getPlayerData(client).accountData.settings = addBitFlag(getPlayerData(client).accountData.settings, flagValue); - messagePlayerSuccess(client, `Automatic spawn as last used character is now {softGreen}ON`); + messagePlayerSuccess(client, getLocaleString(client, "AutoSpawnLastCharToggle", `{softGreen}${toUpperCase(getLocaleString(client, "On"))}`)); } return true; } @@ -96,12 +96,12 @@ function toggleAccountGUICommand(command, params, client) { if(!doesPlayerHaveGUIEnabled(client)) { getPlayerData(client).accountData.settings = removeBitFlag(getPlayerData(client).accountData.settings, flagValue); - messagePlayerNormal(client, `⚙️ GUI is now {softGreen}ON. {white}(if server has it enabled)`); + messagePlayerNormal(client, getLocaleString(client, "GUIAccountSettingToggle", `{softRed}${toUpperCase(getLocaleString(client, "Off"))}`)); logToConsole(LOG_DEBUG, `[VRR.Account] ${getPlayerDisplayForConsole(client)} has toggled GUI for their account ON.`); } else { getPlayerData(client).accountData.settings = addBitFlag(getPlayerData(client).accountData.settings, flagValue); - messagePlayerNormal(client, `⚙️ GUI is now {softRed}OFF. {white}(Any GUI stuff will be use via commands and message in the chatbox)`); - logToConsole(LOG_DEBUG, `[VRR.Account] ${getPlayerDisplayForConsole(client)} has toggled GUI for their account OFF.`); + messagePlayerNormal(client, getLocaleString(client, "GUIAccountSettingToggle", `{softGreen}${toUpperCase(getLocaleString(client, "On"))}`)); + logToConsole(LOG_DEBUG, `[VRR.Account] ${getPlayerDisplayForConsole(client)} has toggled GUI for their account ON.`); } if(!isPlayerLoggedIn(client)) { @@ -459,7 +459,6 @@ function loadAccountFromName(accountName, fullLoad = false) { let dbAssoc = fetchQueryAssoc(dbQuery); let tempAccountData = new AccountData(dbAssoc); if(fullLoad) { - tempAccountData.keyBinds = loadAccountKeybindsFromDatabase(tempAccountData.databaseId); tempAccountData.messages = loadAccountMessagesFromDatabase(tempAccountData.databaseId); tempAccountData.notes = loadAccountStaffNotesFromDatabase(tempAccountData.databaseId); tempAccountData.contacts = loadAccountContactsFromDatabase(tempAccountData.databaseId); @@ -486,7 +485,6 @@ function loadAccountFromId(accountId, fullLoad = false) { let tempAccountData = new AccountData(dbAssoc); freeDatabaseQuery(dbQuery); if(fullLoad) { - tempAccountData.keyBinds = loadAccountKeybindsFromDatabase(tempAccountData.databaseId); tempAccountData.messages = loadAccountMessagesFromDatabase(tempAccountData.databaseId); tempAccountData.notes = loadAccountStaffNotesFromDatabase(tempAccountData.databaseId); tempAccountData.contacts = loadAccountContactsFromDatabase(tempAccountData.databaseId); @@ -749,7 +747,6 @@ function createAccount(name, password, email = "") { if(getDatabaseInsertId(dbConnection) > 0) { let tempAccountData = loadAccountFromId(getDatabaseInsertId(dbConnection), false); createDefaultAccountServerData(tempAccountData.databaseId); - tempAccountData.keyBinds = loadAccountKeybindsFromDatabase(tempAccountData.databaseId); tempAccountData.messages = loadAccountMessagesFromDatabase(tempAccountData.databaseId); tempAccountData.notes = loadAccountStaffNotesFromDatabase(tempAccountData.databaseId); tempAccountData.contacts = loadAccountContactsFromDatabase(tempAccountData.databaseId); @@ -1031,12 +1028,12 @@ function initClient(client) { if(getServerConfig().useGUI && doesPlayerHaveGUIEnabled(client)) { logToConsole(LOG_DEBUG, `[VRR.Account] ${getPlayerDisplayForConsole(client)} is being shown the login GUI.`); showPlayerLoginGUI(client); - addPlayerKeyBind(client, getKeyIdFromParams("insert"), "gui", ""); } else { logToConsole(LOG_DEBUG, `[VRR.Account] ${getPlayerDisplayForConsole(client)} is being shown the login message (GUI disabled).`); messagePlayerNormal(client, `Welcome back to ${getServerName()}, ${getPlayerName(client)}! Please /login to continue.`, getColourByName("softGreen")); } playRadioStreamForPlayer(client, getServerIntroMusicURL(), true, getPlayerStreamingRadioVolume(client)); + loadAccountKeybindsFromDatabase(tempAccountData.databaseId); } } else { if(getServerConfig().useGUI && doesPlayerHaveGUIEnabled(client)) { From 94ff60c84a8613e177a9072cf961f1a8e887d14b Mon Sep 17 00:00:00 2001 From: Vortrex <3858226+VortrexFTW@users.noreply.github.com> Date: Tue, 4 Jan 2022 15:10:38 -0600 Subject: [PATCH 014/337] Move keybinds to client data --- scripts/server/class.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/server/class.js b/scripts/server/class.js index 62ce4b2c..9f6ac955 100644 --- a/scripts/server/class.js +++ b/scripts/server/class.js @@ -251,6 +251,8 @@ class ClientData { this.currentPickup = false; this.usingSkinSelect = false; + + this.keyBinds = []; } }; @@ -276,7 +278,6 @@ class AccountData { this.notes = []; this.messages = []; - this.keyBinds = []; this.contacts = []; this.subAccounts = []; @@ -306,7 +307,6 @@ class AccountData { this.notes = []; this.messages = []; - this.keyBinds = []; this.contacts = []; this.subAccounts = []; From 77db33b0e37060fb753b33e6267df85184658c69 Mon Sep 17 00:00:00 2001 From: Vortrex <3858226+VortrexFTW@users.noreply.github.com> Date: Tue, 4 Jan 2022 15:10:55 -0600 Subject: [PATCH 015/337] Format locale string --- scripts/server/animation.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/server/animation.js b/scripts/server/animation.js index 21ebce09..b4d1f178 100644 --- a/scripts/server/animation.js +++ b/scripts/server/animation.js @@ -26,7 +26,7 @@ function playPlayerAnimationCommand(command, params, client) { if(!animationSlot) { messagePlayerError(client, getLocaleString("AnimationNotFound")); - messagePlayerInfo(client, getLocaleString("AnimationHelpTip")); + messagePlayerInfo(client, getLocaleString("AnimationHelpTip"), `{ALTCOLOUR}/animlist{MAINCOLOUR}`); return false; } From 6a95053e8d5aaaea19b078e08b4fbb80478c2c49 Mon Sep 17 00:00:00 2001 From: Vortrex <3858226+VortrexFTW@users.noreply.github.com> Date: Tue, 4 Jan 2022 15:11:23 -0600 Subject: [PATCH 016/337] Fix wrong biz/pickup util name when del biz --- scripts/server/business.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/server/business.js b/scripts/server/business.js index e4e1fef6..632d3816 100644 --- a/scripts/server/business.js +++ b/scripts/server/business.js @@ -1424,8 +1424,8 @@ function deleteBusiness(businessId, deletedBy = 0) { disconnectFromDatabase(dbConnection); } - deleteAllBusinessBlips(businessId); - deleteAllBusinessPickups(businessId); + deleteBusinessBlips(businessId); + deleteBusinessPickups(businessId); removePlayersFromBusiness(businessId); From 846154b1d1fb24dc825dffecd16a63a68dbc5a05 Mon Sep 17 00:00:00 2001 From: Vortrex <3858226+VortrexFTW@users.noreply.github.com> Date: Tue, 4 Jan 2022 15:11:46 -0600 Subject: [PATCH 017/337] New dev cmds, add cmd help for possible matches --- scripts/server/command.js | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/scripts/server/command.js b/scripts/server/command.js index ef575bcd..27d93a40 100644 --- a/scripts/server/command.js +++ b/scripts/server/command.js @@ -224,6 +224,9 @@ function loadCommands() { commandData("streamnameall", streamAudioNameToAllPlayersCommand, " ", getStaffFlagValue("Developer"), true, true), commandData("forceresetpass", forceAccountPasswordResetCommand, "", getStaffFlagValue("Developer"), true, true), + commandData("fixblips", fixAllServerBlipsCommand, "", getStaffFlagValue("Developer"), true, true), + commandData("fixpickups", fixAllServerPickupsCommand, "", getStaffFlagValue("Developer"), true, true), + commandData("resetambience", resetAllServerAmbienceElementsCommand, "", getStaffFlagValue("Developer"), true, true), ], discord: [], email: [ @@ -650,7 +653,13 @@ function processPlayerCommand(command, params, client) { if(!doesCommandExist(toLowerCase(command))) { console.warn(`[VRR.Command] ${getPlayerDisplayForConsole(client)} attempted to use command, but failed (invalid command): /${command} ${paramsDisplay}`); - messagePlayerError(client, `The command {ALTCOLOUR}/${command} {MAINCOLOUR}does not exist! Use /help for commands and information.`); + + let possibleCommand = getCommandFromParams(command); + if(possibleCommand != false && doesPlayerHaveStaffPermission(client, getCommandRequiredPermissions(toLowerCase(possibleCommand.command)))) { + messagePlayerError(client, `The command {ALTCOLOUR}/${command} {MAINCOLOUR}does not exist! Did you mean {ALTCOLOUR}/${possibleCommand.command} ?`); + } else { + messagePlayerError(client, `The command {ALTCOLOUR}/${command} {MAINCOLOUR}does not exist! Use /help for commands and information.`); + } return false; } @@ -750,5 +759,4 @@ function getCommandAliasesNames(command) { return commandAliases; } -// =========================================================================== - +// =========================================================================== \ No newline at end of file From d8f5cfca6b28b1a3a4b0b6f6f5a8d4610d074f7d Mon Sep 17 00:00:00 2001 From: Vortrex <3858226+VortrexFTW@users.noreply.github.com> Date: Tue, 4 Jan 2022 15:12:01 -0600 Subject: [PATCH 018/337] Add missing income tax rate (fixes payday) --- scripts/server/config.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/scripts/server/config.js b/scripts/server/config.js index 78cd89a2..615177d2 100644 --- a/scripts/server/config.js +++ b/scripts/server/config.js @@ -63,7 +63,8 @@ let globalConfig = { upKeepPerVehicle: 250, upKeepPerHouse: 350, upKeepPerBusiness: 600 - } + }, + incomeTaxRate: 0.7, }, weaponEquippableTypes: [ VRR_ITEM_USETYPE_WEAPON, From e170be914d4cedfc477a12e43ec922930ee78637 Mon Sep 17 00:00:00 2001 From: Vortrex <3858226+VortrexFTW@users.noreply.github.com> Date: Tue, 4 Jan 2022 15:12:18 -0600 Subject: [PATCH 019/337] Add new dev cmds to fix/reset some stuff --- scripts/server/developer.js | 50 +++++++++++++++++++++++++++++++++++-- 1 file changed, 48 insertions(+), 2 deletions(-) diff --git a/scripts/server/developer.js b/scripts/server/developer.js index ee59e4fe..2ab2453e 100644 --- a/scripts/server/developer.js +++ b/scripts/server/developer.js @@ -526,7 +526,6 @@ function streamAudioURLToAllPlayersCommand(command, params, client) { let volume = splitParams[1]; playRadioStreamForPlayer(null, url, false, volume); - //https://www.dropbox.com/s/xw4m0y0guyzrwkk/lets-get-ready-to-rumble.ogg?dl=0 } // =========================================================================== @@ -542,7 +541,54 @@ function streamAudioNameToAllPlayersCommand(command, params, client) { let volume = splitParams[1]; playAudioFileForPlayer(null, name, false, volume); - //https://www.dropbox.com/s/xw4m0y0guyzrwkk/lets-get-ready-to-rumble.ogg?dl=0 +} + +// =========================================================================== + +function fixAllServerBlipsCommand(command, params, client) { + if(areParamsEmpty(params)) { + messagePlayerSyntax(client, getCommandSyntaxText(command)); + return false; + } + + let blips = getElementsByType(ELEMENT_BLIP); + blips.forEach((blip) => { + deleteGameElement(blip); + }); + + createAllJobBlips(); + createAllBusinessBlips(); + createAllHouseBlips(); +} + +// =========================================================================== + +function fixAllServerPickupsCommand(command, params, client) { + if(areParamsEmpty(params)) { + messagePlayerSyntax(client, getCommandSyntaxText(command)); + return false; + } + + let pickups = getElementsByType(ELEMENT_PICKUP); + pickups.forEach((pickup) => { + deleteGameElement(pickup); + }); + + createAllJobPickups(); + createAllBusinessPickups(); + createAllHousePickups(); +} + +// =========================================================================== + +function resetAllServerAmbienceElementsCommand(command, params, client) { + if(areParamsEmpty(params)) { + messagePlayerSyntax(client, getCommandSyntaxText(command)); + return false; + } + + clearTemporaryPeds(); + cleartTemporaryVehicles(); } // =========================================================================== \ No newline at end of file From 931f38a5e64f198842ef38fbbcdda19500f1f445 Mon Sep 17 00:00:00 2001 From: Vortrex <3858226+VortrexFTW@users.noreply.github.com> Date: Tue, 4 Jan 2022 15:12:36 -0600 Subject: [PATCH 020/337] Add tax and wealth cmds --- scripts/server/economy.js | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/scripts/server/economy.js b/scripts/server/economy.js index 764b3f7c..801db35d 100644 --- a/scripts/server/economy.js +++ b/scripts/server/economy.js @@ -84,4 +84,31 @@ function forcePlayerPayDayCommand(command, params, client) { playerPayDay(targetClient); } +// =========================================================================== + +function taxInfoCommand(command, params, client) { + if(areParamsEmpty(params)) { + messagePlayerSyntax(client, getCommandSyntaxText(command)); + return false; + } + + let wealth = calculateWealth(client); + let tax = calculateIncomeTax(wealth); + + messagePlayerInfo(client, `Your tax on payday is: $${tax}. Use {ALTCOLOUR}/help tax {MAINCOLOUR}for more information.`); +} + +// =========================================================================== + +function wealthInfoCommand(command, params, client) { + if(areParamsEmpty(params)) { + messagePlayerSyntax(client, getCommandSyntaxText(command)); + return false; + } + + let wealth = calculateWealth(client); + + messagePlayerInfo(client, `Your wealth is: $${wealth}. Use {ALTCOLOUR}/help wealth {MAINCOLOUR}for more information.`); +} + // =========================================================================== \ No newline at end of file From a7f6be0f9de665b29f5b75a861f2520aa2f29c4d Mon Sep 17 00:00:00 2001 From: Vortrex <3858226+VortrexFTW@users.noreply.github.com> Date: Tue, 4 Jan 2022 15:12:48 -0600 Subject: [PATCH 021/337] Fix veh respawn time when occupied --- scripts/server/event.js | 1 + 1 file changed, 1 insertion(+) diff --git a/scripts/server/event.js b/scripts/server/event.js index 9aee4443..d62408a3 100644 --- a/scripts/server/event.js +++ b/scripts/server/event.js @@ -281,6 +281,7 @@ async function onPlayerEnteredVehicle(client, clientVehicle, seat) { logToConsole(LOG_DEBUG, `[VRR.Event] ${getPlayerDisplayForConsole(client)} entered a ${getVehicleName(vehicle)} (ID: ${vehicle.getData("vrr.dataSlot")}, Database ID: ${getVehicleData(vehicle).databaseId})`); getPlayerData(client).lastVehicle = vehicle; + getVehicleData(vehicle).respawnTime = getCurrentUnixTimestamp() + getGlobalConfig().vehicleInactiveRespawnDelay; if(getPlayerVehicleSeat(client) == VRR_VEHSEAT_DRIVER) { vehicle.engine = getVehicleData(vehicle).engine; From 4217d321e5fd4820b671d40cec41eb09cbf1dabd Mon Sep 17 00:00:00 2001 From: Vortrex <3858226+VortrexFTW@users.noreply.github.com> Date: Tue, 4 Jan 2022 15:13:00 -0600 Subject: [PATCH 022/337] Add tax & wealth info to /help --- scripts/server/help.js | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/scripts/server/help.js b/scripts/server/help.js index 80d72a8d..999d3ba3 100644 --- a/scripts/server/help.js +++ b/scripts/server/help.js @@ -147,6 +147,14 @@ function helpCommand(command, params, client) { showRadioHelpMessage(client); break; + case "economy": + case "wealth": + case "tax": + case "taxes": + case "payday": + showWealthAndTaxHelpMessage(client); + break; + default: showMainHelpMessage(client); break; @@ -177,6 +185,7 @@ function helpCommand(command, params, client) { // == Badge ==================================== // == Accents ================================== // == Player Info ============================== +// == Wealth and Tax =========================== // =========================================================================== @@ -336,6 +345,16 @@ function showRadioHelpMessage(client) { // =========================================================================== +function showWealthAndTaxHelpMessage(client) { + messagePlayerInfo(client, `{clanOrange}== {jobYellow}Wealth and Tax {clanOrange}===========================`); + messagePlayerNormal(client, `{clanOrange}• {MAINCOLOUR}Your taxes on payday are calculated by your wealth.`); + messagePlayerNormal(client, `{clanOrange}• {MAINCOLOUR}Your wealth is a total sum based on how many vehicles, houses, and businesses you have.`); + messagePlayerNormal(client, `{clanOrange}• {MAINCOLOUR}Each vehicle is {ALTCOLOUR}${getGlobalConfig().economy.upKeepCosts.upKeepPerVehicle}, {MAINCOLOUR}each house is {ALTCOLOUR}${getGlobalConfig().economy.upKeepCosts.upKeepPerHouse}, {MAINCOLOUR}and each business is {ALTCOLOUR}${getGlobalConfig().economy.upKeepCosts.upKeepPerBusiness}`); + messagePlayerNormal(client, `{clanOrange}• {MAINCOLOUR}Your current wealth is $${wealth} ({ALTCOLOUR}$${getGlobalConfig().economy.upKeepCosts.upKeepPerVehicle*vehicles.length} {MAINCOLOUR}from ${vehicles.length} vehicles, {ALTCOLOUR}$${getGlobalConfig().economy.upKeepCosts.upKeepPerBusiness*businesses.length} {MAINCOLOUR}from ${businesses.length} businesses, and {ALTCOLOUR}$${getGlobalConfig().economy.upKeepCosts.upKeepPerHouse*houses.length} {MAINCOLOUR}from ${houses.length} houses)`) +} + +// =========================================================================== + function showCommandHelpMessage(client, commandName) { if(!commandName) { messagePlayerSyntax(client, `${getCommandSyntaxText("help")}command `); From 8ef5b6af3e6a8aab1ea6c377712f51af85c93ccb Mon Sep 17 00:00:00 2001 From: Vortrex <3858226+VortrexFTW@users.noreply.github.com> Date: Tue, 4 Jan 2022 15:13:22 -0600 Subject: [PATCH 023/337] Use job id util when splicing job loc --- scripts/server/job.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/server/job.js b/scripts/server/job.js index 4f3db3cd..ecb2396c 100644 --- a/scripts/server/job.js +++ b/scripts/server/job.js @@ -946,7 +946,7 @@ function deleteJobLocationCommand(command, params, client) { let tempIndex = closestJobLocation.index; let tempJob = closestJobLocation.job; deleteJobLocation(closestJobLocation); - getJobData(tempJob).locations.splice(tempIndex, 1); + getJobData(getJobIdFromDatabaseId(tempJob)).locations.splice(tempIndex, 1); } // =========================================================================== From c7a6d26daf6a85ea1ff5b2dd5ba7c25d9e3b34de Mon Sep 17 00:00:00 2001 From: Vortrex <3858226+VortrexFTW@users.noreply.github.com> Date: Tue, 4 Jan 2022 15:13:37 -0600 Subject: [PATCH 024/337] Don't delete keybind unless logged in --- scripts/server/keybind.js | 39 +++++++++++++++++++++------------------ 1 file changed, 21 insertions(+), 18 deletions(-) diff --git a/scripts/server/keybind.js b/scripts/server/keybind.js index 3b2b7064..92df8799 100644 --- a/scripts/server/keybind.js +++ b/scripts/server/keybind.js @@ -75,7 +75,7 @@ function addPlayerKeyBind(client, keys, command, params, tempKey = false) { keyBindData.databaseId = -1; } - getPlayerData(client).accountData.keyBinds.push(keyBindData); + getPlayerData(client).keyBinds.push(keyBindData); sendAddAccountKeyBindToClient(client, keys, (keys.length > 1) ? VRR_KEYSTATE_COMBO : VRR_KEYSTATE_UP); if(!doesPlayerHaveKeyBindsDisabled(client) && doesPlayerHaveKeyBindForCommand(client, "enter")) { @@ -90,10 +90,13 @@ function addPlayerKeyBind(client, keys, command, params, tempKey = false) { // =========================================================================== function removePlayerKeyBind(client, keyId) { - quickDatabaseQuery(`DELETE FROM acct_hotkey WHERE acct_hotkey_acct = ${getPlayerData(client).accountData.databaseId} AND acct_hotkey_key = ${keyId}`); - for(let i in getPlayerData(client).accountData.keyBinds) { - if(getPlayerData(client).accountData.keyBinds[i].key == keyId) { - getPlayerData(client).accountData.keyBinds.splice(i, 1); + if(isPlayerLoggedIn(client)) { + quickDatabaseQuery(`DELETE FROM acct_hotkey WHERE acct_hotkey_acct = ${getPlayerData(client).accountData.databaseId} AND acct_hotkey_key = ${keyId}`); + } + + for(let i in getPlayerData(client).keyBinds) { + if(getPlayerData(client).keyBinds[i].key == keyId) { + getPlayerData(client).keyBinds.splice(i, 1); } } sendRemoveAccountKeyBindToClient(client, keyId); @@ -110,8 +113,8 @@ function removePlayerKeyBind(client, keyId) { // =========================================================================== function doesPlayerHaveKeyBindForCommand(client, command) { - for(let i in getPlayerData(client).accountData.keyBinds) { - if(toLowerCase(getPlayerData(client).accountData.keyBinds[i].commandString.split(" ")[0]) == toLowerCase(command)) { + for(let i in getPlayerData(client).keyBinds) { + if(toLowerCase(getPlayerData(client).keyBinds[i].commandString.split(" ")[0]) == toLowerCase(command)) { return true; } } @@ -121,9 +124,9 @@ function doesPlayerHaveKeyBindForCommand(client, command) { // =========================================================================== function getPlayerKeyBindForCommand(client, command) { - for(let i in getPlayerData(client).accountData.keyBinds) { - if(toLowerCase(getPlayerData(client).accountData.keyBinds[i].commandString.split(" ")[0]) == toLowerCase(command)) { - return getPlayerData(client).accountData.keyBinds[i]; + for(let i in getPlayerData(client).keyBinds) { + if(toLowerCase(getPlayerData(client).keyBinds[i].commandString.split(" ")[0]) == toLowerCase(command)) { + return getPlayerData(client).keyBinds[i]; } } return false; @@ -132,8 +135,8 @@ function getPlayerKeyBindForCommand(client, command) { // =========================================================================== function doesPlayerHaveKeyBindForKey(client, key) { - for(let i in getPlayerData(client).accountData.keyBinds) { - if(getPlayerData(client).accountData.keyBinds[i].key == key) { + for(let i in getPlayerData(client).keyBinds) { + if(getPlayerData(client).keyBinds[i].key == key) { return true; } } @@ -149,9 +152,9 @@ function doesPlayerHaveKeyBindsDisabled(client) { // =========================================================================== function getPlayerKeyBindForKey(client, key) { - for(let i in getPlayerData(client).accountData.keyBinds) { - if(getPlayerData(client).accountData.keyBinds[i].key == key) { - return getPlayerData(client).accountData.keyBinds[i]; + for(let i in getPlayerData(client).keyBinds) { + if(getPlayerData(client).keyBinds[i].key == key) { + return getPlayerData(client).keyBinds[i]; } } return false; @@ -188,8 +191,8 @@ function playerUsedKeyBind(client, key) { function sendAccountKeyBindsToClient(client) { sendClearKeyBindsToClient(client); - for(let i in getPlayerData(client).accountData.keyBinds) { - sendAddAccountKeyBindToClient(client, getPlayerData(client).accountData.keyBinds[i].key, getPlayerData(client).accountData.keyBinds[i].keyState); + for(let i in getPlayerData(client).keyBinds) { + sendAddAccountKeyBindToClient(client, getPlayerData(client).keyBinds[i].key, getPlayerData(client).keyBinds[i].keyState); } } @@ -203,7 +206,7 @@ function loadKeyBindConfiguration() { // =========================================================================== function showKeyBindListCommand(command, params, client) { - let keybindList = getPlayerData(client).accountData.keyBinds.map(function(x) { return `{ALTCOLOUR}${toUpperCase(getKeyNameFromId(x.key))}: {MAINCOLOUR}${x.commandString}`; }); + let keybindList = getPlayerData(client).keyBinds.map(function(x) { return `{ALTCOLOUR}${toUpperCase(getKeyNameFromId(x.key))}: {MAINCOLOUR}${x.commandString}`; }); let chunkedList = splitArrayIntoChunks(keybindList, 6); From 4e13c58f4ed8abdbb5066a7e077b493ee20c781e Mon Sep 17 00:00:00 2001 From: Vortrex <3858226+VortrexFTW@users.noreply.github.com> Date: Tue, 4 Jan 2022 15:14:26 -0600 Subject: [PATCH 025/337] Fix give cash cmd accidentally giving to admin using it --- scripts/server/moderation.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/server/moderation.js b/scripts/server/moderation.js index 4ee3b3f8..e6599692 100644 --- a/scripts/server/moderation.js +++ b/scripts/server/moderation.js @@ -855,11 +855,11 @@ function givePlayerMoneyCommand(command, params, client) { return false; } - givePlayerCash(client, toInteger(amount)); + givePlayerCash(targetClient, toInteger(amount)); updatePlayerCash(targetClient); //messagePlayerSuccess(client, `You gave {ALTCOLOUR}$${amount} {MAINCOLOUR}to {ALTCOLOUR}${getCharacterFullName(targetClient)}`); messageAdmins(`${client.name} {MAINCOLOUR}gave {ALTCOLOUR}$${amount} {MAINCOLOUR}to {ALTCOLOUR}${getCharacterFullName(targetClient)}`) - messagePlayerAlert(client, `An admin gave you {ALTCOLOUR}$${amount}`); + messagePlayerAlert(targetClient, `An admin gave you {ALTCOLOUR}$${amount}`); } // =========================================================================== From 3de1e1483ff407138504b28fad62eb79923a42b1 Mon Sep 17 00:00:00 2001 From: Vortrex <3858226+VortrexFTW@users.noreply.github.com> Date: Tue, 4 Jan 2022 15:14:43 -0600 Subject: [PATCH 026/337] Fix veh respawn time --- scripts/server/timers.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/scripts/server/timers.js b/scripts/server/timers.js index 9f716306..c40608f0 100644 --- a/scripts/server/timers.js +++ b/scripts/server/timers.js @@ -238,7 +238,11 @@ function checkInactiveVehicleRespawns() { let vehicles = getElementsByType(ELEMENT_VEHICLE); for(let i in vehicles) { if(getCurrentUnixTimestamp() - getVehicleData(vehicles[i]).respawnTime >= getGlobalConfig().vehicleInactiveRespawnDelay) { - respawnVehicle(vehicles[i]); + if(!isVehicleUnoccupied(vehicles[i])) { + getVehicleData(vehicles[i]).respawnTime = getCurrentUnixTimestamp() + getGlobalConfig().vehicleInactiveRespawnDelay; + } else { + respawnVehicle(vehicles[i]); + } } } } From 64eca46118ce0a6f46d316150c1cf395c2d82c51 Mon Sep 17 00:00:00 2001 From: Vortrex <3858226+VortrexFTW@users.noreply.github.com> Date: Tue, 4 Jan 2022 15:14:56 -0600 Subject: [PATCH 027/337] Re-add clear temp stuff (for ambience) --- scripts/server/utilities.js | 32 +++++++++++++++++++++++++++++++- 1 file changed, 31 insertions(+), 1 deletion(-) diff --git a/scripts/server/utilities.js b/scripts/server/utilities.js index c1a52fac..224399aa 100644 --- a/scripts/server/utilities.js +++ b/scripts/server/utilities.js @@ -1513,4 +1513,34 @@ function getVehicleTrunkPosition(vehicle) { return getPosBehindPos(getVehiclePosition(vehicle), getVehicleHeading(vehicle), getGlobalConfig().vehicleTrunkRearDistance); } -// =========================================================================== \ No newline at end of file +// =========================================================================== + +function clearTemporaryVehicles() { + let vehicles = getElementsByType(ELEMENT_VEHICLE); + for(let i in vehicles) { + if(vehicles[i].owner == -1) { + if(!getVehicleData(vehicles[i])) { + if(isVehicleUnoccupied(vehicles[i])) { + destroyElement(vehicles[i]); + } + } + } + } +} + +// =========================================================================== + +function clearTemporaryPeds() { + let peds = getElementsByType(ELEMENT_PED); + for(let i in peds) { + if(peds[i].owner == -1) { + if(!peds[i].isType(ELEMENT_PLAYER)) { + if(peds[i].vehicle == null) { + if(!getNPCData(peds[i])) { + destroyElement(peds[i]); + } + } + } + } + } +} \ No newline at end of file From 9e3cca348135224a21c4076fa5b981ca963decea Mon Sep 17 00:00:00 2001 From: Vortrex <3858226+VortrexFTW@users.noreply.github.com> Date: Tue, 4 Jan 2022 15:15:13 -0600 Subject: [PATCH 028/337] Add LV & SF police stations to gamedata --- scripts/shared/gamedata.js | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/scripts/shared/gamedata.js b/scripts/shared/gamedata.js index a309a886..a559e797 100644 --- a/scripts/shared/gamedata.js +++ b/scripts/shared/gamedata.js @@ -4353,7 +4353,18 @@ let gameData = { blip: false, name: "Los Santos", }, - + { + position: toVector3(2290.06, 2428.15, 10.82), + heading: 0.0, + blip: false, + name: "Las Venturas", + }, + { + position: toVector3(-1606.92, 718.08, 12.23), + heading: 0.0, + blip: false, + name: "San Fierro", + }, ], [ // GTA UG From dd484c23ea3836ea245d72021100d24d0044cb80 Mon Sep 17 00:00:00 2001 From: Vortrex <3858226+VortrexFTW@users.noreply.github.com> Date: Tue, 4 Jan 2022 20:01:56 -0600 Subject: [PATCH 029/337] Fix keybinds --- scripts/server/account.js | 27 ++++++++++++++------------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/scripts/server/account.js b/scripts/server/account.js index 6da906f0..69889b35 100644 --- a/scripts/server/account.js +++ b/scripts/server/account.js @@ -1019,6 +1019,8 @@ function initClient(client) { let sessionId = saveConnectionToDatabase(client); getServerData().clients[client.index].session = sessionId; getServerData().clients[client.index].connectTime = Math.ceil(sdl.ticks); + getServerData().clients[client.index].keyBinds = loadAccountKeybindsFromDatabase(tempAccountData.databaseId); + sendAccountKeyBindsToClient(client); if(tempAccountData != false) { if(isAccountAutoIPLoginEnabled(tempAccountData) && getPlayerData(client).accountData.ipAddress == client.ip) { @@ -1033,13 +1035,11 @@ function initClient(client) { messagePlayerNormal(client, `Welcome back to ${getServerName()}, ${getPlayerName(client)}! Please /login to continue.`, getColourByName("softGreen")); } playRadioStreamForPlayer(client, getServerIntroMusicURL(), true, getPlayerStreamingRadioVolume(client)); - loadAccountKeybindsFromDatabase(tempAccountData.databaseId); } } else { if(getServerConfig().useGUI && doesPlayerHaveGUIEnabled(client)) { logToConsole(LOG_DEBUG, `[VRR.Account] ${getPlayerDisplayForConsole(client)} is being shown the register GUI.`); showPlayerRegistrationGUI(client); - addPlayerKeyBind(client, getKeyIdFromParams("insert"), "gui", ""); } else { logToConsole(LOG_DEBUG, `[VRR.Account] ${getPlayerDisplayForConsole(client)} is being shown the register message (GUI disabled).`); messagePlayerNormal(client, `Welcome to ${getServerName()}, ${getPlayerName(client)}! Please /register to continue.`, getColourByName("softGreen")); @@ -1059,7 +1059,6 @@ function saveConnectionToDatabase(client) { let dbQueryString = `INSERT INTO conn_main (conn_when_connect, conn_server, conn_script_version, conn_game_version, conn_client_version, conn_name, conn_ip) VALUES (NOW(), ${getServerConfig().databaseId}, '${scriptVersion}', '${client.gameVersion}', '0.0.0', '${safeName}', '${client.ip}')`; queryDatabase(dbConnection, dbQueryString); let connectionId = getDatabaseInsertId(dbConnection); - setEntityData(client, "vrr.connection", connectionId, false); getPlayerData(client).connectionId = connectionId; requestClientInfo(client); } @@ -1093,19 +1092,21 @@ function loadAccountKeybindsFromDatabase(accountDatabaseID) { tempAccountKeybinds.push(tempKeyBindData); } - if(dbConnection) { - dbQuery = queryDatabase(dbConnection, `SELECT * FROM acct_hotkey WHERE acct_hotkey_enabled = 1 AND acct_hotkey_acct = ${accountDatabaseID} AND acct_hotkey_server = ${getServerId()}`); - if(dbQuery) { - if(dbQuery.numRows > 0) { - while(dbAssoc = fetchQueryAssoc(dbQuery)) { - let tempAccountKeyBindData = new KeyBindData(dbAssoc); - tempAccountKeybinds.push(tempAccountKeyBindData); - logToConsole(LOG_DEBUG, `[VRR.Account]: Account keybind '${tempAccountKeyBindData.databaseId}' (Key ${tempAccountKeyBindData.key} '${toUpperCase(getKeyNameFromId(tempAccountKeyBindData.key))}') loaded from database successfully!`); + if(accountDatabaseID != 0) { + if(dbConnection) { + dbQuery = queryDatabase(dbConnection, `SELECT * FROM acct_hotkey WHERE acct_hotkey_enabled = 1 AND acct_hotkey_acct = ${accountDatabaseID} AND acct_hotkey_server = ${getServerId()}`); + if(dbQuery) { + if(dbQuery.numRows > 0) { + while(dbAssoc = fetchQueryAssoc(dbQuery)) { + let tempAccountKeyBindData = new KeyBindData(dbAssoc); + tempAccountKeybinds.push(tempAccountKeyBindData); + logToConsole(LOG_DEBUG, `[VRR.Account]: Account keybind '${tempAccountKeyBindData.databaseId}' (Key ${tempAccountKeyBindData.key} '${toUpperCase(getKeyNameFromId(tempAccountKeyBindData.key))}') loaded from database successfully!`); + } } + freeDatabaseQuery(dbQuery); } - freeDatabaseQuery(dbQuery); + disconnectFromDatabase(dbConnection); } - disconnectFromDatabase(dbConnection); } logToConsole(LOG_DEBUG, `[VRR.Account]: ${tempAccountKeybinds.length} account keybinds for account ${accountDatabaseID} loaded from database successfully!`); From 7aac32930c378972fffd6509c698ee69dfd5414d Mon Sep 17 00:00:00 2001 From: Vortrex <3858226+VortrexFTW@users.noreply.github.com> Date: Tue, 4 Jan 2022 20:02:07 -0600 Subject: [PATCH 030/337] Use bitflag util --- scripts/server/bitflag.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/scripts/server/bitflag.js b/scripts/server/bitflag.js index a29b49cb..80c66fa9 100644 --- a/scripts/server/bitflag.js +++ b/scripts/server/bitflag.js @@ -434,11 +434,12 @@ function givePlayerStaffFlag(client, flagName) { // =========================================================================== function takePlayerStaffFlag(client, flagName) { - if(!getStaffFlagValue(flagName)) { + let flagValue = getStaffFlagValue(flagName); + if(!flagValue) { return false; } - getPlayerData(client).accountData.flags.admin = getPlayerData(client).accountData.flags.admin & ~getStaffFlagValue(flagName); + getPlayerData(client).accountData.flags.admin = removeBitFlag(getPlayerData(client).accountData.flags.admin, flagValue); return true; } From d83a959fd532ae9b35ac78360a5a32252783fb82 Mon Sep 17 00:00:00 2001 From: Vortrex <3858226+VortrexFTW@users.noreply.github.com> Date: Tue, 4 Jan 2022 20:02:18 -0600 Subject: [PATCH 031/337] New client data class members --- scripts/server/class.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/scripts/server/class.js b/scripts/server/class.js index 9f6ac955..e46891c8 100644 --- a/scripts/server/class.js +++ b/scripts/server/class.js @@ -253,6 +253,10 @@ class ClientData { this.usingSkinSelect = false; this.keyBinds = []; + + this.connectionId = 0; + + this.incomingDamageMultiplier = 1; } }; From e411d6f476f0af7cf36f3ba2e8c8b8a3097c7a07 Mon Sep 17 00:00:00 2001 From: Vortrex <3858226+VortrexFTW@users.noreply.github.com> Date: Tue, 4 Jan 2022 20:02:37 -0600 Subject: [PATCH 032/337] Implement custom weapon damage --- scripts/server/client.js | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/scripts/server/client.js b/scripts/server/client.js index bfe7d182..f786022d 100644 --- a/scripts/server/client.js +++ b/scripts/server/client.js @@ -498,7 +498,7 @@ function sendPlayerFrozenState(client, state) { // =========================================================================== -function givePlayerWeapon(client, weaponId, ammo, active) { +function givePlayerWeapon(client, weaponId, ammo, active = true) { logToConsole(LOG_DEBUG, `[VRR.Client] Sending signal to ${getPlayerDisplayForConsole(client)} to give weapon (Weapon: ${weaponId}, Ammo: ${ammo})`); triggerNetworkEvent("vrr.giveWeapon", client, weaponId, ammo, active); } @@ -677,6 +677,17 @@ function playerDamagedByPlayer(client, damagerEntityName, weaponId, pedPiece, he } break; + case VRR_WEAPON_DAMAGE_EVENT_EXTINGUISH: + break; + + case VRR_WEAPON_DAMAGE_EVENT_MACE: + break; + + case VRR_WEAPON_DAMAGE_EVENT_NORMAL: + getPlayerData(client).health = getPlayerData(client).health-(healthLoss*getPlayerData(client).incomingDamageMultiplier); + setPlayerHealth(client, getPlayerData(client).health); + break; + default: getPlayerData(client).health = getPlayerData(client).health-(healthLoss*getPlayerData(client).incomingDamageMultiplier); setPlayerHealth(client, getPlayerData(client).health); From b63ea9805aba1a7be4af2178ecbfac62f4d5e3a9 Mon Sep 17 00:00:00 2001 From: Vortrex <3858226+VortrexFTW@users.noreply.github.com> Date: Tue, 4 Jan 2022 20:02:52 -0600 Subject: [PATCH 033/337] New economy and item cmds --- scripts/server/command.js | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/scripts/server/command.js b/scripts/server/command.js index 27d93a40..9b5fb693 100644 --- a/scripts/server/command.js +++ b/scripts/server/command.js @@ -229,6 +229,11 @@ function loadCommands() { commandData("resetambience", resetAllServerAmbienceElementsCommand, "", getStaffFlagValue("Developer"), true, true), ], discord: [], + economy: [ + commandData("tax", taxInfoCommand, "", getStaffFlagValue("None"), true, true), + commandData("wealth", wealthInfoCommand, "", getStaffFlagValue("None"), true, true), + commandData("forcepayday", forcePlayerPayDayCommand, "", getStaffFlagValue("ManageServer"), true, true, "Gives a player an instant payday."), + ], email: [ commandData("testemail", testEmailCommand, "", getStaffFlagValue("Developer"), true, true), ], @@ -271,6 +276,7 @@ function loadCommands() { ], item: [ commandData("i", playerSwitchHotBarSlotCommand, "", getStaffFlagValue("None"), true, false, "Switches to the item in the specified slot of your inventory."), + commandData("item", playerSwitchHotBarSlotCommand, "", getStaffFlagValue("None"), true, false, "Switches to the item in the specified slot of your inventory."), commandData("addgrounditem", createGroundItemCommand, "", getStaffFlagValue("ManageItems"), true, false, "Spawns a new item on the ground at your position."), commandData("additem", createItemCommand, "", getStaffFlagValue("ManageItems"), true, false, "Spawns a new item in your hotbar inventory."), commandData("delgrounditem", deleteGroundItemCommand, "", getStaffFlagValue("ManageItems"), true, false, "Destroys the nearest item on the ground."), @@ -388,7 +394,7 @@ function loadCommands() { commandData("dn", teleportDownCommand, "", getStaffFlagValue("BasicModeration"), true, true, "Teleports you downward a certain distance in meters."), commandData("int", playerInteriorCommand, "", getStaffFlagValue("BasicModeration"), true, true, "Gets or sets a player's game interior."), commandData("vw", playerVirtualWorldCommand, "", getStaffFlagValue("BasicModeration"), true, true, "Gets or sets a player's virtual world/dimension."), - commandData("addstaffflag", addStaffFlagCommand, " ", getStaffFlagValue("ManageAdmins"), true, true, "Gives a player a staff flaf (this server only)."), + commandData("addstaffflag", addStaffFlagCommand, " ", getStaffFlagValue("ManageAdmins"), true, true, "Gives a player a staff flag by name (this server only)."), commandData("delstaffflag", takeStaffFlagCommand, " ", getStaffFlagValue("ManageAdmins"), true, true, "Takes a player's staff flag by name (this server only)."), commandData("getstaffflags", getStaffFlagsCommand, "", getStaffFlagValue("ManageAdmins"), true, true, "Shows a list of all staff flags a player has (this server only)."), commandData("clearstaffflags", clearStaffFlagsCommand, "", getStaffFlagValue("ManageAdmins"), true, true, "Removes all staff flags for a player (this server only)."), @@ -403,7 +409,6 @@ function loadCommands() { commandData("getplrbiz", getAllBusinessesOwnedByPlayerCommand, "", getStaffFlagValue("BasicModeration"), true, true, "Shows a list of all businesses owned by the player"), commandData("getplrveh", getAllVehiclesOwnedByPlayerCommand, "", getStaffFlagValue("BasicModeration"), true, true, "Shows a list of all vehicles owned by the player"), commandData("geoip", getGeoIPInformationCommand, "", getStaffFlagValue("BasicModeration"), true, true, "Retrieves GeoIP information on a player (country & city)"), - commandData("forcepayday", forcePlayerPayDayCommand, "", getStaffFlagValue("ManageServer"), true, true, "Gives a player an instant payday."), ], radio: [ commandData("radiostation", playStreamingRadioCommand, "", getStaffFlagValue("None"), true, false, "Plays a radio station in your vehicle, house, or business (depending on which one you're in)"), From e05886ff637bb5549bb3aa144f9b3801a7f086cc Mon Sep 17 00:00:00 2001 From: Vortrex <3858226+VortrexFTW@users.noreply.github.com> Date: Tue, 4 Jan 2022 20:03:04 -0600 Subject: [PATCH 034/337] Add injected drug item type --- scripts/server/const.js | 1 + 1 file changed, 1 insertion(+) diff --git a/scripts/server/const.js b/scripts/server/const.js index 0ac7fcdf..ddd55ba2 100644 --- a/scripts/server/const.js +++ b/scripts/server/const.js @@ -221,6 +221,7 @@ const VRR_ITEM_USETYPE_SMOKEDRUG = 48; // const VRR_ITEM_USETYPE_SNORTDRUG = 49; // const VRR_ITEM_USETYPE_PLANT = 50; const VRR_ITEM_USETYPE_MEGAPHONE = 51; +const VRR_ITEM_USETYPE_INJECTDRUG = 52; // Item Drop Types const VRR_ITEM_DROPTYPE_NONE = 0; // Can't be dropped From aad5d37308004277e8d68623964b597aa811e666 Mon Sep 17 00:00:00 2001 From: Vortrex <3858226+VortrexFTW@users.noreply.github.com> Date: Tue, 4 Jan 2022 20:03:19 -0600 Subject: [PATCH 035/337] Implement self-correcting economy --- scripts/server/economy.js | 86 +++++++++++++++++++++++++++++++++------ 1 file changed, 73 insertions(+), 13 deletions(-) diff --git a/scripts/server/economy.js b/scripts/server/economy.js index 801db35d..51d36c5f 100644 --- a/scripts/server/economy.js +++ b/scripts/server/economy.js @@ -42,6 +42,30 @@ function playerPayDay(client) { messagePlayerInfo(client, `Paycheck: {ALTCOLOUR}$${grossIncome}`); messagePlayerInfo(client, `Taxes: {ALTCOLOUR}$${incomeTaxAmount}`); messagePlayerInfo(client, `You receive: {ALTCOLOUR}$${netIncome}`); + if(netIncome < incomeTaxAmount) { + let totalCash = getPlayerCash(client); + let canPayNow = totalCash+netIncome; + if(incomeTaxAmount <= canPayNow) { + takePlayerCash(client, canPayNow); + messagePlayerInfo(client, `You covered the remaining taxes with {ALTCOLOUR}$${canPayNow} {MAINCOLOUR}in cash.`); + messagePlayerAlert(client, `{orange}You lost money since your taxes are more than your paycheck!`); + messagePlayerAlert(client, `{orange}If you don't have enough cash to cover taxes on next paycheck, you will lose stuff!`); + } else { + messagePlayerInfo(client, `{orange}You don't have enough cash to pay your taxes!`); + takePlayerCash(client, canPayNow); + + let vehicleCount = getAllVehiclesOwnedByPlayer(client).length; + let houseCount = getAllHousesOwnedByPlayer(client).length; + let businessCount = getAllBusinessesOwnedByPlayer(client).length; + + attemptRepossession(client, incomeTaxAmount-canPayNow); + + let newVehicleCount = getAllVehiclesOwnedByPlayer(client).length; + let newHouseCount = getAllHousesOwnedByPlayer(client).length; + let newBusinessCount = getAllBusinessesOwnedByPlayer(client).length; + messagePlayerInfo(client, `{orange}You lost ${newVehicleCount-vehicleCount} vehicles, ${newHouseCount-houseCount} houses, and ${newBusinessCount-businessCount} businesses to cover the remaining tax.`); + } + } givePlayerCash(client, netIncome); } @@ -87,28 +111,64 @@ function forcePlayerPayDayCommand(command, params, client) { // =========================================================================== function taxInfoCommand(command, params, client) { - if(areParamsEmpty(params)) { - messagePlayerSyntax(client, getCommandSyntaxText(command)); - return false; - } - let wealth = calculateWealth(client); let tax = calculateIncomeTax(wealth); - messagePlayerInfo(client, `Your tax on payday is: $${tax}. Use {ALTCOLOUR}/help tax {MAINCOLOUR}for more information.`); } // =========================================================================== function wealthInfoCommand(command, params, client) { - if(areParamsEmpty(params)) { - messagePlayerSyntax(client, getCommandSyntaxText(command)); - return false; - } - let wealth = calculateWealth(client); - messagePlayerInfo(client, `Your wealth is: $${wealth}. Use {ALTCOLOUR}/help wealth {MAINCOLOUR}for more information.`); } -// =========================================================================== \ No newline at end of file +// =========================================================================== + +function attemptRepossession(client, totalToPay) { + let leftToPay = totalToPay; + + while(leftToPay > 0) { + let repossessionValue = repossessFirstAsset(client); + leftToPay = leftToPay - repossessionValue; + } + return true; +} + +function repossessFirstAsset(client) { + let vehicles = getAllVehiclesOwnedByPlayer(client); + if(vehicles.length > 0) { + deleteVehicle(vehicles[0]) + return getGlobalConfig().economy.upKeepCosts.upKeepPerVehicle; + } + + let houses = getAllHousesOwnedByPlayer(client); + if(houses.length > 0) { + deleteHouse(houses[0].index); + return getGlobalConfig().economy.upKeepCosts.upKeepPerHouse; + } + + let businesses = getAllBusinessesOwnedByPlayer(client); + if(businesses.length > 0) { + deleteBusiness(businesses[0].index); + return getGlobalConfig().economy.upKeepCosts.upKeepPerBusiness; + } +} + +// =========================================================================== + +function getAllVehiclesOwnedByPlayer(client) { + return getServerData().vehicles.filter((v) => v.ownerType == VRR_VEHOWNER_PLAYER && v.ownerId == getPlayerCurrentSubAccount(client).databaseId); +} + +// =========================================================================== + +function getAllBusinessesOwnedByPlayer(client) { + return getServerData().businesses.filter((b) => b.ownerType == VRR_BIZOWNER_PLAYER && b.ownerId == getPlayerCurrentSubAccount(client).databaseId); +} + +// =========================================================================== + +function getAllHousesOwnedByPlayer(client) { + return getServerData().houses.filter((h) => h.ownerType == VRR_HOUSEOWNER_PLAYER && h.ownerId == getPlayerCurrentSubAccount(client).databaseId); +} \ No newline at end of file From 9be3f2e993ba4f286fce192ea98470e7932b48b0 Mon Sep 17 00:00:00 2001 From: Vortrex <3858226+VortrexFTW@users.noreply.github.com> Date: Tue, 4 Jan 2022 20:03:29 -0600 Subject: [PATCH 036/337] Formatting --- scripts/server/event.js | 1 + 1 file changed, 1 insertion(+) diff --git a/scripts/server/event.js b/scripts/server/event.js index d62408a3..611293ea 100644 --- a/scripts/server/event.js +++ b/scripts/server/event.js @@ -87,6 +87,7 @@ function onElementStreamOut(event, element, client) { function onPlayerQuit(event, client, quitReasonId) { logToConsole(LOG_INFO, `👋 Client ${getPlayerDisplayForConsole(client)} disconnected (${disconnectReasons[quitReasonId]}[${quitReasonId}])`); updateConnectionLogOnQuit(client, quitReasonId); + if(isPlayerLoggedIn(client)) { messagePlayerNormal(null, `👋 ${getPlayerName(client)} has left the server (${disconnectReasons[quitReasonId]})`, getColourByName("softYellow")); savePlayerToDatabase(client); From e472914ef980c4686e0921fcf5961eab0f9a0f31 Mon Sep 17 00:00:00 2001 From: Vortrex <3858226+VortrexFTW@users.noreply.github.com> Date: Tue, 4 Jan 2022 20:03:42 -0600 Subject: [PATCH 037/337] Tax/wealth help info --- scripts/server/help.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/scripts/server/help.js b/scripts/server/help.js index 999d3ba3..56a19887 100644 --- a/scripts/server/help.js +++ b/scripts/server/help.js @@ -347,10 +347,10 @@ function showRadioHelpMessage(client) { function showWealthAndTaxHelpMessage(client) { messagePlayerInfo(client, `{clanOrange}== {jobYellow}Wealth and Tax {clanOrange}===========================`); - messagePlayerNormal(client, `{clanOrange}• {MAINCOLOUR}Your taxes on payday are calculated by your wealth.`); - messagePlayerNormal(client, `{clanOrange}• {MAINCOLOUR}Your wealth is a total sum based on how many vehicles, houses, and businesses you have.`); + messagePlayerNormal(client, `{clanOrange}• {MAINCOLOUR}Your taxes on payday are ${100*getGlobalConfig().economy.incomeTaxRate}% of your calculated wealth.`); + messagePlayerNormal(client, `{clanOrange}• {MAINCOLOUR}Your calculated wealth is a total sum based on how many vehicles, houses, and businesses you have.`); messagePlayerNormal(client, `{clanOrange}• {MAINCOLOUR}Each vehicle is {ALTCOLOUR}${getGlobalConfig().economy.upKeepCosts.upKeepPerVehicle}, {MAINCOLOUR}each house is {ALTCOLOUR}${getGlobalConfig().economy.upKeepCosts.upKeepPerHouse}, {MAINCOLOUR}and each business is {ALTCOLOUR}${getGlobalConfig().economy.upKeepCosts.upKeepPerBusiness}`); - messagePlayerNormal(client, `{clanOrange}• {MAINCOLOUR}Your current wealth is $${wealth} ({ALTCOLOUR}$${getGlobalConfig().economy.upKeepCosts.upKeepPerVehicle*vehicles.length} {MAINCOLOUR}from ${vehicles.length} vehicles, {ALTCOLOUR}$${getGlobalConfig().economy.upKeepCosts.upKeepPerBusiness*businesses.length} {MAINCOLOUR}from ${businesses.length} businesses, and {ALTCOLOUR}$${getGlobalConfig().economy.upKeepCosts.upKeepPerHouse*houses.length} {MAINCOLOUR}from ${houses.length} houses)`) + messagePlayerNormal(client, `{clanOrange}• {MAINCOLOUR}Use {ALTCOLOUR}/wealth {MAINCOLOUR}to see your current wealth, and {ALTCOLOUR}/tax {MAINCOLOUR}to see how much you'll pay in tax each payday`); } // =========================================================================== From d67c8a0099da82ebd41cc9fa5d33b43f8bb115f9 Mon Sep 17 00:00:00 2001 From: Vortrex <3858226+VortrexFTW@users.noreply.github.com> Date: Tue, 4 Jan 2022 20:03:58 -0600 Subject: [PATCH 038/337] Implement ammo items --- scripts/server/item.js | 56 +++++++++++++++++++++++++++++++++--------- 1 file changed, 44 insertions(+), 12 deletions(-) diff --git a/scripts/server/item.js b/scripts/server/item.js index 438601d1..0e0092d3 100644 --- a/scripts/server/item.js +++ b/scripts/server/item.js @@ -109,7 +109,7 @@ function createGroundItemObject(itemId) { setElementRotation(getItemData(itemId).object, getItemTypeData(getItemData(itemId).itemTypeIndex).dropRotation); setElementOnAllDimensions(getItemData(itemId).object, false); setElementDimension(getItemData(itemId).object, getItemData(itemId).dimension); - setEntityData(getItemData(itemId).object, "vrr.scale", getItemTypeData(getItemData(itemId).itemTypeIndex).dropScale, true); + //setEntityData(getItemData(itemId).object, "vrr.scale", getItemTypeData(getItemData(itemId).itemTypeIndex).dropScale, true); addToWorld(getItemData(itemId).object); } @@ -593,7 +593,26 @@ function playerUseItem(client, hotBarSlot) { break; case VRR_ITEM_USETYPE_WEAPON: - messagePlayerError(client, `The ${getItemName(itemIndex)} is a weapon. To use it, switch to it from your items. The use key has no effect.`); + for(let i in getPlayerData(client).hotBarItems) { + if(getPlayerData(client).hotBarItems[i] != -1) { + if(getItemData(getPlayerData(client).hotBarItems[i]) != false) { + if(getItemTypeData(getItemData(getPlayerData(client).hotBarItems[i]).itemTypeIndex).useType == VRR_ITEM_USETYPE_AMMO_CLIP) { + if(getItemTypeData(getItemData(getPlayerData(client).hotBarItems[i]).itemTypeIndex).useId == getItemTypeData(getItemData(itemIndex).itemTypeIndex).databaseId) { + givePlayerWeaponAmmo(client, getItemData(getPlayerData(client).hotBarItems[i]).value); + getItemData(getPlayerData(client).hotBarItems[hotBarSlot]).value = getItemData(getPlayerData(client).hotBarItems[hotBarSlot]).value + getItemData(getPlayerData(client).hotBarItems[i]).value; + deleteItem(getPlayerData(client).hotBarItems[i]); + meActionToNearbyPlayers(client, `loads some ammo into their ${getItemTypeData(getItemData(itemIndex).itemTypeIndex).name}`); + return true; + } + } + } + } + } + messagePlayerError(client, `You don't have any ammo to load into your ${getItemTypeData(getItemData(itemIndex).itemTypeIndex).name}!`); + break; + + case VRR_ITEM_USETYPE_AMMO_CLIP: + messagePlayerError(client, `To load this ammo into a weapon, equip the weapon and ${(doesPlayerHaveKeyBindForCommand(client, "use")) ? `press {ALTCOLOUR}${toUpperCase(getKeyNameFromId(getPlayerKeyBindForCommand(client, "use").key))}` : `{ALTCOLOUR}/use`}`); break; case VRR_ITEM_USETYPE_STORAGE: @@ -603,6 +622,7 @@ function playerUseItem(client, hotBarSlot) { case VRR_ITEM_USETYPE_FOOD: meActionToNearbyPlayers(client, `eats some of their ${getItemName(itemIndex)}`); givePlayerHealth(client, getItemTypeData(getItemData(itemIndex).itemTypeIndex).useValue); + getItemData(itemIndex).value = getItemData(itemIndex).value - getItemTypeData(getItemData(itemIndex).itemTypeIndex).useValue; if(getItemData(itemIndex).value <= 0) { deleteItem(itemIndex); switchPlayerActiveHotBarSlot(client, -1); @@ -714,7 +734,7 @@ function playerUseItem(client, hotBarSlot) { vehicle = getClosestVehicle(getPlayerPosition(client)); if(getDistance(getPlayerPosition(client), getVehiclePosition(vehicle)) <= getGlobalConfig().vehicleRepairDistance) { meActionToNearbyPlayers(client, `takes their decal kit and adds some decals to the vehicle.`); - setVehicleLivery(vehicle, getItemData(itemIndex).useValue); + setVehicleLivery(vehicle, getItemData(itemIndex).value); } break; @@ -723,11 +743,11 @@ function playerUseItem(client, hotBarSlot) { if(getDistance(getPlayerPosition(client), getVehiclePosition(vehicle)) <= getGlobalConfig().vehicleRepairDistance) { if(getItemData(itemIndex).useId == 1) { meActionToNearbyPlayers(client, `takes their vehicle colour kit and changes the primary colour of the vehicle.`); - vehicle.colour1 = getItemData(itemIndex).useValue; + vehicle.colour1 = getItemData(itemIndex).value; } else { if(getItemData(itemIndex).useId == 1) { meActionToNearbyPlayers(client, `takes their vehicle colour kit and changes the secondary colour of the vehicle.`); - vehicle.colour2 = getItemData(itemIndex).useValue; + vehicle.colour2 = getItemData(itemIndex).value; } } } @@ -754,11 +774,11 @@ function playerUseItem(client, hotBarSlot) { if(getDistance(getPlayerPosition(client), getFuelPumpData(fuelPump).position) <= getGlobalConfig().vehicleRepairDistance) { if(getItemData(itemIndex).useId == 1) { meActionToNearbyPlayers(client, `takes their vehicle colour kit and changes the primary colour of the vehicle.`); - vehicle.colour1 = getItemData(itemIndex).useValue; + vehicle.colour1 = getItemTypeData(itemIndex).value; } else { if(getItemData(itemIndex).useId == 1) { meActionToNearbyPlayers(client, `takes their vehicle colour kit and changes the secondary colour of the vehicle.`); - vehicle.colour2 = getItemData(itemIndex).useValue; + vehicle.colour2 = getItemData(itemIndex).value; } } } @@ -790,14 +810,24 @@ function playerUseItem(client, hotBarSlot) { case VRR_ITEM_USETYPE_SMOKEDRUG: meActionToNearbyPlayers(client, `smokes some ${getItemName(itemIndex)}`); - givePlayerHealth(client, 25); + getPlayerData(client).incomingDamageMultiplier = getItemTypeData(getItemData(itemIndex).itemTypeIndex).useValue; + givePlayerHealth(client, 100); deleteItem(itemIndex); switchPlayerActiveHotBarSlot(client, -1); break; case VRR_ITEM_USETYPE_SNORTDRUG: meActionToNearbyPlayers(client, `snorts some ${getItemName(itemIndex)}`); - givePlayerHealth(client, 50); + getPlayerData(client).incomingDamageMultiplier = getItemTypeData(getItemData(itemIndex).itemTypeIndex).useValue; + givePlayerHealth(client, 100); + deleteItem(itemIndex); + switchPlayerActiveHotBarSlot(client, -1); + break; + + case VRR_ITEM_USETYPE_INJECTDRUG: + meActionToNearbyPlayers(client, `shoots up some ${getItemName(itemIndex)}`); + getPlayerData(client).incomingDamageMultiplier = getItemTypeData(getItemData(itemIndex).itemTypeIndex).useValue; + givePlayerHealth(client, 100); deleteItem(itemIndex); switchPlayerActiveHotBarSlot(client, -1); break; @@ -824,6 +854,10 @@ function playerUseItem(client, hotBarSlot) { } break; + case VRR_ITEM_USETYPE_AMMOCLIP: + messagePlayerError(client, `Equip a compatible weapon and press R to use an ammo clip/magazine`); + break; + default: messagePlayerError(client, `The ${getItemName(itemIndex)} doesn't do anything when you try to use it.`); break; @@ -1944,6 +1978,4 @@ function createGroundPlant(itemId) { groundPlantCache.push(itemId); groundItemCache.push(itemId); -} - -// =========================================================================== \ No newline at end of file +} \ No newline at end of file From 90ab2f4819a9670d464646ef648b15cbe6587176 Mon Sep 17 00:00:00 2001 From: Vortrex <3858226+VortrexFTW@users.noreply.github.com> Date: Tue, 4 Jan 2022 20:04:10 -0600 Subject: [PATCH 039/337] Fix staff flag cmds --- scripts/server/moderation.js | 28 +++++++++++----------------- 1 file changed, 11 insertions(+), 17 deletions(-) diff --git a/scripts/server/moderation.js b/scripts/server/moderation.js index e6599692..0bb603ac 100644 --- a/scripts/server/moderation.js +++ b/scripts/server/moderation.js @@ -678,6 +678,11 @@ function addStaffFlagCommand(command, params, client) { return false; } + if(getStaffFlagValue(flagName) == false) { + messagePlayerError(client, "That staff flag doesn't exist!"); + return false; + } + // Prevent setting flags on admins with really high permissions if(doesPlayerHaveStaffPermission(targetClient, getStaffFlagValue("ManageServer")) || doesPlayerHaveStaffPermission(targetClient, getStaffFlagValue("Developer"))) { if(!doesPlayerHaveStaffPermission(client, getStaffFlagValue("ManageServer")) && !doesPlayerHaveStaffPermission(client, getStaffFlagValue("Developer"))) { @@ -686,11 +691,6 @@ function addStaffFlagCommand(command, params, client) { } } - if(!getStaffFlagValue(flagName)) { - messagePlayerError(client, "That staff flag doesn't exist!"); - return false; - } - givePlayerStaffFlag(targetClient, flagName); messageAdmins(`${client.name} has {MAINCOLOUR}given {ALTCOLOUR}${getPlayerName(targetClient)} {MAINCOLOUR}the {ALTCOLOUR}${flagName} {MAINCOLOUR}staff flag`); } @@ -712,6 +712,11 @@ function takeStaffFlagCommand(command, params, client) { return false; } + if(getStaffFlagValue(flagName) == false) { + messagePlayerError(client, "That staff flag doesn't exist!"); + return false; + } + // Prevent setting flags on admins with really high permissions if(doesPlayerHaveStaffPermission(targetClient, getStaffFlagValue("ManageServer")) || doesPlayerHaveStaffPermission(targetClient, getStaffFlagValue("Developer"))) { if(!doesPlayerHaveStaffPermission(client, getStaffFlagValue("ManageServer")) && !doesPlayerHaveStaffPermission(client, getStaffFlagValue("Developer"))) { @@ -720,11 +725,6 @@ function takeStaffFlagCommand(command, params, client) { } } - if(!getStaffFlagValue(flagName)) { - messagePlayerError(client, "That staff flag doesn't exist!"); - return false; - } - takePlayerStaffFlag(targetClient, flagName); messageAdmins(`${client.name} {MAINCOLOUR}has taken the {ALTCOLOUR}${flagName} {MAINCOLOUR}staff flag from {ALTCOLOUR}${getPlayerName(targetClient)}`); } @@ -739,7 +739,6 @@ function clearStaffFlagsCommand(command, params, client) { let splitParams = params.split(""); let targetClient = getPlayerFromParams(splitParams[0]); - let flagName = splitParams[1] || "None"; if(!targetClient) { messagePlayerError(client, "That player is not connected!"); @@ -754,11 +753,6 @@ function clearStaffFlagsCommand(command, params, client) { } } - if(!getStaffFlagValue(flagName)) { - messagePlayerError(client, "That staff flag doesn't exist!"); - return false; - } - clearPlayerStaffFlags(targetClient); messageAdmins(`${client.name} {MAINCOLOUR}removed all staff flags from {ALTCOLOUR}${getPlayerName(targetClient)}`); } @@ -809,7 +803,7 @@ function getStaffFlagsCommand(command, params, client) { } } - let chunkedList = splitArrayIntoChunks(flagList, 6); + let chunkedList = splitArrayIntoChunks(flagList, 8); messagePlayerInfo(client, `{clanOrange}== {jobYellow}Player Staff Flags {clanOrange}=========================`); From 616eba353616d169eaf54a6cb763b5b650a0b54e Mon Sep 17 00:00:00 2001 From: Vortrex <3858226+VortrexFTW@users.noreply.github.com> Date: Tue, 4 Jan 2022 20:04:22 -0600 Subject: [PATCH 040/337] Add weapon ammo wrapped natives --- scripts/server/native/connected.js | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/scripts/server/native/connected.js b/scripts/server/native/connected.js index 7f369e5b..e88d4cd7 100644 --- a/scripts/server/native/connected.js +++ b/scripts/server/native/connected.js @@ -647,4 +647,16 @@ function getElementModel(element) { } } +// =========================================================================== + +function givePlayerWeaponAmmo(client, ammo) { + givePlayerWeapon(client, getPlayerWeapon(client), getPlayerWeaponAmmo(client) + ammo); +} + +// =========================================================================== + +function getPlayerWeapon(client) { + return client.player.weapon; +} + // =========================================================================== \ No newline at end of file From 3e7e3b5a2d2232e5b6995c1adf1dda900cf5602c Mon Sep 17 00:00:00 2001 From: Vortrex <3858226+VortrexFTW@users.noreply.github.com> Date: Tue, 4 Jan 2022 20:04:45 -0600 Subject: [PATCH 041/337] Add command from params util --- scripts/server/utilities.js | 38 +++++++++++++++++-------------------- 1 file changed, 17 insertions(+), 21 deletions(-) diff --git a/scripts/server/utilities.js b/scripts/server/utilities.js index 224399aa..55f430c7 100644 --- a/scripts/server/utilities.js +++ b/scripts/server/utilities.js @@ -688,6 +688,20 @@ function getAccentFromParams(params) { // =========================================================================== +function getCommandFromParams(params) { + for(let i in serverCommands) { + for(let j in serverCommands[i]) { + if(toLowerCase(serverCommands[i][j].command).indexOf(toLowerCase(params)) != -1) { + return serverCommands[i][j]; + } + } + } + + return false; +} + +// =========================================================================== + function getLocaleNameFromParams(params) { let locales = getLocales(); if(isNaN(params)) { @@ -1381,13 +1395,13 @@ function isConsole(client) { // =========================================================================== function updateConnectionLogOnQuit(client, quitReasonId) { - quickDatabaseQuery(`UPDATE conn_main SET conn_when_disconnect=NOW(), conn_how_disconnect=${quitReasonId} WHERE conn_id = ${toInteger(getEntityData(client, "vrr.connection"))}`); + quickDatabaseQuery(`UPDATE conn_main SET conn_when_disconnect=NOW(), conn_how_disconnect=${quitReasonId} WHERE conn_id = ${getPlayerData(client).connectionId}`); } // =========================================================================== function updateConnectionLogOnAuth(client, authId) { - quickDatabaseQuery(`UPDATE conn_main SET conn_auth=${authId} WHERE conn_id = ${toInteger(getEntityData(client, "vrr.connection"))}`); + quickDatabaseQuery(`UPDATE conn_main SET conn_auth=${authId} WHERE conn_id = ${getPlayerData(client).connectionId}`); } // =========================================================================== @@ -1398,7 +1412,7 @@ function updateConnectionLogOnClientInfoReceive(client, clientVersion, screenWid let safeClientVersion = escapeDatabaseString(dbConnection, clientVersion); let safeScreenWidth = escapeDatabaseString(dbConnection, toString(screenWidth)); let safeScreenHeight = escapeDatabaseString(dbConnection, toString(screenHeight)); - quickDatabaseQuery(`UPDATE conn_main SET conn_client_version='${safeClientVersion}', conn_screen_width='${safeScreenWidth}', conn_screen_height='${safeScreenHeight}' WHERE conn_id = ${toInteger(getEntityData(client, "vrr.connection"))}`); + quickDatabaseQuery(`UPDATE conn_main SET conn_client_version='${safeClientVersion}', conn_screen_width='${safeScreenWidth}', conn_screen_height='${safeScreenHeight}' WHERE conn_id = ${getPlayerData(client).connectionId}`); } } @@ -1430,24 +1444,6 @@ function fixCharacterName(name) { // =========================================================================== -function getAllVehiclesOwnedByPlayer(client) { - return getServerData().vehicles.filter((v) => v.ownerType == VRR_VEHOWNER_PLAYER && v.ownerId == getPlayerCurrentSubAccount(client).databaseId); -} - -// =========================================================================== - -function getAllBusinessesOwnedByPlayer(client) { - return getServerData().businesses.filter((b) => b.ownerType == VRR_BIZOWNER_PLAYER && b.ownerId == getPlayerCurrentSubAccount(client).databaseId); -} - -// =========================================================================== - -function getAllHousesOwnedByPlayer(client) { - return getServerData().houses.filter((h) => h.ownerType == VRR_HOUSEOWNER_PLAYER && h.ownerId == getPlayerCurrentSubAccount(client).databaseId); -} - -// =========================================================================== - function addPositiveNegativeSymbol(value) { return (value >= 0) ? `+${value}` : `${value}`; } From 9148b05dd2b73c40b1e76f8a66599eb3a13c4f1b Mon Sep 17 00:00:00 2001 From: Vortrex <3858226+VortrexFTW@users.noreply.github.com> Date: Tue, 4 Jan 2022 20:05:03 -0600 Subject: [PATCH 042/337] Add ammo to gun store default items --- scripts/shared/gamedata.js | 50 ++++++++++++++++++++++++++++++++------ 1 file changed, 42 insertions(+), 8 deletions(-) diff --git a/scripts/shared/gamedata.js b/scripts/shared/gamedata.js index a559e797..6a88ad42 100644 --- a/scripts/shared/gamedata.js +++ b/scripts/shared/gamedata.js @@ -3476,15 +3476,21 @@ let gameData = { ["Outfit", 500, 2] ], legalGunStore: [ + ["Baseball Bat", 500, 2], ["Colt 45", 500, 2], ["Shotgun", 500, 2], - ["Baseball Bat", 500, 2] + ["Colt 45 Ammo", 500, 2], + ["Shotgun Ammo", 500, 2], ], illegalGunStore: [ ["Uzi", 500, 2], ["AK-47", 500, 2], ["M16", 500, 2], - ["Sniper Rifle", 500, 2] + ["Sniper Rifle", 500, 2], + ["Uzi Ammo", 500, 2], + ["AK-47 Ammo", 500, 2], + ["M16 Ammo", 500, 2], + ["Shotgun Ammo", 500, 2], ], gasStation: [ ["Bottle of Soda", 500, 2], @@ -3492,6 +3498,7 @@ let gameData = { ["Slice of Pizza", 500, 2], ["Bottle of Water", 500, 2], ["Can of Beer", 500, 2], + ["Pack of Smokes", 500, 2], ], electronicsStore: [ ["Phone", 500, 2], @@ -3603,12 +3610,16 @@ let gameData = { ["Outfit", 500, 2] ], legalGunStore: [ + ["Baseball Bat", 500, 2], + ["Brass Knuckles", 500, 2], ["Colt .45", 500, 2], ["Python", 500, 2], ["Shotgun", 500, 2], ["Stubby Shotgun", 500, 2], - ["Baseball Bat", 500, 2], - ["Brass Knuckles", 500, 2], + ["Colt .45 Ammo", 500, 2], + ["Python Ammo", 500, 2], + ["Shotgun Ammo", 500, 2], + ["Stubby Shotgun Ammo", 500, 2], ], illegalGunStore: [ ["Uzi", 500, 2], @@ -3619,6 +3630,14 @@ let gameData = { ["M4", 500, 2], ["Sniper Rifle", 500, 2], ["Laser Sniper", 500, 2], + ["Uzi Ammo", 500, 2], + ["MP5 Ammo", 500, 2], + ["Tec-9 Ammo", 500, 2], + ["Ingram Ammo", 500, 2], + ["Ruger Ammo", 500, 2], + ["M4 Ammo", 500, 2], + ["Sniper Rifle Ammo", 500, 2], + ["Laser Sniper Ammo", 500, 2], ], gasStation: [ ["Bottle of Soda", 500, 2], @@ -3743,7 +3762,11 @@ let gameData = { ["9mm", 500, 2], ["Desert Eagle", 500, 2], ["Shotgun", 500, 2], - ["Country Rifle", 500, 2] + ["Country Rifle", 500, 2], + ["9mm Ammo", 500, 2], + ["Desert Eagle Ammo", 500, 2], + ["Shotgun Ammo", 500, 2], + ["Country Rifle Ammo", 500, 2], ], illegalGunStore: [ ["Micro SMG/Uzi", 500, 2], @@ -3752,21 +3775,32 @@ let gameData = { ["AK-47", 500, 2], ["M4", 500, 2], ["Combat Shotgun", 500, 2], - ["Sniper Rifle", 500, 2] + ["Sniper Rifle", 500, 2], + ["Micro SMG/Uzi Ammo", 500, 2], + ["MP5 Ammo", 500, 2], + ["Tec-9 Ammo", 500, 2], + ["AK-47 Ammo", 500, 2], + ["M4 Ammo", 500, 2], + ["Combat Shotgun Ammo", 500, 2], + ["Sniper Rifle Ammo", 500, 2], ], sexShop: [ ["Purple Dildo", 500, 2], ["Dildo", 500, 2], ["Vibrator", 500, 2], ["Silver Vibrator", 500, 2], - ["Flowers", 500, 2] + ["Flowers", 500, 2], + ["Cane", 500, 2], + ["Pool Cue", 500, 2], ], gasStation: [ ["Bottle of Soda", 500, 2], ["Can of Soda", 500, 2], ["Slice of Pizza", 500, 2], ["Bottle of Water", 500, 2], - ["Can of Beer", 500, 2] + ["Can of Beer", 500, 2], + ["Cane", 500, 2], + ["Pool Cue", 500, 2], ], electronicsStore: [ ["Phone", 500, 2], From 0d0ad33ebcf73130eb9a75c9c2b285855db09ea7 Mon Sep 17 00:00:00 2001 From: Vortrex <3858226+VortrexFTW@users.noreply.github.com> Date: Thu, 6 Jan 2022 13:32:47 -0600 Subject: [PATCH 043/337] Fix anims, make some anim utils --- scripts/client/animation.js | 26 +++++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/scripts/client/animation.js b/scripts/client/animation.js index 843b3f32..3838fae4 100644 --- a/scripts/client/animation.js +++ b/scripts/client/animation.js @@ -8,8 +8,9 @@ // =========================================================================== function makePedPlayAnimation(pedId, animGroup, animId, animType, animSpeed, loop, loopNoControl, freezeLastFrame, returnToOriginalPosition, freezePlayer) { + logToConsole(LOG_DEBUG, `[VRR.Animation] Playing animation ${animGroup}/${animId} for ped ${pedId}`); if(getGame() < VRR_GAME_GTA_IV) { - if(animType == VRR_ANIMTYPE_ADD) { + if(animType == VRR_ANIMTYPE_NORMAL) { if(getGame() == VRR_GAME_GTA_VC || getGame() == VRR_GAME_GTA_SA) { getElementFromId(pedId).clearAnimations(); } else { @@ -43,6 +44,29 @@ function forcePedAnimation(pedId, animGroup, animId, animType, animSpeed, loop, setLocalPlayerControlState(false, false); getElementFromId(pedId).position = getElementFromId(pedId).position; getElementFromId(pedId).addAnimation(animGroup, animId); + + inAnimation = true; + setLocalPlayerControlState(false, false); + localPlayer.collisionsEnabled = false; + } +} + +// =========================================================================== + +function makePedStopAnimation(pedId) { + if(getElementFromId(pedId) == null) { + return false; + } + + if(getGame() == VRR_GAME_GTA_VC || getGame() == VRR_GAME_GTA_SA) { + getElementFromId(pedId).clearAnimations(); + } else { + getElementFromId(pedId).clearObjective(); + } + + if(getElementFromId(pedId) == localPlayer) { + localPlayer.collisionsEnabled = true; + setLocalPlayerControlState(true, false); } } From 89c139288cd7420c6206c986640fa2ef4e3a43c0 Mon Sep 17 00:00:00 2001 From: Vortrex <3858226+VortrexFTW@users.noreply.github.com> Date: Thu, 6 Jan 2022 13:33:11 -0600 Subject: [PATCH 044/337] Add tazed anim + use new anim consts --- scripts/server/item/tazer.js | 15 ++ scripts/shared/gamedata.js | 305 +++++++++++++++++++---------------- 2 files changed, 184 insertions(+), 136 deletions(-) diff --git a/scripts/server/item/tazer.js b/scripts/server/item/tazer.js index 71cd0aa4..ee43a326 100644 --- a/scripts/server/item/tazer.js +++ b/scripts/server/item/tazer.js @@ -19,9 +19,19 @@ function tazePlayer(client) { getPlayerData(client).pedState = VRR_PEDSTATE_TAZED; setPlayerControlState(client, false); + let animationId = getAnimationFromParams("tazed"); + forcePedAnimation(client.player, animationId); + + getPlayerData(client).currentAnimation = animationId; + getPlayerData(client).currentAnimationPositionOffset = toVector3(0.0, 0.0, 0.0); + getPlayerData(client).currentAnimationPositionReturnTo = getPlayerPosition(client); + getPlayerData(client).animationStart = getCurrentUnixTimestamp(); + getPlayerData(client).animationForced = true; + setTimeout(function() { unTazePlayer(client); doActionToNearbyPlayers(client, `The tazer effect wears off`); + }, getGlobalConfig().tazerEffectDuration); } @@ -29,7 +39,12 @@ function tazePlayer(client) { function unTazePlayer(client) { getPlayerData(client).pedState = VRR_PEDSTATE_READY; + setPlayerControlState(client, true); + setPlayerPosition(client, getPlayerData(client).currentAnimationPositionReturnTo); + makePedStopAnimation(getPlayerData(client).ped); + setPlayerMouseCameraState(client, false); + getPlayerData(client).forcedPedAnimation = -1; } // =========================================================================== \ No newline at end of file diff --git a/scripts/shared/gamedata.js b/scripts/shared/gamedata.js index 6a88ad42..b48bd13f 100644 --- a/scripts/shared/gamedata.js +++ b/scripts/shared/gamedata.js @@ -3141,144 +3141,151 @@ let gameData = { // [name, groupId, animId, animType, deltaTime, null, null, null, null, moveType], [ // GTA III - ["walk", 0, 0, VRR_ANIMTYPE_ADD, 0.0, null, null, null, null, VRR_ANIMMOVE_NONE], - ["jog", 0, 1, VRR_ANIMTYPE_ADD, 0.0, null, null, null, null, VRR_ANIMMOVE_NONE], - ["look1", 0, 7, VRR_ANIMTYPE_ADD, 0.0, null, null, null, null, VRR_ANIMMOVE_NONE], - ["tired", 0, 9, VRR_ANIMTYPE_ADD, 0.0, null, null, null, null, VRR_ANIMMOVE_NONE], - ["raisegun", 0, 10, VRR_ANIMTYPE_ADD, 0.0, null, null, null, null, VRR_ANIMMOVE_NONE], - ["wave", 0, 12, VRR_ANIMTYPE_ADD, 0.0, null, null, null, null, VRR_ANIMMOVE_NONE], - ["talk", 0, 11, VRR_ANIMTYPE_ADD, 0.0, null, null, null, null, VRR_ANIMMOVE_NONE], - ["stomachhit", 0, 18, VRR_ANIMTYPE_ADD, 0.0, null, null, null, null, VRR_ANIMMOVE_NONE], - ["headhit", 0, 18, VRR_ANIMTYPE_ADD, 0.0, null, null, null, null, VRR_ANIMMOVE_NONE], - ["throw1", 0, 53, VRR_ANIMTYPE_ADD, 0.0, null, null, null, null, VRR_ANIMMOVE_NONE], - ["throw2", 0, 54, VRR_ANIMTYPE_ADD, 0.0, null, null, null, null, VRR_ANIMMOVE_NONE], - ["punch1", 0, 54, VRR_ANIMTYPE_ADD, 0.0, null, null, null, null, VRR_ANIMMOVE_NONE], - ["headbutt", 0, 70, VRR_ANIMTYPE_ADD, 0.0, null, null, null, null, VRR_ANIMMOVE_NONE], - ["kick", 0, 71, VRR_ANIMTYPE_ADD, 0.0, null, null, null, null, VRR_ANIMMOVE_NONE], - ["kneekick", 0, 72, VRR_ANIMTYPE_ADD, 0.0, null, null, null, null, VRR_ANIMMOVE_NONE], - ["punch2", 0, 73, VRR_ANIMTYPE_ADD, 0.0, null, null, null, null, VRR_ANIMMOVE_NONE], - ["flipkick", 0, 74, VRR_ANIMTYPE_ADD, 0.0, null, null, null, null, VRR_ANIMMOVE_NONE], - ["bow", 0, 126, VRR_ANIMTYPE_ADD, 0.0, null, null, null, null, VRR_ANIMMOVE_NONE], - ["opendoor1", 0, 127, VRR_ANIMTYPE_ADD, 0.0, null, null, null, null, VRR_ANIMMOVE_NONE], - ["opendoor2", 0, 128, VRR_ANIMTYPE_ADD, 0.0, null, null, null, null, VRR_ANIMMOVE_NONE], - ["falling", 0, 151, VRR_ANIMTYPE_ADD, 0.0, null, null, null, null, VRR_ANIMMOVE_NONE], - ["dive", 0, 156, VRR_ANIMTYPE_ADD, 0.0, null, null, null, null, VRR_ANIMMOVE_NONE], - ["headscratch", 0, 157, VRR_ANIMTYPE_ADD, 0.0, null, null, null, null, VRR_ANIMMOVE_NONE], - ["look2", 0, 158, VRR_ANIMTYPE_ADD, 0.0, null, null, null, null, VRR_ANIMMOVE_NONE], - ["plant", 0, 162, VRR_ANIMTYPE_ADD, 0.0, null, null, null, null, VRR_ANIMMOVE_NONE], - ["cower", 0, 163, VRR_ANIMTYPE_ADD, 0.0, null, null, null, null, VRR_ANIMMOVE_NONE], - ["aimdown", 0, 160, VRR_ANIMTYPE_ADD, 0.0, null, null, null, null, VRR_ANIMMOVE_NONE], - ["aimcrouch", 0, 165, VRR_ANIMTYPE_ADD, 0.0, null, null, null, null, VRR_ANIMMOVE_NONE], - ["throw3", 0, 166, VRR_ANIMTYPE_ADD, 0.0, null, null, null, null, VRR_ANIMMOVE_NONE], - ["handsup", 0, 167, VRR_ANIMTYPE_ADD, 0.0, null, null, null, null, VRR_ANIMMOVE_NONE], + ["walk", 0, 0, VRR_ANIMTYPE_NORMAL, 0.0, null, null, null, null, VRR_ANIMMOVE_NONE], + ["jog", 0, 1, VRR_ANIMTYPE_NORMAL, 0.0, null, null, null, null, VRR_ANIMMOVE_NONE], + ["look1", 0, 7, VRR_ANIMTYPE_NORMAL, 0.0, null, null, null, null, VRR_ANIMMOVE_NONE], + ["tired", 0, 9, VRR_ANIMTYPE_NORMAL, 0.0, null, null, null, null, VRR_ANIMMOVE_NONE], + ["raisegun", 0, 10, VRR_ANIMTYPE_NORMAL, 0.0, null, null, null, null, VRR_ANIMMOVE_NONE], + ["wave", 0, 12, VRR_ANIMTYPE_NORMAL, 0.0, null, null, null, null, VRR_ANIMMOVE_NONE], + ["talk", 0, 11, VRR_ANIMTYPE_NORMAL, 0.0, null, null, null, null, VRR_ANIMMOVE_NONE], + ["stomachhit", 0, 18, VRR_ANIMTYPE_NORMAL, 0.0, null, null, null, null, VRR_ANIMMOVE_NONE], + ["headhit", 0, 18, VRR_ANIMTYPE_NORMAL, 0.0, null, null, null, null, VRR_ANIMMOVE_NONE], + ["throw1", 0, 53, VRR_ANIMTYPE_NORMAL, 0.0, null, null, null, null, VRR_ANIMMOVE_NONE], + ["throw2", 0, 54, VRR_ANIMTYPE_NORMAL, 0.0, null, null, null, null, VRR_ANIMMOVE_NONE], + ["punch1", 0, 54, VRR_ANIMTYPE_NORMAL, 0.0, null, null, null, null, VRR_ANIMMOVE_NONE], + ["headbutt", 0, 70, VRR_ANIMTYPE_NORMAL, 0.0, null, null, null, null, VRR_ANIMMOVE_NONE], + ["kick", 0, 71, VRR_ANIMTYPE_NORMAL, 0.0, null, null, null, null, VRR_ANIMMOVE_NONE], + ["kneekick", 0, 72, VRR_ANIMTYPE_NORMAL, 0.0, null, null, null, null, VRR_ANIMMOVE_NONE], + ["punch2", 0, 73, VRR_ANIMTYPE_NORMAL, 0.0, null, null, null, null, VRR_ANIMMOVE_NONE], + ["flipkick", 0, 74, VRR_ANIMTYPE_NORMAL, 0.0, null, null, null, null, VRR_ANIMMOVE_NONE], + ["bow", 0, 126, VRR_ANIMTYPE_NORMAL, 0.0, null, null, null, null, VRR_ANIMMOVE_NONE], + ["opendoor1", 0, 127, VRR_ANIMTYPE_NORMAL, 0.0, null, null, null, null, VRR_ANIMMOVE_NONE], + ["opendoor2", 0, 128, VRR_ANIMTYPE_NORMAL, 0.0, null, null, null, null, VRR_ANIMMOVE_NONE], + ["falling", 0, 151, VRR_ANIMTYPE_NORMAL, 0.0, null, null, null, null, VRR_ANIMMOVE_NONE], + ["dive", 0, 156, VRR_ANIMTYPE_NORMAL, 0.0, null, null, null, null, VRR_ANIMMOVE_NONE], + ["headscratch", 0, 157, VRR_ANIMTYPE_NORMAL, 0.0, null, null, null, null, VRR_ANIMMOVE_NONE], + ["look2", 0, 158, VRR_ANIMTYPE_NORMAL, 0.0, null, null, null, null, VRR_ANIMMOVE_NONE], + ["plant", 0, 162, VRR_ANIMTYPE_NORMAL, 0.0, null, null, null, null, VRR_ANIMMOVE_NONE], + ["cower", 0, 163, VRR_ANIMTYPE_NORMAL, 0.0, null, null, null, null, VRR_ANIMMOVE_NONE], + ["aimdown", 0, 160, VRR_ANIMTYPE_NORMAL, 0.0, null, null, null, null, VRR_ANIMMOVE_NONE], + ["aimcrouch", 0, 165, VRR_ANIMTYPE_NORMAL, 0.0, null, null, null, null, VRR_ANIMMOVE_NONE], + ["throw3", 0, 166, VRR_ANIMTYPE_NORMAL, 0.0, null, null, null, null, VRR_ANIMMOVE_NONE], + ["handsup", 0, 167, VRR_ANIMTYPE_SURRENDER, 0.0, null, null, null, null, VRR_ANIMMOVE_NONE], + ["sit", 0, 111, VRR_ANIMTYPE_NORMAL, 0.0, null, null, null, null, VRR_ANIMMOVE_NONE], + ["sitleft", 0, 111, VRR_ANIMTYPE_NORMAL, 0.0, null, null, null, null, VRR_ANIMMOVE_LEFT], + ["sitback", 0, 111, VRR_ANIMTYPE_NORMAL, 0.0, null, null, null, null, VRR_ANIMMOVE_BACK], + ["sitright", 0, 111, VRR_ANIMTYPE_NORMAL, 0.0, null, null, null, null, VRR_ANIMMOVE_RIGHT], + ["sitforward", 0, 111, VRR_ANIMTYPE_NORMAL, 0.0, null, null, null, null, VRR_ANIMMOVE_FORWARD], + ["sitarmright", 0, 120, VRR_ANIMTYPE_NORMAL, 0.0, null, null, null, null, VRR_ANIMMOVE_BACK], + ["tazed", 0, 13, VRR_ANIMTYPE_FREEZE, 0.0, null, null, null, null, VRR_ANIMMOVE_NONE], ], [ // GTA VC - ["walk", 0, 0, VRR_ANIMTYPE_ADD, 0.0, null, null, null, null, VRR_ANIMMOVE_NONE], - ["jog", 0, 1, VRR_ANIMTYPE_ADD, 0.0, null, null, null, null, VRR_ANIMMOVE_NONE], - ["handcuffs", 0, 7, VRR_ANIMTYPE_ADD, 0.0, null, null, null, null, VRR_ANIMMOVE_NONE], - ["tired", 0, 9, VRR_ANIMTYPE_ADD, 0.0, null, null, null, null, VRR_ANIMMOVE_NONE], - ["raisegun", 0, 10, VRR_ANIMTYPE_ADD, 0.0, null, null, null, null, VRR_ANIMMOVE_NONE], - ["wave", 0, 12, VRR_ANIMTYPE_ADD, 0.0, null, null, null, null, VRR_ANIMMOVE_NONE], - ["talk", 0, 11, VRR_ANIMTYPE_ADD, 0.0, null, null, null, null, VRR_ANIMMOVE_NONE], - ["stomachhit", 0, 18, VRR_ANIMTYPE_ADD, 0.0, null, null, null, null, VRR_ANIMMOVE_NONE], - ["headhit", 0, 18, VRR_ANIMTYPE_ADD, 0.0, null, null, null, null, VRR_ANIMMOVE_NONE], - ["headbutt", 0, 49, VRR_ANIMTYPE_ADD, 0.0, null, null, null, null, VRR_ANIMMOVE_NONE], - ["kick", 0, 50, VRR_ANIMTYPE_ADD, 0.0, null, null, null, null, VRR_ANIMMOVE_NONE], - ["kneekick", 0, 51, VRR_ANIMTYPE_ADD, 0.0, null, null, null, null, VRR_ANIMMOVE_NONE], - ["throw2", 0, 54, VRR_ANIMTYPE_ADD, 0.0, null, null, null, null, VRR_ANIMMOVE_NONE], - ["punch1", 0, 52, VRR_ANIMTYPE_ADD, 0.0, null, null, null, null, VRR_ANIMMOVE_NONE], - ["punch2", 0, 53, VRR_ANIMTYPE_ADD, 0.0, null, null, null, null, VRR_ANIMMOVE_NONE], - ["flipkick", 0, 54, VRR_ANIMTYPE_ADD, 0.0, null, null, null, null, VRR_ANIMMOVE_NONE], - ["headscratch", 0, 152, VRR_ANIMTYPE_ADD, 0.0, null, null, null, null, VRR_ANIMMOVE_NONE], - ["aimdown", 0, 155, VRR_ANIMTYPE_ADD, 0.0, null, null, null, null, VRR_ANIMMOVE_NONE], - ["look2", 0, 153, VRR_ANIMTYPE_ADD, 0.0, null, null, null, null, VRR_ANIMMOVE_NONE], - ["handsup", 0, 161, VRR_ANIMTYPE_ADD, 0.0, null, null, null, null, VRR_ANIMMOVE_NONE], - ["cower", 0, 162, VRR_ANIMTYPE_ADD, 0.0, null, null, null, null, VRR_ANIMMOVE_NONE], - ["fucku", 0, 163, VRR_ANIMTYPE_ADD, 0.0, null, null, null, null, VRR_ANIMMOVE_NONE], - ["phone", 0, 166, VRR_ANIMTYPE_ADD, 0.0, null, null, null, null, VRR_ANIMMOVE_NONE], - ["sit", 0, 169, VRR_ANIMTYPE_ADD, 1.0, null, null, null, null, VRR_ANIMMOVE_NONE], - ["atm", 0, 171, VRR_ANIMTYPE_ADD, 0.0, null, null, null, null, VRR_ANIMMOVE_NONE], - ["cpr", 24, 214, VRR_ANIMTYPE_ADD, 0.0, null, null, null, null, VRR_ANIMMOVE_NONE], - ["idle1", 26, 215, VRR_ANIMTYPE_ADD, 0.0, null, null, null, null, VRR_ANIMMOVE_NONE], - ["idle2", 26, 216, VRR_ANIMTYPE_ADD, 0.0, null, null, null, null, VRR_ANIMMOVE_NONE], - ["idle3", 26, 217, VRR_ANIMTYPE_ADD, 0.0, null, null, null, null, VRR_ANIMMOVE_NONE], - ["idle4", 26, 218, VRR_ANIMTYPE_ADD, 0.0, null, null, null, null, VRR_ANIMMOVE_NONE], - ["dance1", 28, 226, VRR_ANIMTYPE_ADD, 0.0, null, null, null, null, VRR_ANIMMOVE_NONE], - ["dance2", 28, 227, VRR_ANIMTYPE_ADD, 0.0, null, null, null, null, VRR_ANIMMOVE_NONE], - ["dance3", 28, 228, VRR_ANIMTYPE_ADD, 0.0, null, null, null, null, VRR_ANIMMOVE_NONE], - ["dance4", 28, 229, VRR_ANIMTYPE_ADD, 0.0, null, null, null, null, VRR_ANIMMOVE_NONE], - ["dance5", 28, 230, VRR_ANIMTYPE_ADD, 0.0, null, null, null, null, VRR_ANIMMOVE_NONE], - ["dance6", 28, 231, VRR_ANIMTYPE_ADD, 0.0, null, null, null, null, VRR_ANIMMOVE_NONE], - ["dance7", 28, 232, VRR_ANIMTYPE_ADD, 0.0, null, null, null, null, VRR_ANIMMOVE_NONE], - ["sitright", 0, 169, VRR_ANIMTYPE_ADD, 0.0, null, null, null, null, VRR_ANIMMOVE_RIGHT], - ["sitleft", 0, 169, VRR_ANIMTYPE_ADD, 0.0, null, null, null, null, VRR_ANIMMOVE_LEFT], - ["sitforward", 0, 169, VRR_ANIMTYPE_ADD, 0.0, null, null, null, null, VRR_ANIMMOVE_FORWARD], - ["sitback", 0, 169, VRR_ANIMTYPE_ADD, 0.0, null, null, null, null, VRR_ANIMMOVE_BACK], + ["walk", 0, 0, VRR_ANIMTYPE_NORMAL, 0.0, null, null, null, null, VRR_ANIMMOVE_NONE], + ["jog", 0, 1, VRR_ANIMTYPE_NORMAL, 0.0, null, null, null, null, VRR_ANIMMOVE_NONE], + ["handcuffs", 0, 7, VRR_ANIMTYPE_NORMAL, 0.0, null, null, null, null, VRR_ANIMMOVE_NONE], + ["tired", 0, 9, VRR_ANIMTYPE_NORMAL, 0.0, null, null, null, null, VRR_ANIMMOVE_NONE], + ["raisegun", 0, 10, VRR_ANIMTYPE_NORMAL, 0.0, null, null, null, null, VRR_ANIMMOVE_NONE], + ["wave", 0, 12, VRR_ANIMTYPE_NORMAL, 0.0, null, null, null, null, VRR_ANIMMOVE_NONE], + ["talk", 0, 11, VRR_ANIMTYPE_NORMAL, 0.0, null, null, null, null, VRR_ANIMMOVE_NONE], + ["stomachhit", 0, 18, VRR_ANIMTYPE_NORMAL, 0.0, null, null, null, null, VRR_ANIMMOVE_NONE], + ["headhit", 0, 18, VRR_ANIMTYPE_NORMAL, 0.0, null, null, null, null, VRR_ANIMMOVE_NONE], + ["headbutt", 0, 49, VRR_ANIMTYPE_NORMAL, 0.0, null, null, null, null, VRR_ANIMMOVE_NONE], + ["kick", 0, 50, VRR_ANIMTYPE_NORMAL, 0.0, null, null, null, null, VRR_ANIMMOVE_NONE], + ["kneekick", 0, 51, VRR_ANIMTYPE_NORMAL, 0.0, null, null, null, null, VRR_ANIMMOVE_NONE], + ["throw2", 0, 54, VRR_ANIMTYPE_NORMAL, 0.0, null, null, null, null, VRR_ANIMMOVE_NONE], + ["punch1", 0, 52, VRR_ANIMTYPE_NORMAL, 0.0, null, null, null, null, VRR_ANIMMOVE_NONE], + ["punch2", 0, 53, VRR_ANIMTYPE_NORMAL, 0.0, null, null, null, null, VRR_ANIMMOVE_NONE], + ["flipkick", 0, 54, VRR_ANIMTYPE_NORMAL, 0.0, null, null, null, null, VRR_ANIMMOVE_NONE], + ["headscratch", 0, 152, VRR_ANIMTYPE_NORMAL, 0.0, null, null, null, null, VRR_ANIMMOVE_NONE], + ["aimdown", 0, 155, VRR_ANIMTYPE_NORMAL, 0.0, null, null, null, null, VRR_ANIMMOVE_NONE], + ["look2", 0, 153, VRR_ANIMTYPE_NORMAL, 0.0, null, null, null, null, VRR_ANIMMOVE_NONE], + ["handsup", 0, 161, VRR_ANIMTYPE_SURRENDER, 0.0, null, null, null, null, VRR_ANIMMOVE_NONE], + ["cower", 0, 162, VRR_ANIMTYPE_SURRENDER, 0.0, null, null, null, null, VRR_ANIMMOVE_NONE], + ["fucku", 0, 163, VRR_ANIMTYPE_NORMAL, 0.0, null, null, null, null, VRR_ANIMMOVE_NONE], + ["phone", 0, 166, VRR_ANIMTYPE_NORMAL, 0.0, null, null, null, null, VRR_ANIMMOVE_NONE], + ["sit", 0, 169, VRR_ANIMTYPE_NORMAL, 1.0, null, null, null, null, VRR_ANIMMOVE_NONE], + ["atm", 0, 171, VRR_ANIMTYPE_NORMAL, 0.0, null, null, null, null, VRR_ANIMMOVE_NONE], + ["cpr", 24, 214, VRR_ANIMTYPE_NORMAL, 0.0, null, null, null, null, VRR_ANIMMOVE_NONE], + ["idle1", 26, 215, VRR_ANIMTYPE_NORMAL, 0.0, null, null, null, null, VRR_ANIMMOVE_NONE], + ["idle2", 26, 216, VRR_ANIMTYPE_NORMAL, 0.0, null, null, null, null, VRR_ANIMMOVE_NONE], + ["idle3", 26, 217, VRR_ANIMTYPE_NORMAL, 0.0, null, null, null, null, VRR_ANIMMOVE_NONE], + ["idle4", 26, 218, VRR_ANIMTYPE_NORMAL, 0.0, null, null, null, null, VRR_ANIMMOVE_NONE], + ["dance1", 28, 226, VRR_ANIMTYPE_NORMAL, 0.0, null, null, null, null, VRR_ANIMMOVE_NONE], + ["dance2", 28, 227, VRR_ANIMTYPE_NORMAL, 0.0, null, null, null, null, VRR_ANIMMOVE_NONE], + ["dance3", 28, 228, VRR_ANIMTYPE_NORMAL, 0.0, null, null, null, null, VRR_ANIMMOVE_NONE], + ["dance4", 28, 229, VRR_ANIMTYPE_NORMAL, 0.0, null, null, null, null, VRR_ANIMMOVE_NONE], + ["dance5", 28, 230, VRR_ANIMTYPE_NORMAL, 0.0, null, null, null, null, VRR_ANIMMOVE_NONE], + ["dance6", 28, 231, VRR_ANIMTYPE_NORMAL, 0.0, null, null, null, null, VRR_ANIMMOVE_NONE], + ["dance7", 28, 232, VRR_ANIMTYPE_NORMAL, 0.0, null, null, null, null, VRR_ANIMMOVE_NONE], + ["sitright", 0, 169, VRR_ANIMTYPE_NORMAL, 0.0, null, null, null, null, VRR_ANIMMOVE_RIGHT], + ["sitleft", 0, 169, VRR_ANIMTYPE_NORMAL, 0.0, null, null, null, null, VRR_ANIMMOVE_LEFT], + ["sitforward", 0, 169, VRR_ANIMTYPE_NORMAL, 0.0, null, null, null, null, VRR_ANIMMOVE_FORWARD], + ["sitback", 0, 169, VRR_ANIMTYPE_NORMAL, 0.0, null, null, null, null, VRR_ANIMMOVE_BACK], ], [ // GTA SA - ["walk", 0, 0, VRR_ANIMTYPE_ADD, 0.0, null, null, null, null, VRR_ANIMMOVE_NONE], - ["jog", 0, 1, VRR_ANIMTYPE_ADD, 0.0, null, null, null, null, VRR_ANIMMOVE_NONE], - ["look1", 0, 4, VRR_ANIMTYPE_ADD, 0.0, null, null, null, null, VRR_ANIMMOVE_NONE], - ["holdrifle", 0, 11, VRR_ANIMTYPE_ADD, 0.0, null, null, null, null, VRR_ANIMMOVE_NONE], - ["talk1", 0, 12, VRR_ANIMTYPE_ADD, 0.0, null, null, null, null, VRR_ANIMMOVE_NONE], - ["wave1", 0, 13, VRR_ANIMTYPE_ADD, 0.0, null, null, null, null, VRR_ANIMMOVE_NONE], - ["swim1", 0, 14, VRR_ANIMTYPE_ADD, 0.0, null, null, null, null, VRR_ANIMMOVE_NONE], - ["die1", 0, 15, VRR_ANIMTYPE_ADD, 0.0, null, null, null, null, VRR_ANIMMOVE_NONE], - ["die2", 0, 16, VRR_ANIMTYPE_ADD, 0.0, null, null, null, null, VRR_ANIMMOVE_NONE], - ["diehead", 0, 19, VRR_ANIMTYPE_ADD, 0.0, null, null, null, null, VRR_ANIMMOVE_NONE], - ["diestomach", 0, 20, VRR_ANIMTYPE_ADD, 0.0, null, null, null, null, VRR_ANIMMOVE_NONE], - ["choke", 0, 21, VRR_ANIMTYPE_ADD, 0.0, null, null, null, null, VRR_ANIMMOVE_NONE], - ["remotepress", 0, 48, VRR_ANIMTYPE_ADD, 0.0, null, null, null, null, VRR_ANIMMOVE_NONE], - ["pickup1", 0, 99, VRR_ANIMTYPE_ADD, 0.0, null, null, null, null, VRR_ANIMMOVE_NONE], - ["pickup2", 0, 100, VRR_ANIMTYPE_ADD, 0.0, null, null, null, null, VRR_ANIMMOVE_NONE], - ["backhandright", 0, 103, VRR_ANIMTYPE_ADD, 0.0, null, null, null, null, VRR_ANIMMOVE_NONE], - ["backhandleft", 0, 104, VRR_ANIMTYPE_ADD, 0.0, null, null, null, null, VRR_ANIMMOVE_NONE], - ["knockback", 0, 105, VRR_ANIMTYPE_ADD, 0.0, null, null, null, null, VRR_ANIMMOVE_NONE], - ["idle1", 0, 135, VRR_ANIMTYPE_ADD, 0.0, null, null, null, null, VRR_ANIMMOVE_NONE], - ["knockback", 0, 105, VRR_ANIMTYPE_ADD, 0.0, null, null, null, null, VRR_ANIMMOVE_NONE], - ["cower", 0, 141, VRR_ANIMTYPE_ADD, 0.0, null, null, null, null, VRR_ANIMMOVE_NONE], - ["handsup", 0, 142, VRR_ANIMTYPE_ADD, 0.0, null, null, null, null, VRR_ANIMMOVE_NONE], - ["fucku", 0, 144, VRR_ANIMTYPE_ADD, 0.0, null, null, null, null, VRR_ANIMMOVE_NONE], - ["phoneout", 0, 145, VRR_ANIMTYPE_ADD, 0.0, null, null, null, null, VRR_ANIMMOVE_NONE], - ["phonein", 0, 146, VRR_ANIMTYPE_ADD, 0.0, null, null, null, null, VRR_ANIMMOVE_NONE], - ["phonetalk", 0, 146, VRR_ANIMTYPE_ADD, 0.0, null, null, null, null, VRR_ANIMMOVE_NONE], - ["sit1", 0, 150, VRR_ANIMTYPE_ADD, 0.0, null, null, null, null, VRR_ANIMMOVE_NONE], - ["atm", 0, 151, VRR_ANIMTYPE_ADD, 0.0, null, null, null, null, VRR_ANIMMOVE_NONE], - ["mindtrick", 0, 153, VRR_ANIMTYPE_ADD, 0.0, null, null, null, null, VRR_ANIMMOVE_NONE], - ["faceshocked", 0, 150, VRR_ANIMTYPE_ADD, 0.0, null, null, null, null, VRR_ANIMMOVE_NONE], - ["facesurprised", 0, 150, VRR_ANIMTYPE_ADD, 0.0, null, null, null, null, VRR_ANIMMOVE_NONE], - ["faceconfused", 0, 150, VRR_ANIMTYPE_ADD, 0.0, null, null, null, null, VRR_ANIMMOVE_NONE], - ["faceangry", 0, 159, VRR_ANIMTYPE_ADD, 0.0, null, null, null, null, VRR_ANIMMOVE_NONE], - ["facetalk1", 0, 160, VRR_ANIMTYPE_ADD, 0.0, null, null, null, null, VRR_ANIMMOVE_NONE], - ["look2", 0, 165, VRR_ANIMTYPE_ADD, 0.0, null, null, null, null, VRR_ANIMMOVE_NONE], - ["gestureno", 0, 166, VRR_ANIMTYPE_ADD, 0.0, null, null, null, null, VRR_ANIMMOVE_NONE], - ["gestureyes", 0, 167, VRR_ANIMTYPE_ADD, 0.0, null, null, null, null, VRR_ANIMMOVE_NONE], - ["wave2", 0, 168, VRR_ANIMTYPE_ADD, 0.0, null, null, null, null, VRR_ANIMMOVE_NONE], - ["snort", 0, 169, VRR_ANIMTYPE_ADD, 0.0, null, null, null, null, VRR_ANIMMOVE_NONE], - ["sitright", 0, 150, VRR_ANIMTYPE_ADD, 0.0, null, null, null, null, VRR_ANIMMOVE_RIGHT], - ["sitleft", 0, 150, VRR_ANIMTYPE_ADD, 0.0, null, null, null, null, VRR_ANIMMOVE_LEFT], - ["sitforward", 0, 150, VRR_ANIMTYPE_ADD, 0.0, null, null, null, null, VRR_ANIMMOVE_FORWARD], - ["sitback", 0, 150, VRR_ANIMTYPE_ADD, 0.0, null, null, null, null, VRR_ANIMMOVE_BACK], + ["walk", 0, 0, VRR_ANIMTYPE_NORMAL, 0.0, null, null, null, null, VRR_ANIMMOVE_NONE], + ["jog", 0, 1, VRR_ANIMTYPE_NORMAL, 0.0, null, null, null, null, VRR_ANIMMOVE_NONE], + ["look1", 0, 4, VRR_ANIMTYPE_NORMAL, 0.0, null, null, null, null, VRR_ANIMMOVE_NONE], + ["holdrifle", 0, 11, VRR_ANIMTYPE_NORMAL, 0.0, null, null, null, null, VRR_ANIMMOVE_NONE], + ["talk1", 0, 12, VRR_ANIMTYPE_NORMAL, 0.0, null, null, null, null, VRR_ANIMMOVE_NONE], + ["wave1", 0, 13, VRR_ANIMTYPE_NORMAL, 0.0, null, null, null, null, VRR_ANIMMOVE_NONE], + ["swim1", 0, 14, VRR_ANIMTYPE_NORMAL, 0.0, null, null, null, null, VRR_ANIMMOVE_NONE], + ["die1", 0, 15, VRR_ANIMTYPE_NORMAL, 0.0, null, null, null, null, VRR_ANIMMOVE_NONE], + ["die2", 0, 16, VRR_ANIMTYPE_NORMAL, 0.0, null, null, null, null, VRR_ANIMMOVE_NONE], + ["diehead", 0, 19, VRR_ANIMTYPE_NORMAL, 0.0, null, null, null, null, VRR_ANIMMOVE_NONE], + ["diestomach", 0, 20, VRR_ANIMTYPE_NORMAL, 0.0, null, null, null, null, VRR_ANIMMOVE_NONE], + ["choke", 0, 21, VRR_ANIMTYPE_NORMAL, 0.0, null, null, null, null, VRR_ANIMMOVE_NONE], + ["remotepress", 0, 48, VRR_ANIMTYPE_NORMAL, 0.0, null, null, null, null, VRR_ANIMMOVE_NONE], + ["pickup1", 0, 99, VRR_ANIMTYPE_NORMAL, 0.0, null, null, null, null, VRR_ANIMMOVE_NONE], + ["pickup2", 0, 100, VRR_ANIMTYPE_NORMAL, 0.0, null, null, null, null, VRR_ANIMMOVE_NONE], + ["backhandright", 0, 103, VRR_ANIMTYPE_NORMAL, 0.0, null, null, null, null, VRR_ANIMMOVE_NONE], + ["backhandleft", 0, 104, VRR_ANIMTYPE_NORMAL, 0.0, null, null, null, null, VRR_ANIMMOVE_NONE], + ["knockback", 0, 105, VRR_ANIMTYPE_NORMAL, 0.0, null, null, null, null, VRR_ANIMMOVE_NONE], + ["idle1", 0, 135, VRR_ANIMTYPE_NORMAL, 0.0, null, null, null, null, VRR_ANIMMOVE_NONE], + ["knockback", 0, 105, VRR_ANIMTYPE_NORMAL, 0.0, null, null, null, null, VRR_ANIMMOVE_NONE], + ["cower", 0, 141, VRR_ANIMTYPE_NORMAL, 0.0, null, null, null, null, VRR_ANIMMOVE_NONE], + ["handsup", 0, 142, VRR_ANIMTYPE_NORMAL, 0.0, null, null, null, null, VRR_ANIMMOVE_NONE], + ["fucku", 0, 144, VRR_ANIMTYPE_NORMAL, 0.0, null, null, null, null, VRR_ANIMMOVE_NONE], + ["phoneout", 0, 145, VRR_ANIMTYPE_NORMAL, 0.0, null, null, null, null, VRR_ANIMMOVE_NONE], + ["phonein", 0, 146, VRR_ANIMTYPE_NORMAL, 0.0, null, null, null, null, VRR_ANIMMOVE_NONE], + ["phonetalk", 0, 146, VRR_ANIMTYPE_NORMAL, 0.0, null, null, null, null, VRR_ANIMMOVE_NONE], + ["sit1", 0, 150, VRR_ANIMTYPE_NORMAL, 0.0, null, null, null, null, VRR_ANIMMOVE_NONE], + ["atm", 0, 151, VRR_ANIMTYPE_NORMAL, 0.0, null, null, null, null, VRR_ANIMMOVE_NONE], + ["mindtrick", 0, 153, VRR_ANIMTYPE_NORMAL, 0.0, null, null, null, null, VRR_ANIMMOVE_NONE], + //["faceshocked", 0, 150, VRR_ANIMTYPE_NORMAL, 0.0, null, null, null, null, VRR_ANIMMOVE_NONE], + //["facesurprised", 0, 150, VRR_ANIMTYPE_NORMAL, 0.0, null, null, null, null, VRR_ANIMMOVE_NONE], + //["faceconfused", 0, 150, VRR_ANIMTYPE_NORMAL, 0.0, null, null, null, null, VRR_ANIMMOVE_NONE], + //["faceangry", 0, 159, VRR_ANIMTYPE_NORMAL, 0.0, null, null, null, null, VRR_ANIMMOVE_NONE], + //["facetalk1", 0, 160, VRR_ANIMTYPE_NORMAL, 0.0, null, null, null, null, VRR_ANIMMOVE_NONE], + ["look2", 0, 165, VRR_ANIMTYPE_NORMAL, 0.0, null, null, null, null, VRR_ANIMMOVE_NONE], + ["gestureno", 0, 166, VRR_ANIMTYPE_NORMAL, 0.0, null, null, null, null, VRR_ANIMMOVE_NONE], + ["gestureyes", 0, 167, VRR_ANIMTYPE_NORMAL, 0.0, null, null, null, null, VRR_ANIMMOVE_NONE], + ["wave2", 0, 168, VRR_ANIMTYPE_NORMAL, 0.0, null, null, null, null, VRR_ANIMMOVE_NONE], + ["snort", 0, 169, VRR_ANIMTYPE_NORMAL, 0.0, null, null, null, null, VRR_ANIMMOVE_NONE], + ["sitright", 0, 150, VRR_ANIMTYPE_NORMAL, 0.0, null, null, null, null, VRR_ANIMMOVE_RIGHT], + ["sitleft", 0, 150, VRR_ANIMTYPE_NORMAL, 0.0, null, null, null, null, VRR_ANIMMOVE_LEFT], + ["sitforward", 0, 150, VRR_ANIMTYPE_NORMAL, 0.0, null, null, null, null, VRR_ANIMMOVE_FORWARD], + ["sitback", 0, 150, VRR_ANIMTYPE_NORMAL, 0.0, null, null, null, null, VRR_ANIMMOVE_BACK], /* - ["talk", "PED", "IDLE_CHAT", VRR_ANIMTYPE_ADD, 0.0, null, null, null, null], - ["fucku", "PED", "FUCKU", VRR_ANIMTYPE_ADD, 0.0, null, null, null, null], - ["taichi", "PARK", "Tai_Chi_Loop", VRR_ANIMTYPE_ADD, 0.0, null, null, null, null], - ["slapass", "SWEET", "sweet_ass_slap", VRR_ANIMTYPE_ADD, 0.0, null, null, null, null], - ["wave", "ON_LOOKERS", "wave_loop", VRR_ANIMTYPE_ADD, 0.0, null, null, null, null], - ["vomit", "EAT_Vomit_P", VRR_ANIMTYPE_ADD, 0.0, null, null, null, null], - ["cower", "ped", "cower", VRR_ANIMTYPE_ADD, 0.0, null, null, null, null], - ["laugh", "RAPPING", "Laugh_01", VRR_ANIMTYPE_ADD, 0.0, null, null, null, null], - ["plant", "BOMBER", "BOM_Plant", VRR_ANIMTYPE_ADD, 0.0, null, null, null, null], - ["smoke1", "SMOKING","M_smklean_loop", VRR_ANIMTYPE_ADD, 0.0, null, null, null, null], - ["smoke2", "SMOKING","F_smklean_loop", VRR_ANIMTYPE_ADD, 0.0, null, null, null, null], - ["smoke3", "SMOKING","M_smkstnd_loop", VRR_ANIMTYPE_ADD, 0.0, null, null, null, null], - ["sit1", "ped","SEAT_idle", VRR_ANIMTYPE_ADD, 0.0, null, null, null, null], - ["sit2", "BEACH", "ParkSit_M_loop", VRR_ANIMTYPE_ADD, 0.0, null, null, null, null], - ["sit3", "BEACH", "ParkSit_W_loop", VRR_ANIMTYPE_ADD, 0.0, null, null, null, null], - ["sit4", "BEACH", "SitnWait_loop_W", VRR_ANIMTYPE_ADD, 0.0, null, null, null, null], - ["scratch", "MISC","Scratchballs_01", VRR_ANIMTYPE_ADD, 0.0, null, null, null, null], - ["standup", "ped", "SEAT_up", VRR_ANIMTYPE_ADD, 0.0, null, null, null, null], + ["talk", "PED", "IDLE_CHAT", VRR_ANIMTYPE_NORMAL, 0.0, null, null, null, null], + ["fucku", "PED", "FUCKU", VRR_ANIMTYPE_NORMAL, 0.0, null, null, null, null], + ["taichi", "PARK", "Tai_Chi_Loop", VRR_ANIMTYPE_NORMAL, 0.0, null, null, null, null], + ["slapass", "SWEET", "sweet_ass_slap", VRR_ANIMTYPE_NORMAL, 0.0, null, null, null, null], + ["wave", "ON_LOOKERS", "wave_loop", VRR_ANIMTYPE_NORMAL, 0.0, null, null, null, null], + ["vomit", "EAT_Vomit_P", VRR_ANIMTYPE_NORMAL, 0.0, null, null, null, null], + ["cower", "ped", "cower", VRR_ANIMTYPE_NORMAL, 0.0, null, null, null, null], + ["laugh", "RAPPING", "Laugh_01", VRR_ANIMTYPE_NORMAL, 0.0, null, null, null, null], + ["plant", "BOMBER", "BOM_Plant", VRR_ANIMTYPE_NORMAL, 0.0, null, null, null, null], + ["smoke1", "SMOKING","M_smklean_loop", VRR_ANIMTYPE_NORMAL, 0.0, null, null, null, null], + ["smoke2", "SMOKING","F_smklean_loop", VRR_ANIMTYPE_NORMAL, 0.0, null, null, null, null], + ["smoke3", "SMOKING","M_smkstnd_loop", VRR_ANIMTYPE_NORMAL, 0.0, null, null, null, null], + ["sit1", "ped","SEAT_idle", VRR_ANIMTYPE_NORMAL, 0.0, null, null, null, null], + ["sit2", "BEACH", "ParkSit_M_loop", VRR_ANIMTYPE_NORMAL, 0.0, null, null, null, null], + ["sit3", "BEACH", "ParkSit_W_loop", VRR_ANIMTYPE_NORMAL, 0.0, null, null, null, null], + ["sit4", "BEACH", "SitnWait_loop_W", VRR_ANIMTYPE_NORMAL, 0.0, null, null, null, null], + ["scratch", "MISC","Scratchballs_01", VRR_ANIMTYPE_NORMAL, 0.0, null, null, null, null], + ["standup", "ped", "SEAT_up", VRR_ANIMTYPE_NORMAL, 0.0, null, null, null, null], */ ], null, @@ -3914,15 +3921,28 @@ let gameData = { ["Outfit", 500, 2] ], legalGunStore: [ + ["Baseball Bat", 500, 2], + ["Knife", 500, 2], + ["Glock 9mm", 500, 2], + ["Desert Eagle", 500, 2], + ["Stubby Shotgun", 500, 2], + ["Glock 9mm Ammo", 500, 2], + ["Desert Eagle Ammo", 500, 2], + ["Stubby Shotgun Ammo", 500, 2], ], illegalGunStore: [ - ["Micro SMG/Uzi", 500, 2], ["MP5", 500, 2], - ["Tec-9", 500, 2], + ["Micro Uzi", 500, 2], ["AK-47", 500, 2], ["M4", 500, 2], - ["Combat Shotgun", 500, 2], - ["Sniper Rifle", 500, 2] + ["Beretta Shotgun", 500, 2], + ["Sniper Rifle", 500, 2], + ["MP5 Ammo", 500, 2], + ["Micro Uzi Ammo", 500, 2], + ["AK-47 Ammo", 500, 2], + ["M4 Ammo", 500, 2], + ["Beretta Shotgun Ammo", 500, 2], + ["Sniper Rifle Ammo", 500, 2], ], sexShop: [ ["Purple Dildo", 500, 2], @@ -4053,6 +4073,19 @@ let gameData = { ["Outfit", 500, 2] ], legalGunStore: [ + ["Baseball Bat", 500, 2], + ["Knuckleduster", 500, 2], + ["Knife", 500, 2], + ["S&W Model 10 M&P", 500, 2], + ["S&W Model 27 Magnum", 500, 2], + ["Colt 1911", 500, 2], + ["Shotgun", 500, 2], + ["Sawed-off Shotgun", 500, 2], + ["S&W Model 10 M&P Ammo", 500, 2], + ["S&W Model 27 Magnum Ammo", 500, 2], + ["Colt 1911 Ammo", 500, 2], + ["Shotgun Ammo", 500, 2], + ["Sawed-off Shotgun Ammo", 500, 2], ], illegalGunStore: [ ], From 9217638191ccc28399e3c27112ade6f8c4c7c2a6 Mon Sep 17 00:00:00 2001 From: Vortrex <3858226+VortrexFTW@users.noreply.github.com> Date: Thu, 6 Jan 2022 13:33:17 -0600 Subject: [PATCH 045/337] New anim const --- scripts/shared/const.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/scripts/shared/const.js b/scripts/shared/const.js index 28cee556..80ac8964 100644 --- a/scripts/shared/const.js +++ b/scripts/shared/const.js @@ -61,10 +61,13 @@ const VRR_PROPLABEL_INFO_BUYBIZ = 8; // Animation Types const VRR_ANIMTYPE_NONE = 0; -const VRR_ANIMTYPE_ADD = 1; +const VRR_ANIMTYPE_NORMAL = 1; const VRR_ANIMTYPE_BLEND = 2; const VRR_ANIMTYPE_SHARED = 3; // Forces this animation to play in sync with another ped's mirrored anim (handshake, kiss, gang signs, etc) const VRR_ANIMTYPE_SPECIALACTION = 4; // This animtype uses a special action (only in SA) +const VRR_ANIMTYPE_SURRENDER = 5; // This animtype is used to surrender (like handsup or cower) +const VRR_ANIMTYPE_FORCED = 6; // This animtype is forced (can't use stopanim to get out of it) +const VRR_ANIMTYPE_FREEZE = 6; // This animtype is forced (can't use stopanim to get out of it) // Animation Move Types const VRR_ANIMMOVE_NONE = 0; From e23b9920ee7cd7c17a8c2ef5a81f1170f8b208a1 Mon Sep 17 00:00:00 2001 From: Vortrex <3858226+VortrexFTW@users.noreply.github.com> Date: Thu, 6 Jan 2022 13:33:35 -0600 Subject: [PATCH 046/337] Add debug console msgs + update nametags --- scripts/server/timers.js | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/scripts/server/timers.js b/scripts/server/timers.js index c40608f0..66ba8e46 100644 --- a/scripts/server/timers.js +++ b/scripts/server/timers.js @@ -97,8 +97,16 @@ function initTimers() { // =========================================================================== function oneMinuteTimerFunction() { + logToConsole(LOG_DEBUG, `[VRR.Event] Checking server game time`); checkServerGameTime(); + + logToConsole(LOG_DEBUG, `[VRR.Event] Checking rentable vehicles`); vehicleRentCheck(); + + logToConsole(LOG_DEBUG, `[VRR.Event] Updating all player name tags`); + updateAllPlayerNameTags(); + + logToConsole(LOG_DEBUG, `[VRR.Event] Collecting all garbage`); collectAllGarbage(); } From 82574cecd6a9008f645b05f2e689c27722125e67 Mon Sep 17 00:00:00 2001 From: Vortrex <3858226+VortrexFTW@users.noreply.github.com> Date: Thu, 6 Jan 2022 13:33:51 -0600 Subject: [PATCH 047/337] Change header to normal --- scripts/server/radio.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/server/radio.js b/scripts/server/radio.js index a1bfee81..47ea8afc 100644 --- a/scripts/server/radio.js +++ b/scripts/server/radio.js @@ -193,7 +193,7 @@ function showRadioStationListCommand(command, params, client) { let chunkedList = splitArrayIntoChunks(stationList, 4); - messagePlayerInfo(client, `{clanOrange}== {jobYellow}Radio Stations {clanOrange}===========================`); + messagePlayerNormal(client, `{clanOrange}== {jobYellow}Radio Stations {clanOrange}===========================`); for(let i in chunkedList) { messagePlayerInfo(client, chunkedList[i].join(", ")); From 6a2e58cfd4f11176f8bcfaebb2e30d095fc1bedb Mon Sep 17 00:00:00 2001 From: Vortrex <3858226+VortrexFTW@users.noreply.github.com> Date: Thu, 6 Jan 2022 13:34:04 -0600 Subject: [PATCH 048/337] Use netevent for armour --- scripts/server/native/connected.js | 1 + 1 file changed, 1 insertion(+) diff --git a/scripts/server/native/connected.js b/scripts/server/native/connected.js index e88d4cd7..50339477 100644 --- a/scripts/server/native/connected.js +++ b/scripts/server/native/connected.js @@ -223,6 +223,7 @@ function getPlayerHealth(client) { function setPlayerArmour(client, armour) { logToConsole(LOG_DEBUG, `Setting ${getPlayerDisplayForConsole(client)}'s armour to ${armour}`); sendPlayerSetArmour(client, armour); + //client.player.armour = armour; } // =========================================================================== From e5994c2998366c4fa3752e5fa3403ff72f9b5473 Mon Sep 17 00:00:00 2001 From: Vortrex <3858226+VortrexFTW@users.noreply.github.com> Date: Thu, 6 Jan 2022 13:34:32 -0600 Subject: [PATCH 049/337] Change header to normal --- scripts/server/business.js | 2 +- scripts/server/house.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/server/business.js b/scripts/server/business.js index 632d3816..9ab6ebb5 100644 --- a/scripts/server/business.js +++ b/scripts/server/business.js @@ -707,7 +707,7 @@ function setBusinessInteriorTypeCommand(command, params, client) { let interiorTypesList = Object.keys(getGameConfig().interiorTemplates[getServerGame()]); let chunkedList = splitArrayIntoChunks(interiorTypesList, 10); - messagePlayerInfo(client, `{clanOrange}== {jobYellow}Interior Types {clanOrange}=======================`); + messagePlayerNormal(client, `{clanOrange}== {jobYellow}Interior Types {clanOrange}=======================`); for(let i in chunkedList) { messagePlayerInfo(client, chunkedList[i].join(", ")); } diff --git a/scripts/server/house.js b/scripts/server/house.js index 0031955e..9f6069c2 100644 --- a/scripts/server/house.js +++ b/scripts/server/house.js @@ -400,7 +400,7 @@ function setHouseInteriorTypeCommand(command, params, client) { let interiorTypesList = Object.keys(getGameConfig().interiorTemplates[getServerGame()]); let chunkedList = splitArrayIntoChunks(interiorTypesList, 10); - messagePlayerInfo(client, `{clanOrange}== {jobYellow}Interior Types {clanOrange}=======================`); + messagePlayerNormal(client, `{clanOrange}== {jobYellow}Interior Types {clanOrange}=======================`); for(let i in chunkedList) { messagePlayerInfo(client, chunkedList[i].join(", ")); } From 993272b4515c10a19dc997b4c7f1e4d2e858a1f0 Mon Sep 17 00:00:00 2001 From: Vortrex <3858226+VortrexFTW@users.noreply.github.com> Date: Thu, 6 Jan 2022 13:34:41 -0600 Subject: [PATCH 050/337] Fix locale strings --- scripts/server/animation.js | 64 +++++++++++++++++++++++++++---------- 1 file changed, 47 insertions(+), 17 deletions(-) diff --git a/scripts/server/animation.js b/scripts/server/animation.js index b4d1f178..f0a9c44c 100644 --- a/scripts/server/animation.js +++ b/scripts/server/animation.js @@ -22,39 +22,45 @@ function playPlayerAnimationCommand(command, params, client) { let splitParams = params.split(" "); let animationSlot = getAnimationFromParams(splitParams[0]); - let animationPositionOffset = getAnimationFromParams(splitParams[1]) || 1; + let animationPositionOffset = 1; if(!animationSlot) { - messagePlayerError(client, getLocaleString("AnimationNotFound")); - messagePlayerInfo(client, getLocaleString("AnimationHelpTip"), `{ALTCOLOUR}/animlist{MAINCOLOUR}`); + messagePlayerError(client, getLocaleString(client, "AnimationNotFound")); + messagePlayerInfo(client, getLocaleString(client, "AnimationHelpTip"), `{ALTCOLOUR}/animlist{MAINCOLOUR}`); return false; } if(toInteger(animationPositionOffset) < 0 || toInteger(animationPositionOffset) > 3) { - messagePlayerError(client, getLocaleString("AnimationInvalidDistance")); + messagePlayerError(client, getLocaleString(client, "AnimationInvalidDistance")); return false; } - getPlayerData(client).currentAnimation = animationSlot; - getPlayerData(client).currentAnimationPositionOffset = animationSlot; - getPlayerData(client).currentAnimationPositionReturnTo = getPlayerPosition(client); - getPlayerData(client).animationStart = getCurrentUnixTimestamp(); - //setEntityData(getPlayerData(client).ped, "vrr.animation", animationSlot, true); - messagePlayerTip(client, ``); - makePedPlayAnimation(getPlayerData(client).ped, animationSlot, animationPositionOffset); - - if(getAnimationData(animationSlot)[9] != VRR_ANIMMOVE_NONE) { - if(getGame() < VRR_GAME_GTA_SA) { - setPlayerMouseCameraState(client, true); - } + if(isPlayerHandCuffed(client) || isPlayerTazed(client) || isPlayerInForcedAnimation(client)) { + messagePlayerError(client, `You aren't able to do that`); + return false; } + + messagePlayerTip(client, getLocaleString(client, "AnimationStopCommandTip")); + makePlayerPlayAnimation(getPlayerData(client).ped, animationSlot, animationPositionOffset); } // =========================================================================== function stopPlayerAnimationCommand(command, params, client) { + if(isPlayerHandCuffed(client) || isPlayerTazed(client) || isPlayerInForcedAnimation(client)) { + messagePlayerError(client, `You aren't able to do that`); + return false; + } + setPlayerPosition(client, getPlayerData(client).currentAnimationPositionReturnTo); makePedStopAnimation(getPlayerData(client).ped); + + getPlayerData(client).currentAnimation = -1; + getPlayerData(client).currentAnimationPositionOffset = false; + getPlayerData(client).currentAnimationPositionReturnTo = false; + getPlayerData(client).animationStart = 0; + getPlayerData(client).animationForced = false; + setPlayerMouseCameraState(client, false); } @@ -68,7 +74,7 @@ function showAnimationListCommand(command, params, client) { messagePlayerInfo(client, `{clanOrange}== {jobYellow}Animation List {clanOrange}===========================`); for(let i in chunkedList) { - messagePlayerInfo(client, chunkedList[i].join(", ")); + messagePlayerNormal(client, chunkedList[i].join(", ")); } } @@ -78,4 +84,28 @@ function getAnimationData(animationSlot, gameId = getServerGame()) { return getGameData().animations[gameId][animationSlot]; } +// =========================================================================== + +function isPlayerInForcedAnimation(client) { + return getPlayerData(client).animationForced; +} + +// =========================================================================== + +function makePlayerPlayAnimation(client, animationSlot, offsetPosition = 1) { + getPlayerData(client).currentAnimation = animationSlot; + getPlayerData(client).currentAnimationPositionOffset = offsetPosition; + getPlayerData(client).currentAnimationPositionReturnTo = getPlayerPosition(client); + getPlayerData(client).animationStart = getCurrentUnixTimestamp(); + getPlayerData(client).animationForced = false; + + makePedPlayAnimation(getPlayerData(client).ped, animationSlot, animationPositionOffset); + + if(getAnimationData(animationSlot)[9] != VRR_ANIMMOVE_NONE) { + if(getGame() < VRR_GAME_GTA_SA) { + setPlayerMouseCameraState(client, true); + } + } +} + // =========================================================================== \ No newline at end of file From e49dce217d7616b0b26252336ed4eddc3a0b8210 Mon Sep 17 00:00:00 2001 From: Vortrex <3858226+VortrexFTW@users.noreply.github.com> Date: Thu, 6 Jan 2022 13:34:58 -0600 Subject: [PATCH 051/337] Add anim members to class (forgot to do this) --- scripts/server/class.js | 32 +++++++++++++++++++++++++++----- 1 file changed, 27 insertions(+), 5 deletions(-) diff --git a/scripts/server/class.js b/scripts/server/class.js index e46891c8..babff1e1 100644 --- a/scripts/server/class.js +++ b/scripts/server/class.js @@ -247,16 +247,17 @@ class ClientData { this.returnToType = VRR_RETURNTO_TYPE_NONE; this.changingCharacterName = false; - this.currentPickup = false; - this.usingSkinSelect = false; - this.keyBinds = []; - this.connectionId = 0; - this.incomingDamageMultiplier = 1; + + this.currentAnimation = -1; + this.currentAnimationPositionOffset = false; + this.currentAnimationPositionReturnTo = false; + this.animationStart = 0; + this.animationForced = false; } }; @@ -1449,6 +1450,20 @@ class ItemTypeData { this.takeDelay = 0; this.giveDelay = 0; this.dropDelay = 0; + this.useAnimationName = ""; + this.dropAnimationName = ""; + this.pickupAnimationName = ""; + this.giveAnimationName = ""; + this.putAnimationName = ""; + this.takeAnimationName = ""; + this.switchAnimationName = ""; + this.useAnimationIndex = false; + this.dropAnimationIndex = false; + this.pickupAnimationIndex = false; + this.giveAnimationIndex = false; + this.putAnimationIndex = false; + this.takeAnimationIndex = false; + this.switchAnimationIndex = false; if(dbAssoc) { this.databaseId = toInteger(dbAssoc["item_type_id"]); @@ -1479,6 +1494,13 @@ class ItemTypeData { this.takeDelay = toInteger(dbAssoc["item_type_delay_take"]); this.giveDelay = toInteger(dbAssoc["item_type_delay_give"]); this.dropDelay = toInteger(dbAssoc["item_type_delay_drop"]); + this.useAnimationName = toInteger(dbAssoc["item_type_anim_use"]); + this.switchAnimationName = toInteger(dbAssoc["item_type_anim_switch"]); + this.pickupAnimationName = toInteger(dbAssoc["item_type_anim_pickup"]); + this.putAnimationName = toInteger(dbAssoc["item_type_anim_put"]); + this.takeAnimationName = toInteger(dbAssoc["item_type_anim_take"]); + this.giveAnimationName = toInteger(dbAssoc["item_type_anim_give"]); + this.dropAnimationName = toInteger(dbAssoc["item_type_anim_drop"]); } } }; From 1001e27afc981d9ff4539d4bcbcc55e0e79ce902 Mon Sep 17 00:00:00 2001 From: Vortrex <3858226+VortrexFTW@users.noreply.github.com> Date: Thu, 6 Jan 2022 13:35:08 -0600 Subject: [PATCH 052/337] Add force wanted level net event --- scripts/server/client.js | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/scripts/server/client.js b/scripts/server/client.js index f786022d..cbdc980c 100644 --- a/scripts/server/client.js +++ b/scripts/server/client.js @@ -1072,6 +1072,13 @@ function setPlayerVanillaRadioStation(client, radioStationId) { // =========================================================================== +function forcePlayerWantedLevel(client, wantedLevel) { + triggerNetworkEvent("vrr.wantedLevel", client, wantedLevel); + return true; +} + +// =========================================================================== + function onPlayerNearPickup(client, pickupId) { getPlayerData(client).currentPickup = getElementFromId(pickupId); } From f947602a8563b2cd26b6004b426ac7358f8dd7ac Mon Sep 17 00:00:00 2001 From: Vortrex <3858226+VortrexFTW@users.noreply.github.com> Date: Thu, 6 Jan 2022 13:35:25 -0600 Subject: [PATCH 053/337] Add setstars mod cmd --- scripts/server/command.js | 1 + 1 file changed, 1 insertion(+) diff --git a/scripts/server/command.js b/scripts/server/command.js index 9b5fb693..5c81bb46 100644 --- a/scripts/server/command.js +++ b/scripts/server/command.js @@ -409,6 +409,7 @@ function loadCommands() { commandData("getplrbiz", getAllBusinessesOwnedByPlayerCommand, "", getStaffFlagValue("BasicModeration"), true, true, "Shows a list of all businesses owned by the player"), commandData("getplrveh", getAllVehiclesOwnedByPlayerCommand, "", getStaffFlagValue("BasicModeration"), true, true, "Shows a list of all vehicles owned by the player"), commandData("geoip", getGeoIPInformationCommand, "", getStaffFlagValue("BasicModeration"), true, true, "Retrieves GeoIP information on a player (country & city)"), + commandData("setstars", forcePlayerWantedLevelCommand, " ", getStaffFlagValue("BasicModeration"), true, true, "Forces a player to have a wanted level"), ], radio: [ commandData("radiostation", playStreamingRadioCommand, "", getStaffFlagValue("None"), true, false, "Plays a radio station in your vehicle, house, or business (depending on which one you're in)"), From a04d145327475b8649a89de2b135dcfacddcde63 Mon Sep 17 00:00:00 2001 From: Vortrex <3858226+VortrexFTW@users.noreply.github.com> Date: Thu, 6 Jan 2022 13:35:40 -0600 Subject: [PATCH 054/337] Update player nametags on spawn --- scripts/server/event.js | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/scripts/server/event.js b/scripts/server/event.js index 611293ea..e74837f1 100644 --- a/scripts/server/event.js +++ b/scripts/server/event.js @@ -527,9 +527,6 @@ function onPlayerSpawn(client) { logToConsole(LOG_DEBUG, `[VRR.Event] Setting player armour for ${getPlayerDisplayForConsole(client)} to ${getPlayerCurrentSubAccount(client).armour}`); setPlayerArmour(client, getPlayerCurrentSubAccount(client).armour); - logToConsole(LOG_DEBUG, `[VRR.Event] Updating all player name tags`); - updateAllPlayerNameTags(); - logToConsole(LOG_DEBUG, `[VRR.Event] Sending ${getPlayerDisplayForConsole(client)}'s job type to their client (${getJobIndexFromDatabaseId(getPlayerCurrentSubAccount(client))})`); sendPlayerJobType(client, getPlayerCurrentSubAccount(client).job); @@ -557,9 +554,6 @@ function onPlayerSpawn(client) { logToConsole(LOG_DEBUG, `[VRR.Event] Syncing ${getPlayerDisplayForConsole(client)}'s hotbar`); updatePlayerHotBar(client); - logToConsole(LOG_DEBUG, `[VRR.Event] Sending custom keybinds to ${getPlayerDisplayForConsole(client)}`); - sendAccountKeyBindsToClient(client); - logToConsole(LOG_DEBUG, `[VRR.Event] Setting ${getPlayerDisplayForConsole(client)}'s switchchar state to false`); getPlayerData(client).switchingCharacter = false; @@ -601,6 +595,9 @@ function onPlayerSpawn(client) { logToConsole(LOG_DEBUG, `[VRR.Event] Syncing ${getPlayerDisplayForConsole(client)}'s cash ${getPlayerCurrentSubAccount(client).cash}`); updatePlayerCash(client); + logToConsole(LOG_DEBUG, `[VRR.Event] Updating all player name tags`); + updateAllPlayerNameTags(); + getPlayerData(client).payDayTickStart = sdl.ticks; //} } From 0728c1f9e6fed1990a714f5a2b0b85d49aaddd00 Mon Sep 17 00:00:00 2001 From: Vortrex <3858226+VortrexFTW@users.noreply.github.com> Date: Thu, 6 Jan 2022 13:35:50 -0600 Subject: [PATCH 055/337] Use anims for item actions --- scripts/server/item.js | 57 ++++++++++++++++++++++++++++++++++++------ 1 file changed, 49 insertions(+), 8 deletions(-) diff --git a/scripts/server/item.js b/scripts/server/item.js index 0e0092d3..e7bf69db 100644 --- a/scripts/server/item.js +++ b/scripts/server/item.js @@ -12,6 +12,7 @@ function initItemScript() { getServerData().itemTypes = loadItemTypesFromDatabase(); getServerData().items = loadItemsFromDatabase(); + setItemTypeDataIndexes(); setItemDataIndexes(); cacheAllGroundItems(); @@ -216,6 +217,10 @@ function useItemCommand(command, params, client) { return false; } + if(getItemTypeData(getItemData(itemId).itemTypeIndex).useAnimationIndex != false) { + makePlayerPlayAnimation(client, getItemTypeData(getItemData(itemId).itemTypeIndex).useAnimationIndex, 0.0); + } + getPlayerData(client).itemActionState = VRR_ITEM_ACTION_USE; getPlayerData(client).itemActionItem = hotBarSlot; showPlayerItemUseDelay(client, hotBarSlot); @@ -285,6 +290,10 @@ function pickupItemCommand(command, params, client) { return false; } + if(getItemTypeData(getItemData(itemId).itemTypeIndex).dropAnimationIndex != false) { + makePlayerPlayAnimation(client, getItemTypeData(getItemData(itemId).itemTypeIndex).pickupAnimationIndex, 0.0); + } + getPlayerData(client).itemActionState = VRR_ITEM_ACTION_PICKUP; getPlayerData(client).itemActionItem = itemId; showPlayerItemPickupDelay(client, itemId); @@ -342,6 +351,10 @@ function dropItemCommand(command, params, client) { return false; } + if(getItemTypeData(getItemData(itemId).itemTypeIndex).dropAnimationIndex != false) { + makePlayerPlayAnimation(client, getItemTypeData(getItemData(itemId).itemTypeIndex).dropAnimationIndex, 0.0); + } + getPlayerData(client).itemActionState = VRR_ITEM_ACTION_DROP; getPlayerData(client).itemActionItem = hotBarSlot; showPlayerItemDropDelay(client, hotBarSlot); @@ -385,6 +398,10 @@ function putItemCommand(command, params, client) { return false; } + if(getItemTypeData(getItemData(itemId).itemTypeIndex).putAnimationIndex != false) { + makePlayerPlayAnimation(client, getItemTypeData(getItemData(itemId).itemTypeIndex).putAnimationIndex, 0.0); + } + getPlayerData(client).itemActionItem = hotBarSlot; getPlayerData(client).itemActionState = VRR_ITEM_ACTION_PUT; showPlayerItemPutDelay(client, hotBarSlot); @@ -428,6 +445,10 @@ function takeItemCommand(command, params, client) { // return false; //} + if(getItemTypeData(getItemData(itemId).itemTypeIndex).takeAnimationIndex != false) { + makePlayerPlayAnimation(client, getItemTypeData(getItemData(itemId).itemTypeIndex).takeAnimationIndex, 0.0); + } + getPlayerData(client).itemActionItem = itemId; getPlayerData(client).itemActionState = VRR_ITEM_ACTION_TAKE; showPlayerItemTakeDelay(client, itemId); @@ -630,7 +651,7 @@ function playerUseItem(client, hotBarSlot) { break; case VRR_ITEM_USETYPE_DRINK: - meActionToNearbyPlayers(client, `drink some of their ${getItemName(itemIndex)}`); + meActionToNearbyPlayers(client, `drinks some of their ${getItemName(itemIndex)}`); givePlayerHealth(client, getItemTypeData(getItemData(itemIndex).itemTypeIndex).useValue); getItemData(itemIndex).value = getItemData(itemIndex).value - getItemTypeData(getItemData(itemIndex).itemTypeIndex).useValue; if(getItemData(itemIndex).value <= 0) { @@ -810,24 +831,27 @@ function playerUseItem(client, hotBarSlot) { case VRR_ITEM_USETYPE_SMOKEDRUG: meActionToNearbyPlayers(client, `smokes some ${getItemName(itemIndex)}`); - getPlayerData(client).incomingDamageMultiplier = getItemTypeData(getItemData(itemIndex).itemTypeIndex).useValue; - givePlayerHealth(client, 100); + if(getPlayerData(client).incomingDamageMultiplier-getItemTypeData(getItemData(itemIndex).itemTypeIndex).useValue > 25) { + getPlayerData(client).incomingDamageMultiplier = getPlayerData(client).incomingDamageMultiplier-getItemTypeData(getItemData(itemIndex).itemTypeIndex).useValue; + } deleteItem(itemIndex); switchPlayerActiveHotBarSlot(client, -1); break; case VRR_ITEM_USETYPE_SNORTDRUG: meActionToNearbyPlayers(client, `snorts some ${getItemName(itemIndex)}`); - getPlayerData(client).incomingDamageMultiplier = getItemTypeData(getItemData(itemIndex).itemTypeIndex).useValue; - givePlayerHealth(client, 100); + if(getPlayerData(client).incomingDamageMultiplier-getItemTypeData(getItemData(itemIndex).itemTypeIndex).useValue > 25) { + getPlayerData(client).incomingDamageMultiplier = getPlayerData(client).incomingDamageMultiplier-getItemTypeData(getItemData(itemIndex).itemTypeIndex).useValue; + } deleteItem(itemIndex); switchPlayerActiveHotBarSlot(client, -1); break; case VRR_ITEM_USETYPE_INJECTDRUG: meActionToNearbyPlayers(client, `shoots up some ${getItemName(itemIndex)}`); - getPlayerData(client).incomingDamageMultiplier = getItemTypeData(getItemData(itemIndex).itemTypeIndex).useValue; - givePlayerHealth(client, 100); + if(getPlayerData(client).incomingDamageMultiplier-getItemTypeData(getItemData(itemIndex).itemTypeIndex).useValue > 25) { + getPlayerData(client).incomingDamageMultiplier = getPlayerData(client).incomingDamageMultiplier-getItemTypeData(getItemData(itemIndex).itemTypeIndex).useValue; + } deleteItem(itemIndex); switchPlayerActiveHotBarSlot(client, -1); break; @@ -854,7 +878,7 @@ function playerUseItem(client, hotBarSlot) { } break; - case VRR_ITEM_USETYPE_AMMOCLIP: + case VRR_ITEM_USETYPE_AMMO_CLIP: messagePlayerError(client, `Equip a compatible weapon and press R to use an ammo clip/magazine`); break; @@ -1133,6 +1157,23 @@ function setItemDataIndexes() { // =========================================================================== +function setItemTypeDataIndexes() { + for(let i in getServerData().itemTypes) { + if(getServerData().itemTypes[i]) { + getServerData().itemTypes[i].index = i; + getServerData().itemTypes[i].useAnimationIndex = getAnimationFromParams(getServerData().itemTypes[i].useAnimationName); + getServerData().itemTypes[i].switchAnimationIndex = getAnimationFromParams(getServerData().itemTypes[i].switchAnimationName); + getServerData().itemTypes[i].dropAnimationIndex = getAnimationFromParams(getServerData().itemTypes[i].dropAnimationName); + getServerData().itemTypes[i].putAnimationIndex = getAnimationFromParams(getServerData().itemTypes[i].putAnimationName); + getServerData().itemTypes[i].takeAnimationIndex = getAnimationFromParams(getServerData().itemTypes[i].takeAnimationName); + getServerData().itemTypes[i].giveAnimationIndex = getAnimationFromParams(getServerData().itemTypes[i].giveAnimationName); + getServerData().itemTypes[i].pickupAnimationIndex = getAnimationFromParams(getServerData().itemTypes[i].pickupAnimationName); + } + } +} + +// =========================================================================== + function cacheAllGroundItems() { getServerData().groundItemCache = []; From 13ae7a6f5a80fe9cb67bcf2588579494bf636939 Mon Sep 17 00:00:00 2001 From: Vortrex <3858226+VortrexFTW@users.noreply.github.com> Date: Thu, 6 Jan 2022 13:36:11 -0600 Subject: [PATCH 056/337] Add auto bug report for missing locale string --- scripts/server/locale.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/scripts/server/locale.js b/scripts/server/locale.js index 88c84690..59dfce4d 100644 --- a/scripts/server/locale.js +++ b/scripts/server/locale.js @@ -17,6 +17,9 @@ function initLocaleScript() { function getLocaleString(client, stringName, ...args) { let tempString = getRawLocaleString(stringName, getPlayerLocaleName(client)); + if(tempString == "") { + submitBugReport(client, `(AUTOMATED REPORT) Locale string "${stringName}" is missing for "${getPlayerLocaleName(client)}"`); + } tempString = replaceColoursInMessage(tempString); From 16d5343903ab2eaa6f55d76490fb375ec0ca42c7 Mon Sep 17 00:00:00 2001 From: Vortrex <3858226+VortrexFTW@users.noreply.github.com> Date: Thu, 6 Jan 2022 13:36:26 -0600 Subject: [PATCH 057/337] Use new forced wanted level --- scripts/client/main.js | 2 ++ scripts/client/utilities.js | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/scripts/client/main.js b/scripts/client/main.js index d673be80..7292f970 100644 --- a/scripts/client/main.js +++ b/scripts/client/main.js @@ -64,6 +64,8 @@ let vehiclePurchaseState = VRR_VEHBUYSTATE_NONE; let vehiclePurchasing = null; let vehiclePurchasePosition = null; +let forceWantedLevel = 0; + // Pre-cache all allowed skins let allowedSkins = getAllowedSkins(getGame()); diff --git a/scripts/client/utilities.js b/scripts/client/utilities.js index ceeae35a..3223ed58 100644 --- a/scripts/client/utilities.js +++ b/scripts/client/utilities.js @@ -542,7 +542,7 @@ function processWantedLevelReset() { } if(typeof localPlayer.wantedLevel != "undefined") { - localPlayer.wantedLevel = 0; + localPlayer.wantedLevel = forceWantedLevel; } } From e4744cbfa8356676adee73bc376137d3f4dfc71d Mon Sep 17 00:00:00 2001 From: Vortrex <3858226+VortrexFTW@users.noreply.github.com> Date: Thu, 6 Jan 2022 13:36:50 -0600 Subject: [PATCH 058/337] Add wanted level and forced anim net event handlers --- scripts/client/server.js | 27 ++++++++------------------- 1 file changed, 8 insertions(+), 19 deletions(-) diff --git a/scripts/client/server.js b/scripts/client/server.js index 2ac8df8b..58a45d18 100644 --- a/scripts/client/server.js +++ b/scripts/client/server.js @@ -58,6 +58,7 @@ function addAllNetworkHandlers() { addNetworkHandler("vrr.spawned", onServerSpawnedPlayer); addNetworkHandler("vrr.money", setLocalPlayerCash); addNetworkHandler("vrr.armour", setLocalPlayerArmour); + addNetworkHandler("vrr.wantedLevel", forceLocalPlayerWantedLevel); addNetworkHandler("vrr.delKeyBind", unBindAccountKey); addNetworkHandler("vrr.addKeyBind", bindAccountKey); @@ -80,6 +81,7 @@ function addAllNetworkHandlers() { addNetworkHandler("vrr.pedAnim", makePedPlayAnimation); addNetworkHandler("vrr.pedStopAnim", makePedStopAnimation); + addNetworkHandler("vrr.forcePedAnim", forcePedAnimation); addNetworkHandler("vrr.hideAllGUI", hideAllGUI); addNetworkHandler("vrr.gameScript", setGameScriptState); addNetworkHandler("vrr.clientInfo", serverRequestedClientInfo); @@ -250,25 +252,6 @@ function setElementCollisionsEnabled(elementId, state) { // =========================================================================== -function makePedStopAnimation(pedId) { - if(getElementFromId(pedId) == null) { - return false; - } - - if(getGame() == VRR_GAME_GTA_VC || getGame() == VRR_GAME_GTA_SA) { - getElementFromId(pedId).clearAnimations(); - } else { - getElementFromId(pedId).clearObjective(); - } - - if(getElementFromId(pedId) == localPlayer) { - localPlayer.collisionsEnabled = true; - setLocalPlayerControlState(true, false); - } -} - -// =========================================================================== - function setLocalPlayerPedPartsAndProps(parts, props) { for(let i in parts) { localPlayer.changeBodyPart(parts[0], parts[1], parts[2]); @@ -284,4 +267,10 @@ function setLocalPlayerArmour(armour) { } } +// =========================================================================== + +function forceLocalPlayerWantedLevel(wantedLevel) { + forceWantedLevel = toInteger(wantedLevel); +} + // =========================================================================== \ No newline at end of file From 7dc047364e9ae1f2fe28ad5c8a5f6586535d894c Mon Sep 17 00:00:00 2001 From: Vortrex <3858226+VortrexFTW@users.noreply.github.com> Date: Thu, 6 Jan 2022 13:37:13 -0600 Subject: [PATCH 059/337] Woops get flags for target client + normal header --- scripts/server/moderation.js | 28 +++++++++++++++++++++++++--- 1 file changed, 25 insertions(+), 3 deletions(-) diff --git a/scripts/server/moderation.js b/scripts/server/moderation.js index 0bb603ac..06d3a3eb 100644 --- a/scripts/server/moderation.js +++ b/scripts/server/moderation.js @@ -789,14 +789,14 @@ function getStaffFlagsCommand(command, params, client) { let serverBitFlagKeys = getServerBitFlagKeys(); for(let i in serverBitFlagKeys) { let tempFlagValue = getStaffFlagValue(serverBitFlagKeys[i]); - if(doesPlayerHaveStaffPermission(client, tempFlagValue)) { + if(doesPlayerHaveStaffPermission(targetClient, tempFlagValue)) { tempStaffFlags.push(serverBitFlagKeys[i]); } } let flagList = []; for(let i in getServerBitFlagKeys().staffFlagKeys) { - if(doesPlayerHaveStaffPermission(client, getStaffFlagValue(getServerBitFlagKeys().staffFlagKeys[i]))) { + if(doesPlayerHaveStaffPermission(targetClient, getStaffFlagValue(getServerBitFlagKeys().staffFlagKeys[i]))) { flagList.push(`{softGreen}${getServerBitFlagKeys().staffFlagKeys[i]}`); } else { flagList.push(`{softRed}${getServerBitFlagKeys().staffFlagKeys[i]}`); @@ -805,7 +805,7 @@ function getStaffFlagsCommand(command, params, client) { let chunkedList = splitArrayIntoChunks(flagList, 8); - messagePlayerInfo(client, `{clanOrange}== {jobYellow}Player Staff Flags {clanOrange}=========================`); + messagePlayeNormal(client, `{clanOrange}== {jobYellow}Staff Flags (${targetClient.name}) {clanOrange}=========================`); for(let i in chunkedList) { messagePlayerInfo(client, chunkedList[i].join("{MAINCOLOUR}, ")); @@ -983,6 +983,28 @@ function forcePlayerSkinCommand(command, params, client) { // =========================================================================== +function forcePlayerWantedLevelCommand(command, params, client) { + if(areParamsEmpty(params)) { + messagePlayerSyntax(client, getCommandSyntaxText(command)); + return false; + } + + let splitParams = params.split(" "); + let targetClient = getPlayerFromParams(splitParams[0]); + let wantedLevel = splitParams[1]; + + if(!targetClient) { + messagePlayerError(client, "That player is not connected!"); + return false; + } + + forcePlayerWantedLevel(targetClient, wantedLevel); + + //messageAdmins(`${client.name} {MAINCOLOUR}set ${getPlayerName(targetClient)}'s {MAINCOLOUR}skin to {ALTCOLOUR}${getGameData().skins[getGame()][skinIndex][1]}`); +} + +// =========================================================================== + function getAllVehiclesOwnedByPlayerCommand(command, params, client) { if(areParamsEmpty(params)) { messagePlayerSyntax(client, getCommandSyntaxText(command)); From b26b19ccc988bc564a6857feb735008ef22006bb Mon Sep 17 00:00:00 2001 From: Vortrex <3858226+VortrexFTW@users.noreply.github.com> Date: Fri, 7 Jan 2022 19:48:59 -0600 Subject: [PATCH 060/337] Add password reset GUI and processing --- config/email.json | 2 ++ scripts/client/gui/changepass.js | 3 +++ scripts/client/gui/resetpass.js | 12 ++++++++++-- scripts/server/class.js | 3 +++ scripts/server/client.js | 9 +++++++++ scripts/server/const.js | 6 +++--- 6 files changed, 30 insertions(+), 5 deletions(-) diff --git a/config/email.json b/config/email.json index 2108d842..ed2b06bf 100644 --- a/config/email.json +++ b/config/email.json @@ -11,6 +11,8 @@ }, "bodyContent": { "confirmEmail": "Welcome to {SERVERNAME}!\nPlease confirm your email by using the command /verifyemail in-game.\n\nYour verification code is: {VERIFICATIONCODE}", + "confirmPasswordReset": "You (or someone else) requested to reset your password on {SERVERNAME}!\nPlease confirm this request by entering the code below into the password reset window in-game.\n\nYour verification code is: {VERIFICATIONCODE}\n\n\nIf you did not request a password reset, then there's nothing to worry about since your password can only be reset with the code above.", + "passwordChanged": "Your password on {SERVERNAME} has been changed successfully!", "emailConfirmed": "Your email has been confirmed on {SERVERNAME}!\nYou may now use this email to reset your password, require two-factor authentication on login, receive offline notifications, and more!", "twoFactorAuthentication": "Please enter the following code to continue on {SERVERNAME} for {GAMENAME}: {2FACODE}", "accountAuthSuccessAlert": "You or someone else has successfully logged in to your account on {SERVERNAME} for {GAMENAME}.\nIP Address: {IPADDRESS}\nLocation: {LOCATION}\nTimestamp: {TIMESTAMP}", diff --git a/scripts/client/gui/changepass.js b/scripts/client/gui/changepass.js index a16a5dfe..ea820b61 100644 --- a/scripts/client/gui/changepass.js +++ b/scripts/client/gui/changepass.js @@ -158,12 +158,15 @@ function showChangePasswordGUI() { setChatWindowEnabled(false); mexui.setInput(true); passwordChange.window.shown = true; + mexui.focusedControl = passwordChange.passwordInput; + guiSubmitKey = checkChangePassword; } // =========================================================================== function passwordChangeSuccess() { logToConsole(LOG_DEBUG, `[VRR.GUI] Server reports password change was successful`); + guiSubmitKey = false; closeAllWindows(); } diff --git a/scripts/client/gui/resetpass.js b/scripts/client/gui/resetpass.js index 16767578..fa8ebb8b 100644 --- a/scripts/client/gui/resetpass.js +++ b/scripts/client/gui/resetpass.js @@ -131,7 +131,8 @@ function showResetPasswordGUI() { setChatWindowEnabled(false); mexui.setInput(true); resetPassword.window.shown = true; - + mexui.focusedControl = resetPassword.emailInput; + guiSubmitButton = checkResetPassword; showSmallGameMessage(`If you don't have a mouse cursor, press ${toUpperCase(getKeyNameFromId(disableGUIKey))} to disable GUI`, COLOUR_WHITE, 7500); } @@ -153,14 +154,21 @@ function resetPasswordFailed(errorMessage) { // =========================================================================== -function resetPasswordSuccess() { +function resetPasswordCodeStep() { logToConsole(LOG_DEBUG, `[VRR.GUI] Server reports password reset was successful`); + + resetPassword.messageLabel.text = "Check your email for a reset code"; + resetPassword.messageLabel.styles.main.textColour = toColour(180, 32, 32, 255); + resetPassword.emailInput.text = ""; + + guiSubmitKey = false; closeAllWindows(); } // =========================================================================== function switchToLoginGUI() { + guiSubmitKey = false; closeAllWindows(); showLoginGUI(); } diff --git a/scripts/server/class.js b/scripts/server/class.js index babff1e1..814ede45 100644 --- a/scripts/server/class.js +++ b/scripts/server/class.js @@ -258,6 +258,9 @@ class ClientData { this.currentAnimationPositionReturnTo = false; this.animationStart = 0; this.animationForced = false; + + this.passwordResetState = VRR_RESETPASS_STATE_NONE; + this.passwordResetCode = ""; } }; diff --git a/scripts/server/client.js b/scripts/server/client.js index cbdc980c..74e64e90 100644 --- a/scripts/server/client.js +++ b/scripts/server/client.js @@ -48,6 +48,8 @@ function addAllNetworkHandlers() { // Account addNetworkHandler("vrr.checkLogin", checkLogin); addNetworkHandler("vrr.checkRegistration", checkRegistration); + addNetworkHandler("vrr.checkResetPassword", checkAccountResetPasswordRequest); + addNetworkHandler("vrr.checkChangePassword", checkAccountChangePassword); // Developer addNetworkHandler("vrr.runCodeSuccess", clientRunCodeSuccess); @@ -288,6 +290,13 @@ function sendJobRouteStopToPlayer(client, position, colour) { // =========================================================================== +function showPlayerChangePasswordGUI(client) { + logToConsole(LOG_DEBUG, `[VRR.Client] Sending change password GUI signal to ${getPlayerDisplayForConsole(client)}`); + triggerNetworkEvent("vrr.changePassword", client); +} + +// =========================================================================== + function showPlayerLoginSuccessGUI(client) { logToConsole(LOG_DEBUG, `[VRR.Client] Sending login success GUI signal to ${getPlayerDisplayForConsole(client)}`); triggerNetworkEvent("vrr.loginSuccess", client); diff --git a/scripts/server/const.js b/scripts/server/const.js index ddd55ba2..4833f562 100644 --- a/scripts/server/const.js +++ b/scripts/server/const.js @@ -292,9 +292,9 @@ const VRR_2FA_STATE_CODEINPUT = 1; // Waiting on player to enter c const VRR_2FA_STATE_SETUP_CODETOAPP = 2; // Providing player with a code to put in their auth app const VRR_2FA_STATE_SETUP_CODEFROMAPP = 3; // Waiting on player to enter code from auth app to set up -const VRR_FORGOTPASS_STATE_NONE = 0; // None -const VRR_FORGOTPASS_STATE_CODEINPUT = 1; // Waiting on player to enter code sent via email -const VRR_FORGOTPASS_STATE_SETPASS = 2; // Waiting on player to enter new password +const VRR_RESETPASS_STATE_NONE = 0; // None +const VRR_RESETPASS_STATE_CODEINPUT = 1; // Waiting on player to enter code sent via email +const VRR_RESETPASS_STATE_SETPASS = 2; // Waiting on player to enter new password const VRR_NPC_COND_MATCH_NONE = 0; // None (invalid) const VRR_NPC_COND_MATCH_EQ = 1; // Must be equal to From 83b7af4fde1af4b710df42dcbb82493d58c8bdf6 Mon Sep 17 00:00:00 2001 From: Vortrex <3858226+VortrexFTW@users.noreply.github.com> Date: Fri, 7 Jan 2022 19:50:04 -0600 Subject: [PATCH 061/337] GUI style changes and key press handling --- scripts/client/event.js | 1 + scripts/client/gui.js | 113 +++++++++++++++++++++++-------- scripts/client/gui/2fa.js | 2 + scripts/client/gui/charselect.js | 22 +++--- scripts/client/gui/error.js | 2 +- scripts/client/gui/info.js | 2 +- scripts/client/gui/login.js | 19 ++++-- scripts/client/gui/newchar.js | 20 +++--- scripts/client/gui/register.js | 4 +- scripts/client/gui/yesno.js | 4 +- 10 files changed, 126 insertions(+), 63 deletions(-) diff --git a/scripts/client/event.js b/scripts/client/event.js index d62e331e..76a2d258 100644 --- a/scripts/client/event.js +++ b/scripts/client/event.js @@ -102,6 +102,7 @@ function onProcess(event, deltaTime) { function onKeyUp(event, keyCode, scanCode, keyModifiers) { processSkinSelectKeyPress(keyCode); //processKeyDuringAnimation(); + processGUIKeyPress(keyCode); } // =========================================================================== diff --git a/scripts/client/gui.js b/scripts/client/gui.js index 4cdc7bc7..8d0c8852 100644 --- a/scripts/client/gui.js +++ b/scripts/client/gui.js @@ -28,6 +28,12 @@ let textInputAlpha = 180; let guiReady = false; +let guiSubmitKey = false; +let guiLeftKey = false; +let guiRightKey = false; +let guiUpKey = false; +let guiDownKey = false; + // =========================================================================== let placesOfOrigin = [ @@ -70,10 +76,10 @@ function initGUI() { initInfoDialogGUI(); initErrorDialogGUI(); initYesNoDialogGUI(); - initResetPasswordGUI(); - initChangePasswordGUI(); initTwoFactorAuthenticationGUI(); initListGUI(); + initResetPasswordGUI(); + initChangePasswordGUI(); closeAllWindows(); guiReady = true; @@ -98,47 +104,64 @@ let closeAllWindows = function() { resetPassword.window.shown = false; passwordChange.window.shown = false; mexui.setInput(false); + mexui.focusedControl = false; + + guiSubmitKey = false; + guiLeftKey = false; + guiRightKey = false; + guiUpKey = false; + guiDownKey = false; } // =========================================================================== let isAnyGUIActive = function() { if(!guiReady) { - if(infoDialog.window.shown) { - return true; - } + return false; + } - if(yesNoDialog.window.shown) { - return true; - } + if(infoDialog.window.shown == true) { + return true; + } - if(errorDialog.window.shown) { - return true; - } + if(yesNoDialog.window.shown == true) { + return true; + } - if(register.window.shown) { - return true; - } + if(errorDialog.window.shown == true) { + return true; + } - if(login.window.shown) { - return true; - } + if(register.window.shown == true) { + return true; + } - if(newCharacter.window.shown) { - return true; - } + if(login.window.shown == true) { + return true; + } - if(characterSelect.window.shown) { - return true; - } + if(newCharacter.window.shown == true) { + return true; + } - if(twoFactorAuth.window.shown) { - return true; - } + if(characterSelect.window.shown == true) { + return true; + } - if(listDialog.window.shown) { - return true; - } + if(twoFactorAuth.window.shown == true) { + return true; + } + + if(listDialog.window.shown == true) { + return true; + } + + if(resetPassword.window.shown == true) { + return true; + } + + if(passwordChange.window.shown == true) { + return true; } return false; @@ -224,6 +247,13 @@ addNetworkHandler("vrr.newCharacterFailed", function(errorMessage) { // =========================================================================== +addNetworkHandler("vrr.changePassword", function() { + logToConsole(LOG_DEBUG, `[VRR.GUI] Received signal to change password from server`); + showChangePasswordGUI(); +}); + +// =========================================================================== + addNetworkHandler("vrr.guiColour", function(red1, green1, blue1, red2, green2, blue2, red3, green3, blue3) { logToConsole(LOG_DEBUG, `[VRR.GUI] Received new GUI colours from server: ${red1}, ${green1}, ${blue1} / ${red2}, ${green2}, ${blue2} / ${red3}, ${green3}, ${blue3}`); primaryColour = [red1, green1, blue1]; @@ -247,6 +277,29 @@ addNetworkHandler("vrr.guiInit", function() { function hideAllGUI() { closeAllWindows(); setChatWindowEnabled(true); + guiSubmitKey = false; } -// =========================================================================== \ No newline at end of file +// =========================================================================== + +function processGUIKeyPress(keyCode) { + if(!isAnyGUIActive()) { + return false; + } + + if(keyCode == SDLK_RETURN || keyCode == SDLK_RETURN2) { + if(guiSubmitKey != false) { + guiSubmitKey(); + } + } else if(keyCode == SDLK_LEFT) { + if(guiLeftKey != false) { + guiLeftKey(); + } + } else if(keyCode == SDLK_RIGHT) { + if(guiRightKey != false) { + guiRightKey(); + } + } +} + +// =========================================================================== diff --git a/scripts/client/gui/2fa.js b/scripts/client/gui/2fa.js index 16c092c2..986ebe90 100644 --- a/scripts/client/gui/2fa.js +++ b/scripts/client/gui/2fa.js @@ -105,6 +105,8 @@ function showTwoFactorAuthGUI() { setChatWindowEnabled(false); mexui.setInput(true); twoFactorAuth.window.shown = true; + mexui.focusedControl = twoFactorAuth.codeInput; + guiSubmitKey = checkTwoFactorAuth; } // =========================================================================== diff --git a/scripts/client/gui/charselect.js b/scripts/client/gui/charselect.js index f7b7ea1d..6a5b5241 100644 --- a/scripts/client/gui/charselect.js +++ b/scripts/client/gui/charselect.js @@ -29,16 +29,16 @@ function initCharacterSelectGUI() { 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), + textSize: 0.0, + textColour: toColour(0, 0, 0, 0), }, icon: { textSize: 0.0, textColour: toColour(0, 0, 0, 0), - backgroundColour: toColour(0, 0, 0, 0), - } + }, }); + characterSelect.window.titleBarIconSize = toVector2(0,0); + characterSelect.window.titleBarHeight = 0; characterSelect.nameText = characterSelect.window.text(5, 40, 200, 25, 'Lastname, Firstname', { main: { @@ -88,7 +88,7 @@ function initCharacterSelectGUI() { } }); - characterSelect.selectCharacterButton = characterSelect.window.button(85, 130, 260, 25, 'SELECT', { + characterSelect.selectCharacterButton = characterSelect.window.button(85, 130, 260, 25, 'PLAY', { main: { backgroundColour: toColour(primaryColour[0], primaryColour[1], primaryColour[2], buttonAlpha), textColour: toColour(primaryTextColour[0], primaryTextColour[1], primaryTextColour[2], 255), @@ -168,12 +168,7 @@ function showCharacterSelectGUI(firstName, lastName, cash, clan, lastPlayed, ski function showNewCharacter() { closeAllWindows(); logToConsole(LOG_DEBUG, `[VRR.GUI] Showing new character dialog window`); - setChatWindowEnabled(false); - mexui.setInput(true); - setHUDEnabled(false); - newCharacter.window.shown = true; - - showSmallGameMessage(`If you don't have a mouse cursor, press ${toUpperCase(getKeyNameFromId(disableGUIKey))} to disable GUI`, COLOUR_WHITE, 7500); + showNewCharacterGUI(); } // =========================================================================== @@ -209,6 +204,9 @@ function switchCharacterSelectGUI(firstName, lastName, cash, clan, lastPlayed, s characterSelect.lastPlayedText.text = `Last Played: ${lastPlayed}`; characterSelect.skinImage = characterSelect.window.image(310, 32, 100, 90, "files/images/skins/none.png"); characterSelect.window.shown = true; + guiSubmitKey = selectThisCharacter; + guiLeftKey = selectPreviousCharacter; + guiRightKey = selectNextCharacter; } // =========================================================================== diff --git a/scripts/client/gui/error.js b/scripts/client/gui/error.js index d26f90d0..529701bc 100644 --- a/scripts/client/gui/error.js +++ b/scripts/client/gui/error.js @@ -46,7 +46,7 @@ function initErrorDialogGUI() { }, }); - errorDialog.okayButton = errorDialog.window.button(20, 95, 360, 30, 'OK', { + errorDialog.okayButton = errorDialog.window.button(5, 105, 395, 30, 'OK', { main: { backgroundColour: toColour(primaryColour[0], primaryColour[1], primaryColour[2], buttonAlpha), textColour: toColour(primaryTextColour[0], primaryTextColour[1], primaryTextColour[2], 255), diff --git a/scripts/client/gui/info.js b/scripts/client/gui/info.js index 1a958849..611de94a 100644 --- a/scripts/client/gui/info.js +++ b/scripts/client/gui/info.js @@ -45,7 +45,7 @@ function initInfoDialogGUI() { }, }); - infoDialog.okayButton = infoDialog.window.button(20, 95, 360, 30, 'OK', { + infoDialog.okayButton = infoDialog.window.button(5, 105, 395, 30, 'OK', { main: { backgroundColour: toColour(primaryColour[0], primaryColour[1], primaryColour[2], buttonAlpha), textColour: toColour(primaryTextColour[0], primaryTextColour[1], primaryTextColour[2], 255), diff --git a/scripts/client/gui/login.js b/scripts/client/gui/login.js index 9b72ee14..709ea025 100644 --- a/scripts/client/gui/login.js +++ b/scripts/client/gui/login.js @@ -96,8 +96,7 @@ function initLoginGUI() { }, }, checkLogin); - /* - login.forgotPasswordButton = login.window.button(200, 240, 60, 15, 'FORGOT PASSWORD', { + login.forgotPasswordButton = login.window.button(200, 240, 60, 15, 'RESET PASS', { main: { backgroundColour: toColour(primaryColour[0], primaryColour[1], primaryColour[2], buttonAlpha), textColour: toColour(0, 0, 0, 255), @@ -110,7 +109,7 @@ function initLoginGUI() { }, }, switchToPasswordResetGUI); - login.resetPasswordLabel = login.window.text(20, 140, 60, 15, 'Need to reset your password? Click here >', { + login.resetPasswordLabel = login.window.text(20, 140, 60, 15, 'Forgot your password?', { main: { textSize: 8.0, textAlign: 1.0, @@ -121,7 +120,6 @@ function initLoginGUI() { borderColour: toColour(0, 0, 0, 0), }, }); - */ logToConsole(LOG_DEBUG, `[VRR.GUI] Created login GUI`); } @@ -134,7 +132,8 @@ function showLoginGUI() { setChatWindowEnabled(false); mexui.setInput(true); login.window.shown = true; - + mexui.focusedControl = login.passwordInput; + guiSubmitKey = checkLogin; showSmallGameMessage(`If you don't have a mouse cursor, press ${toUpperCase(getKeyNameFromId(disableGUIKey))} to disable GUI`, COLOUR_WHITE, 7500); } @@ -158,7 +157,15 @@ function loginFailed(errorMessage) { function loginSuccess() { logToConsole(LOG_DEBUG, `[VRR.GUI] Server reports login was successful`); + guiSubmitKey = false; closeAllWindows(); } -// =========================================================================== \ No newline at end of file +// =========================================================================== + +function switchToPasswordResetGUI() { + closeAllWindows(); + logToConsole(LOG_DEBUG, `[VRR.GUI] Showing password reset dialog window`); + showResetPasswordGUI(); + return false; +} \ No newline at end of file diff --git a/scripts/client/gui/newchar.js b/scripts/client/gui/newchar.js index 07f0c7c9..81179e1c 100644 --- a/scripts/client/gui/newchar.js +++ b/scripts/client/gui/newchar.js @@ -26,16 +26,14 @@ function initNewCharacterGUI() { backgroundColour: toColour(secondaryColour[0], secondaryColour[1], secondaryColour[2], windowAlpha), transitionTime: 500, }, - title: { - textSize: 0.0, - textColour: toColour(0, 0, 0, 0), - backgroundColour: toColour(primaryColour[0], primaryColour[1], primaryColour[2], windowTitleAlpha), - }, - icon: { - textSize: 0.0, - textColour: toColour(0, 0, 0, 0), - backgroundColour: toColour(primaryColour[0], primaryColour[1], primaryColour[2], windowTitleAlpha), - } + title: { + textSize: 0.0, + textColour: toColour(0, 0, 0, 0), + }, + icon: { + textSize: 0.0, + textColour: toColour(0, 0, 0, 0), + }, }); newCharacter.window.titleBarIconSize = toVector2(0,0); newCharacter.window.titleBarHeight = 0; @@ -157,6 +155,8 @@ function showNewCharacterGUI() { setChatWindowEnabled(false); mexui.setInput(true); newCharacter.window.shown = true; + mexui.focusedInput = newCharacter.firstNameInput; + guiSubmitButton = checkNewCharacter; } // =========================================================================== \ No newline at end of file diff --git a/scripts/client/gui/register.js b/scripts/client/gui/register.js index 62900123..f8792037 100644 --- a/scripts/client/gui/register.js +++ b/scripts/client/gui/register.js @@ -158,7 +158,8 @@ function showRegistrationGUI() { setChatWindowEnabled(false); mexui.setInput(true); register.window.shown = true; - + mexui.focusedControl = register.passwordInput; + guiSubmitKey = checkRegistration; showSmallGameMessage(`If you don't have a mouse cursor, press ${toUpperCase(getKeyNameFromId(disableGUIKey))} to disable GUI`, COLOUR_WHITE, 7500); } @@ -166,6 +167,7 @@ function showRegistrationGUI() { function registrationSuccess() { logToConsole(LOG_DEBUG, `[VRR.GUI] Server reports registration was successful`); + guiSubmitKey = false; closeAllWindows(); } diff --git a/scripts/client/gui/yesno.js b/scripts/client/gui/yesno.js index 4d7b2c10..131501d5 100644 --- a/scripts/client/gui/yesno.js +++ b/scripts/client/gui/yesno.js @@ -48,7 +48,7 @@ function initYesNoDialogGUI() { }, }); - yesNoDialog.yesButton = yesNoDialog.window.button(20, 95, 175, 30, 'YES', { + yesNoDialog.yesButton = yesNoDialog.window.button(5, 105, 197, 30, 'YES', { main: { backgroundColour: toColour(primaryColour[0], primaryColour[1], primaryColour[2], buttonAlpha), textColour: toColour(primaryTextColour[0], primaryTextColour[1], primaryTextColour[2], 255), @@ -61,7 +61,7 @@ function initYesNoDialogGUI() { }, }, yesNoDialogAnswerYes); - yesNoDialog.noButton = yesNoDialog.window.button(205, 95, 175, 30, 'NO', { + yesNoDialog.noButton = yesNoDialog.window.button(207, 105, 197, 30, 'NO', { main: { backgroundColour: toColour(primaryColour[0], primaryColour[1], primaryColour[2], buttonAlpha), textColour: toColour(primaryTextColour[0], primaryTextColour[1], primaryTextColour[2], 255), From 1a6d70b0fcb1b3c7cfc13da0d35904c0b59440ef Mon Sep 17 00:00:00 2001 From: Vortrex <3858226+VortrexFTW@users.noreply.github.com> Date: Fri, 7 Jan 2022 19:50:20 -0600 Subject: [PATCH 062/337] Fix anim when shot by tazer --- scripts/server/item/tazer.js | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/scripts/server/item/tazer.js b/scripts/server/item/tazer.js index ee43a326..799b9501 100644 --- a/scripts/server/item/tazer.js +++ b/scripts/server/item/tazer.js @@ -20,13 +20,15 @@ function tazePlayer(client) { setPlayerControlState(client, false); let animationId = getAnimationFromParams("tazed"); - forcePedAnimation(client.player, animationId); + if(animationId != false) { + forcePedAnimation(client.player, animationId); - getPlayerData(client).currentAnimation = animationId; - getPlayerData(client).currentAnimationPositionOffset = toVector3(0.0, 0.0, 0.0); - getPlayerData(client).currentAnimationPositionReturnTo = getPlayerPosition(client); - getPlayerData(client).animationStart = getCurrentUnixTimestamp(); - getPlayerData(client).animationForced = true; + getPlayerData(client).currentAnimation = animationId; + getPlayerData(client).currentAnimationPositionOffset = toVector3(0.0, 0.0, 0.0); + getPlayerData(client).currentAnimationPositionReturnTo = getPlayerPosition(client); + getPlayerData(client).animationStart = getCurrentUnixTimestamp(); + getPlayerData(client).animationForced = true; + } setTimeout(function() { unTazePlayer(client); From ac7e16cac1b86a58c3dc0d8c453e57b34ad4f874 Mon Sep 17 00:00:00 2001 From: Vortrex <3858226+VortrexFTW@users.noreply.github.com> Date: Fri, 7 Jan 2022 19:50:32 -0600 Subject: [PATCH 063/337] Fix stopanim tip locale msg --- scripts/server/animation.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/server/animation.js b/scripts/server/animation.js index f0a9c44c..b206b30c 100644 --- a/scripts/server/animation.js +++ b/scripts/server/animation.js @@ -40,8 +40,8 @@ function playPlayerAnimationCommand(command, params, client) { return false; } - messagePlayerTip(client, getLocaleString(client, "AnimationStopCommandTip")); - makePlayerPlayAnimation(getPlayerData(client).ped, animationSlot, animationPositionOffset); + messagePlayerTip(client, getLocaleString(client, "AnimationStopCommandTip", "{ALTCOLOUR}/stopanim{MAINCOLOUR}")); + makePlayerPlayAnimation(client, animationSlot, animationPositionOffset); } // =========================================================================== From 000d312d217e79ff824a59cdefd6fd3819cf970e Mon Sep 17 00:00:00 2001 From: Vortrex <3858226+VortrexFTW@users.noreply.github.com> Date: Fri, 7 Jan 2022 19:50:47 -0600 Subject: [PATCH 064/337] Account stuff --- scripts/server/account.js | 72 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 71 insertions(+), 1 deletion(-) diff --git a/scripts/server/account.js b/scripts/server/account.js index 69889b35..25f28700 100644 --- a/scripts/server/account.js +++ b/scripts/server/account.js @@ -36,7 +36,7 @@ function toggleAutoLoginByIPCommand(command, params, client) { if(hasBitFlag(getPlayerData(client).accountData.settings, flagValue)) { getPlayerData(client).accountData.settings = removeBitFlag(getPlayerData(client).accountData.settings, flagValue); - messagePlayerSuccess(client, getLocaleString(client, "AutomaticLoginIP", `{softRed}${toUpperCase(getLocaleString(client, "Off"))}`)); + messagePlayerSuccess(client, getLocaleString(client, "AutomaticLoginIPToggle", `{softRed}${toUpperCase(getLocaleString(client, "Off"))}`)); } else { getPlayerData(client).accountData.settings = addBitFlag(getPlayerData(client).accountData.settings, flagValue); messagePlayerSuccess(client, getLocaleString(client, "AutomaticLoginIPToggle", `{softGreen}${toUpperCase(getLocaleString(client, "On"))}`)); @@ -939,6 +939,66 @@ function checkRegistration(client, password, confirmPassword = "", emailAddress // =========================================================================== +function checkAccountResetPasswordRequest(client, inputText) { + if(getPlayerData(client).passwordResetState == VRR_RESETPASS_STATE_NONE) { + if(toLowerCase(getPlayerData(client).accountData.emailAddress) != toLowerCase(inputText)) { + return false; + } + + let passwordResetCode = generateEmailVerificationCode(); + getPlayerData(client).passwordResetState = VRR_RESETPASS_STATE_CODEINPUT; + getPlayerData(client).passwordResetCode = passwordResetCode; + sendPasswordResetEmail(getPlayerData(client).accountData.emailAddress, passwordResetCode); + } else if(getPlayerData(client).passwordResetState == VRR_RESETPASS_STATE_CODEINPUT) { + if(getPlayerData(client).passwordResetCode == inputText) { + getPlayerData(client).passwordResetState = VRR_RESETPASS_STATE_SETPASS; + showChangePasswordGUI(client); + } else { + getPlayerData(client).passwordResetState = VRR_RESETPASS_STATE_NONE; + client.disconnect(); + } + } + + return false; +} + +// =========================================================================== + +function checkAccountChangePassword(client, oldPassword, newPassword, confirmNewPassword) { + if(!isPlayerLoggedIn(client)) { + if(getPlayerData(client).passwordResetState != VRR_RESETPASS_STATE_SETPASS) { + //getPlayerData(client).passwordResetState = VRR_RESETPASS_STATE_NONE; + //client.disconnect(); + return false; + } + } + + if(isAccountPasswordCorrect(getPlayerData(client).accountData, hashAccountPassword(getPlayerName(client), oldPassword))) { + messagePlayerError(client, `The old password is incorrect!`); + return false; + } + + if(!doesPasswordMeetRequirements(newPassword)) { + messagePlayerError(client, `The new password must meet the requirements!`); + messagePlayerInfo(client, `Passwords must have at least one capital letter, one lowercase letter, and one number!`); + return false; + } + + if(newPassword != confirmNewPassword) { + messagePlayerError(client, `The new password and confirm new password aren't the same!`); + return false; + } + + getPlayerData(client).accountData.password = hashAccountPassword(getPlayerData(client).accountData.name, params); + messagePlayerSuccess(client, `Your password has been changed!`); + + if(getPlayerData(client).passwordResetState == VRR_RESETPASS_STATE_SETPASS) { + getPlayerData(client).passwordResetState = VRR_RESETPASS_STATE_NONE; + } +} + +// =========================================================================== + function isValidEmailAddress(emailAddress) { return true; } @@ -1278,6 +1338,16 @@ function sendEmailVerificationEmail(client, emailVerificationCode) { // =========================================================================== +function sendPasswordResetEmail(client, verificationCode) { + let emailBodyText = getEmailConfig().bodyContent.confirmPasswordReset; + emailBodyText = emailBodyText.replace("{VERIFICATIONCODE}", verificationCode); + emailBodyText = emailBodyText.replace("{SERVERNAME}", getServerName()); + + sendEmail(getPlayerData(client).accountData.emailAddress, getPlayerData(client).accountData.name, `Reset your password on ${getServerName()}`, emailBodyText); +} + +// =========================================================================== + function verifyAccountEmail(accountData, verificationCode) { let emailVerificationCode = generateRandomString(10); From ce3e09575e0022f00d6c859aaecce2a67c4826d4 Mon Sep 17 00:00:00 2001 From: Vortrex <3858226+VortrexFTW@users.noreply.github.com> Date: Fri, 7 Jan 2022 19:51:19 -0600 Subject: [PATCH 065/337] Fix can use keybind util --- scripts/client/keybind.js | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/scripts/client/keybind.js b/scripts/client/keybind.js index edbb18b7..5a8a4aaa 100644 --- a/scripts/client/keybind.js +++ b/scripts/client/keybind.js @@ -62,7 +62,19 @@ function hasKeyBindDelayElapsed() { // =========================================================================== function canLocalPlayerUseKeyBinds() { - return true; //(!usingSkinSelector && isSpawned && !itemActionDelayEnabled); + if(isAnyGUIActive()) { + return false; + } + + if(!isSpawned) { + return false; + } + + if(itemActionDelayEnabled) { + return false; + } + + return true; } // =========================================================================== From 5e146224a5f8e407668d3576cf7fee44eb4e50d2 Mon Sep 17 00:00:00 2001 From: Vortrex <3858226+VortrexFTW@users.noreply.github.com> Date: Fri, 7 Jan 2022 19:51:45 -0600 Subject: [PATCH 066/337] Freeze player in skin-select and control state util --- scripts/client/skin-select.js | 14 ++------------ scripts/client/utilities.js | 11 ++++++----- 2 files changed, 8 insertions(+), 17 deletions(-) diff --git a/scripts/client/skin-select.js b/scripts/client/skin-select.js index 42bf3b8a..13093a82 100644 --- a/scripts/client/skin-select.js +++ b/scripts/client/skin-select.js @@ -111,20 +111,10 @@ function toggleSkinSelect(state) { localPlayer.skin = allowedSkins[skinSelectorIndex][0]; skinSelectMessageTextTop = allowedSkins[skinSelectorIndex][1]; - gui.showCursor(true, false); - //localPlayer.invincible = true; - //localPlayer.setProofs(true, true, true, true, true); - localPlayer.collisionsEnabled = false; - + setLocalPlayerControlState(false, false); } else { usingSkinSelector = false; - //game.restoreCamera(true); - gui.showCursor(false, true); - if(localPlayer) { - //localPlayer.invincible = false; - //localPlayer.setProofs(false, false, false, false, false); - localPlayer.collisionsEnabled = true; - } + setLocalPlayerControlState(false, false); } } diff --git a/scripts/client/utilities.js b/scripts/client/utilities.js index 3223ed58..dd363cbe 100644 --- a/scripts/client/utilities.js +++ b/scripts/client/utilities.js @@ -184,11 +184,12 @@ function setLocalPlayerFrozenState(state) { function setLocalPlayerControlState(controlState, cursorState = false) { logToConsole(LOG_DEBUG, `[VRR.Utilities] Setting control state to ${controlState} (Cursor: ${cursorState})`); controlsEnabled = controlState; - //localPlayer.invincible = true; - //if(getGame() != VRR_GAME_GTA_IV) { - // localPlayer.collisionsEnabled = controlState; - // localPlayer.invincible = false; - //} + if(getGame() == VRR_GAME_GTA_III || getGame() == VRR_GAME_GTA_VC) { + game.SET_PLAYER_CONTROL(localClient.index, boolToInt(controlState)); + } + + localPlayer.collisionsEnabled = controlState; + localPlayer.invincible = true; } // =========================================================================== From c2ab9a9b20b97f020cc14e9813f577605e59e301 Mon Sep 17 00:00:00 2001 From: Vortrex <3858226+VortrexFTW@users.noreply.github.com> Date: Sun, 9 Jan 2022 05:20:47 -0600 Subject: [PATCH 067/337] Create accents config --- config/accents.json | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 config/accents.json diff --git a/config/accents.json b/config/accents.json new file mode 100644 index 00000000..2b5cb10f --- /dev/null +++ b/config/accents.json @@ -0,0 +1,26 @@ +[ + "English", + "French", + "Russian", + "Scottish", + "Irish", + "Spanish", + "Southern American", + "Italian", + "Australian", + "Jamaican", + "Israeli", + "Dutch", + "Brazilian", + "Portuguese", + "German", + "Canadian", + "Chinese", + "Japanese", + "Turkish", + "Korean", + "Estonian", + "Sicilian", + "Indian", + "Rough" +] \ No newline at end of file From 906a7e30ff075d84cba0d8cc610260471b1a22ca Mon Sep 17 00:00:00 2001 From: Vortrex <3858226+VortrexFTW@users.noreply.github.com> Date: Sun, 9 Jan 2022 05:21:08 -0600 Subject: [PATCH 068/337] Move newest email body contents to bottom --- config/email.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/config/email.json b/config/email.json index ed2b06bf..d4ca4a43 100644 --- a/config/email.json +++ b/config/email.json @@ -11,12 +11,12 @@ }, "bodyContent": { "confirmEmail": "Welcome to {SERVERNAME}!\nPlease confirm your email by using the command /verifyemail in-game.\n\nYour verification code is: {VERIFICATIONCODE}", - "confirmPasswordReset": "You (or someone else) requested to reset your password on {SERVERNAME}!\nPlease confirm this request by entering the code below into the password reset window in-game.\n\nYour verification code is: {VERIFICATIONCODE}\n\n\nIf you did not request a password reset, then there's nothing to worry about since your password can only be reset with the code above.", - "passwordChanged": "Your password on {SERVERNAME} has been changed successfully!", "emailConfirmed": "Your email has been confirmed on {SERVERNAME}!\nYou may now use this email to reset your password, require two-factor authentication on login, receive offline notifications, and more!", "twoFactorAuthentication": "Please enter the following code to continue on {SERVERNAME} for {GAMENAME}: {2FACODE}", "accountAuthSuccessAlert": "You or someone else has successfully logged in to your account on {SERVERNAME} for {GAMENAME}.\nIP Address: {IPADDRESS}\nLocation: {LOCATION}\nTimestamp: {TIMESTAMP}", "accountAuthFailAlert": "You or someone else has failed to login to your account on {SERVERNAME} for {GAMENAME}.\nIP Address: {IPADDRESS}\nLocation: {LOCATION}\nTimestamp: {TIMESTAMP}", - "offlineMessageAlert": "You have received a private message on {SERVERNAME} for {GAMENAME}. \nYou are receiving this notification because you enabled email message notifications when you're not connected to the server.\nFrom: {FROMNAME}\nTimestamp: {TIMESTAMP}\nMessage: {MESSAGE}" + "offlineMessageAlert": "You have received a private message on {SERVERNAME} for {GAMENAME}. \nYou are receiving this notification because you enabled email message notifications when you're not connected to the server.\nFrom: {FROMNAME}\nTimestamp: {TIMESTAMP}\nMessage: {MESSAGE}", + "confirmPasswordReset": "You (or someone else) requested to reset your password on {SERVERNAME}!\nPlease confirm this request by entering the code below into the password reset window in-game.\n\nYour verification code is: {VERIFICATIONCODE}\n\n\nIf you did not request a password reset, then there's nothing to worry about since your password can only be reset with the code above.", + "passwordChanged": "Your password on {SERVERNAME} has been changed successfully!" } } \ No newline at end of file From b2b61e02fc45520b28dd53abffe57b216a222ac8 Mon Sep 17 00:00:00 2001 From: Vortrex <3858226+VortrexFTW@users.noreply.github.com> Date: Sun, 9 Jan 2022 05:21:17 -0600 Subject: [PATCH 069/337] Remove insert default keybind --- config/keybind.json | 5 ----- 1 file changed, 5 deletions(-) diff --git a/config/keybind.json b/config/keybind.json index 784f928b..2eb9a14f 100644 --- a/config/keybind.json +++ b/config/keybind.json @@ -104,11 +104,6 @@ "keyName": "9", "commandString": "item 9", "keyState": 1 - }, - { - "keyName": "insert", - "commandString": "gui", - "keyState": 1 } ] } \ No newline at end of file From a5de7b59a70e078c06c11e39aeb7d5ffb3cf21eb Mon Sep 17 00:00:00 2001 From: Vortrex <3858226+VortrexFTW@users.noreply.github.com> Date: Sun, 9 Jan 2022 05:21:29 -0600 Subject: [PATCH 070/337] Remove unused roleplay config --- config/roleplay.json | 56 -------------------------------------------- 1 file changed, 56 deletions(-) delete mode 100644 config/roleplay.json diff --git a/config/roleplay.json b/config/roleplay.json deleted file mode 100644 index cc6f63bf..00000000 --- a/config/roleplay.json +++ /dev/null @@ -1,56 +0,0 @@ -{ - "defaultStreamingRadioVolume": 50, - "npcFarProximity": 100, - "npcMediumProximity": 40, - "npcCloseProximity": 12, - "meActionDistance": 20, - "doActionDistance": 15, - "shoutDistance": 30, - "talkDistance": 10, - "whisperDistance": 2, - "megaphoneDistance": 40, - "vehicleLockDistance": 5, - "startWorkingDistance": 5, - "takeJobDistance": 5, - "stopWorkingDistance": 10, - "spawnCarDistance": 5, - "payAndSprayDistance": 5, - "exitPropertyDistance": 3.0, - "enterPropertyDistance": 3.0, - "businessDimensionStart": 5000, - "houseDimensionStart": 100, - "buyVehicleDriveAwayDistance": 25.0, - "returnToJobVehicleTime": 30, - "walkieTalkieSpeakerDistance": 10, - "walkieTalkieTalkDistance": 10, - "phoneSpeakerDistance": 10, - "phoneTalkDistance": 10, - "tazerEffectDuration": 15000, - "subAccountNameAllowedCharacters": "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz", - "accents": [ - "English", - "French", - "Russian", - "Scottish", - "Irish", - "Spanish", - "Southern American", - "Italian", - "Australian", - "Jamaican", - "Israeli", - "Dutch", - "Brazilian", - "Portuguese", - "German", - "Canadian", - "Chinese", - "Japanese", - "Turkish", - "Korean", - "Estonian", - "Sicilian", - "Indian", - "Rough" - ] -} \ No newline at end of file From ed1b8331acebd4abdffa5f59641c73b82a2626ff Mon Sep 17 00:00:00 2001 From: Vortrex <3858226+VortrexFTW@users.noreply.github.com> Date: Sun, 9 Jan 2022 05:21:40 -0600 Subject: [PATCH 071/337] Add a lot of strings for locale --- locale/english.json | 66 +++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 64 insertions(+), 2 deletions(-) diff --git a/locale/english.json b/locale/english.json index 2f91621d..f4d54b29 100644 --- a/locale/english.json +++ b/locale/english.json @@ -38,5 +38,67 @@ "True": "True", "False": "False", "Locked": "Locked", - "Unlocked": "Unlocked" -} \ No newline at end of file + "Unlocked": "Unlocked", + "PasswordNotGoodEnough": "The new password must meet the requirements!", + "PasswordNeedsBase": "Passwords must have at least {1}", + "PasswordNeedsCapitals": "{1} capital letters", + "PasswordNeedsNumbers": "{1} numbers", + "PasswordNeedsSymbols": "{1} symbols", + "PasswordsDontMatch": "The new password and confirm new password aren't the same!", + "PasswordChanged": "Your password has been changed!", + "AutoLoggedInIP": "You have been automatically logged in by IP!", + "WelcomeBack": "Welcome back to {1}, {2}! Please /login to continue.", + "WelcomeNewPlayer": "Welcome to {1}, {2}! Please /register to play.", + "InvalidPlayer": "Job not found!", + "InvalidBusiness": "Business not found!", + "InvalidHouse": "House not found!", + "InvalidVehicle": "Vehicle not found!", + "InvalidClan": "Clan not found!", + "InvalidClanRank": "Clan rank not found!", + "InvalidJob": "Job not found!", + "InvalidItem": "Item not found!", + "InvalidItemType": "Item type not found!", + "InvalidRadioStation": "Radio station not found!", + "EntersProperty": "opens the door and enters the {1}", + "ExitsProperty": "opens the door and exits the {1}", + "EnterExitPropertyDoorLocked": "tries to open the {1} door but fails because it's locked", + "PropertyNoInterior": "This {1} does not have an interior, but you can still use commands at the door icon.", + "NoBusinessWithItemType": "There is no business with that item available", + "HeaderKeyBinds": "Key Binds", + "HeaderAccountHelp": "Account Help", + "HeaderVehicleHelp": "Vehicle Help", + "HeaderVehicleDealerships": "Vehicle Dealership Help", + "HeaderJobHelp": "Job Help", + "HeaderChatHelp": "Chat Help", + "HeaderServerRules": "Server Rules", + "HeaderWebsiteInfo": "Website", + "HeaderDiscordInfo": "Discord", + "HeaderAnimationsList": "Animation List", + "HeaderPayAndSprayHelp": "Pay and Spray Help", + "HeaderAmmunationHelp": "Ammunation Help", + "HeaderVehicleTuneupHelp": "Vehicle Tune Help", + "HeaderBindableKeysHelp": "Bindable Keys", + "HeaderSkinHelp": "Clothes/Skin Help", + "HeaderBusinessHelp": "Business Help", + "HeaderClanHelp": "Clan Help", + "HeaderPlayerVehiclesList": "Player Vehicles ({1})", + "HeaderPlayerBusinessesList": "Player Businesses ({1})", + "HeaderClansList": "Clan List", + "HeaderAdminsList": "Admin List", + "HeaderBadgeInfo": "Badge Information", + "HeaderAccentsList": "Accent List", + "HeaderPlayerInfo": "Player Information ({1})", + "HeaderWealthandTaxHelp": "Wealth and Tax Information", + "HeaderCommandInfo": "Command Information ({1})", + "HeaderRadioHelp": "Radio Help", + "HeaderRadioStationsList": "Radio Stations", + "RadioVolumeChanged": "{1} You changed your streaming radio volume to {2}%", + "VolumeLevelNotNumber": "The volume level must a number", + "RadioStationLocationInvalid": "You must be in a vehicle, house, or business or have a personal device to change the station!", + "ActionBusinessRadioStationChange": "changes the business radio station to {1} ({2})", + "ActionHouseRadioStationChange": "changes the house radio station to {1} ({2})", + "ActionVehicleRadioStationChange": "changes the vehicle radio station to {1} ({2})", + "ActionItemRadioStationChange": "changes the {1}'s station to {2} ({3})", + "RandomVehicleCommandsDisabled": "This is a random traffic vehicle and commands can't be used for it.", + "RandomVehicleCommandsDisabled": "This is a random traffic vehicle and commands can't be used for it.", +} From 9ac9a7a2b6cd83dd89463f5320d01b903b695833 Mon Sep 17 00:00:00 2001 From: Vortrex <3858226+VortrexFTW@users.noreply.github.com> Date: Sun, 9 Jan 2022 05:22:13 -0600 Subject: [PATCH 072/337] Only freeze player that anim is for --- scripts/client/animation.js | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/scripts/client/animation.js b/scripts/client/animation.js index 3838fae4..3928f683 100644 --- a/scripts/client/animation.js +++ b/scripts/client/animation.js @@ -10,7 +10,7 @@ function makePedPlayAnimation(pedId, animGroup, animId, animType, animSpeed, loop, loopNoControl, freezeLastFrame, returnToOriginalPosition, freezePlayer) { logToConsole(LOG_DEBUG, `[VRR.Animation] Playing animation ${animGroup}/${animId} for ped ${pedId}`); if(getGame() < VRR_GAME_GTA_IV) { - if(animType == VRR_ANIMTYPE_NORMAL) { + if(animType == VRR_ANIMTYPE_NORMAL || animType == VRR_ANIMTYPE_SURRENDER) { if(getGame() == VRR_GAME_GTA_VC || getGame() == VRR_GAME_GTA_SA) { getElementFromId(pedId).clearAnimations(); } else { @@ -26,9 +26,6 @@ function makePedPlayAnimation(pedId, animGroup, animId, animType, animSpeed, loo } else if(animType == VRR_ANIMTYPE_BLEND) { getElementFromId(pedId).position = getElementFromId(pedId).position; getElementFromId(pedId).blendAnimation(animGroup, animId, animSpeed); - } else if(animType == VRR_ANIMTYPE_MOVEADD) { - getElementFromId(pedId).position = getElementFromId(pedId).position; - getElementFromId(pedId).blendAnimation(animGroup, animId, animSpeed); } } else { natives.requestAnims(animGroup); @@ -41,13 +38,14 @@ function makePedPlayAnimation(pedId, animGroup, animId, animType, animSpeed, loo function forcePedAnimation(pedId, animGroup, animId, animType, animSpeed, loop, loopNoControl, freezeLastFrame, returnToOriginalPosition) { if(getGame() < VRR_GAME_GTA_IV) { forcedAnimation = [animGroup, animId]; - setLocalPlayerControlState(false, false); getElementFromId(pedId).position = getElementFromId(pedId).position; getElementFromId(pedId).addAnimation(animGroup, animId); - inAnimation = true; - setLocalPlayerControlState(false, false); - localPlayer.collisionsEnabled = false; + if(getElementFromId(pedId) == localPlayer) { + inAnimation = true; + setLocalPlayerControlState(false, false); + localPlayer.collisionsEnabled = false; + } } } From a526497f48862a38ff8adafa8e72f2a1ecd761cb Mon Sep 17 00:00:00 2001 From: Vortrex <3858226+VortrexFTW@users.noreply.github.com> Date: Sun, 9 Jan 2022 05:22:49 -0600 Subject: [PATCH 073/337] Start working on list GUI --- scripts/client/gui/list.js | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/scripts/client/gui/list.js b/scripts/client/gui/list.js index e45fd39c..6aaec8a9 100644 --- a/scripts/client/gui/list.js +++ b/scripts/client/gui/list.js @@ -73,4 +73,35 @@ function initListGUI() { logToConsole(LOG_DEBUG, `[VRR.GUI] Created list dialog GUI`); } +// =========================================================================== + +function showListGUI() { + closeAllWindows(); + logToConsole(LOG_DEBUG, `[VRR.GUI] Showing login window`); + setChatWindowEnabled(false); + mexui.setInput(true); + listDialog.window.shown = true; + guiSubmitKey = checkListDialogSelection; + guiUpKey = selectPreviousListItem; + guiDownKey = selectNextListItem; +} + +// =========================================================================== + +function checkListDialogSelection() { + +} + +// =========================================================================== + +function selectPreviousListItem() { + +} + +// =========================================================================== + +function selectNextListItem() { + +} + // =========================================================================== \ No newline at end of file From b3ef2626979d33f059d6c151da7ce2aa2431e286 Mon Sep 17 00:00:00 2001 From: Vortrex <3858226+VortrexFTW@users.noreply.github.com> Date: Sun, 9 Jan 2022 05:23:06 -0600 Subject: [PATCH 074/337] Scale up server logo on some GUI --- scripts/client/gui/login.js | 14 +++++++------- scripts/client/gui/newchar.js | 22 ++++++++++++---------- scripts/client/gui/register.js | 18 +++++++++--------- scripts/client/gui/resetpass.js | 19 ++++++++++--------- 4 files changed, 38 insertions(+), 35 deletions(-) diff --git a/scripts/client/gui/login.js b/scripts/client/gui/login.js index 709ea025..60aa1ea9 100644 --- a/scripts/client/gui/login.js +++ b/scripts/client/gui/login.js @@ -22,7 +22,7 @@ let login = { function initLoginGUI() { logToConsole(LOG_DEBUG, `[VRR.GUI] Creating login GUI ...`); - login.window = mexui.window(game.width/2-150, game.height/2-129, 300, 258, 'LOGIN', { + login.window = mexui.window(game.width/2-150, game.height/2-130, 300, 260, 'LOGIN', { main: { backgroundColour: toColour(secondaryColour[0], secondaryColour[1], secondaryColour[2], windowAlpha), transitionTime: 500, @@ -42,7 +42,7 @@ function initLoginGUI() { login.window.titleBarIconSize = toVector2(0,0); login.window.titleBarHeight = 0; - login.logoImage = login.window.image(100, 20, 100, 100, mainLogoPath, { + login.logoImage = login.window.image(85, -10, 140, 140, mainLogoPath, { focused: { borderColour: toColour(0, 0, 0, 0), }, @@ -96,7 +96,7 @@ function initLoginGUI() { }, }, checkLogin); - login.forgotPasswordButton = login.window.button(200, 240, 60, 15, 'RESET PASS', { + login.forgotPasswordButton = login.window.button(200, 240, 80, 15, 'RESET PASS', { main: { backgroundColour: toColour(primaryColour[0], primaryColour[1], primaryColour[2], buttonAlpha), textColour: toColour(0, 0, 0, 255), @@ -109,11 +109,11 @@ function initLoginGUI() { }, }, switchToPasswordResetGUI); - login.resetPasswordLabel = login.window.text(20, 140, 60, 15, 'Forgot your password?', { + login.resetPasswordLabel = login.window.text(125, 240, 60, 15, 'Forgot your password?', { main: { textSize: 8.0, textAlign: 1.0, - textColour: toColour(200, 200, 200, 255), + textColour: toColour(180, 180, 180, 255), textFont: robotoFont, }, focused: { @@ -134,14 +134,14 @@ function showLoginGUI() { login.window.shown = true; mexui.focusedControl = login.passwordInput; guiSubmitKey = checkLogin; - showSmallGameMessage(`If you don't have a mouse cursor, press ${toUpperCase(getKeyNameFromId(disableGUIKey))} to disable GUI`, COLOUR_WHITE, 7500); + //showSmallGameMessage(`If you don't have a mouse cursor, press ${toUpperCase(getKeyNameFromId(disableGUIKey))} to disable GUI`, COLOUR_WHITE, 7500); } // =========================================================================== function checkLogin() { logToConsole(LOG_DEBUG, `[VRR.GUI] Checking login with server ...`); - triggerNetworkEvent("vrr.checkLogin", login.passwordInput.lines[0]); + sendNetworkEventToServer("vrr.checkLogin", login.passwordInput.lines[0]); } // =========================================================================== diff --git a/scripts/client/gui/newchar.js b/scripts/client/gui/newchar.js index 81179e1c..bff3359d 100644 --- a/scripts/client/gui/newchar.js +++ b/scripts/client/gui/newchar.js @@ -26,17 +26,19 @@ function initNewCharacterGUI() { backgroundColour: toColour(secondaryColour[0], secondaryColour[1], secondaryColour[2], windowAlpha), transitionTime: 500, }, - title: { - textSize: 0.0, - textColour: toColour(0, 0, 0, 0), - }, - icon: { - textSize: 0.0, - textColour: toColour(0, 0, 0, 0), - }, + title: { + textSize: 0.0, + textColour: toColour(0, 0, 0, 0), + backgroundColour: toColour(primaryColour[0], primaryColour[1], primaryColour[2], windowTitleAlpha), + }, + icon: { + textSize: 0.0, + textColour: toColour(0, 0, 0, 0), + backgroundColour: toColour(primaryColour[0], primaryColour[1], primaryColour[2], windowTitleAlpha), + } }); newCharacter.window.titleBarIconSize = toVector2(0,0); - newCharacter.window.titleBarHeight = 0; + //newCharacter.window.titleBarHeight = 0; newCharacter.mainLogoImage = newCharacter.window.image(115, 10, 65, 65, mainLogoPath, { focused: { @@ -141,7 +143,7 @@ function checkNewCharacter() { return false; } - triggerNetworkEvent("vrr.checkNewCharacter", + sendNetworkEventToServer("vrr.checkNewCharacter", newCharacter.firstNameInput.lines[0], newCharacter.lastNameInput.lines[0], ); diff --git a/scripts/client/gui/register.js b/scripts/client/gui/register.js index f8792037..620e1ab6 100644 --- a/scripts/client/gui/register.js +++ b/scripts/client/gui/register.js @@ -21,7 +21,7 @@ let register = { function initRegisterGUI() { logToConsole(LOG_DEBUG, `[VRR.GUI] Creating register GUI ...`); - register.window = mexui.window(game.width/2-130, game.height/2-125, 300, 250, 'Register', { + register.window = mexui.window(game.width/2-150, game.height/2-150, 300, 300, 'Register', { main: { backgroundColour: toColour(secondaryColour[0], secondaryColour[1], secondaryColour[2], windowAlpha), transitionTime: 500, @@ -40,13 +40,13 @@ function initRegisterGUI() { register.window.titleBarIconSize = toVector2(0,0); register.window.titleBarHeight = 0; - register.window.image(115, 10, 65, 65, mainLogoPath, { + register.window.image(85, -10, 140, 140, mainLogoPath, { focused: { borderColour: toColour(0, 0, 0, 0), }, }); - register.messageLabel = register.window.text(20, 75, 260, 20, 'Create an account', { + register.messageLabel = register.window.text(20, 125, 260, 20, 'Create an account', { main: { textSize: 10.0, textAlign: 0.5, @@ -58,7 +58,7 @@ function initRegisterGUI() { }, }); - register.passwordInput = register.window.textInput(20, 100, 260, 25, '', { + register.passwordInput = register.window.textInput(20, 150, 260, 25, '', { main: { backgroundColour: toColour(0, 0, 0, 120), textColour: toColour(200, 200, 200, 255), @@ -78,7 +78,7 @@ function initRegisterGUI() { register.passwordInput.masked = true; register.passwordInput.placeholder = "Password"; - register.confirmPasswordInput = register.window.textInput(20, 130, 260, 25, '', { + register.confirmPasswordInput = register.window.textInput(20, 180, 260, 25, '', { main: { backgroundColour: toColour(0, 0, 0, 120), textColour: toColour(200, 200, 200, 255), @@ -98,7 +98,7 @@ function initRegisterGUI() { register.confirmPasswordInput.masked = true; register.confirmPasswordInput.placeholder = "Confirm password"; - register.emailInput = register.window.textInput(20, 160, 260, 25, '', { + register.emailInput = register.window.textInput(20, 210, 260, 25, '', { main: { backgroundColour: toColour(0, 0, 0, 120), textColour: toColour(200, 200, 200, 255), @@ -117,7 +117,7 @@ function initRegisterGUI() { }); register.emailInput.placeholder = "Email"; - register.registerButton = register.window.button(20, 195, 260, 30, 'CREATE ACCOUNT', { + register.registerButton = register.window.button(20, 245, 260, 30, 'CREATE ACCOUNT', { main: { backgroundColour: toColour(primaryColour[0], primaryColour[1], primaryColour[2], buttonAlpha), textColour: toColour(255, 255, 255, 255), @@ -147,7 +147,7 @@ function registrationFailed(errorMessage) { function checkRegistration() { logToConsole(LOG_DEBUG, `[VRR.GUI] Checking registration with server ...`); - triggerNetworkEvent("vrr.checkRegistration", register.passwordInput.lines[0], register.confirmPasswordInput.lines[0], register.emailInput.lines[0]); + sendNetworkEventToServer("vrr.checkRegistration", register.passwordInput.lines[0], register.confirmPasswordInput.lines[0], register.emailInput.lines[0]); } // =========================================================================== @@ -160,7 +160,7 @@ function showRegistrationGUI() { register.window.shown = true; mexui.focusedControl = register.passwordInput; guiSubmitKey = checkRegistration; - showSmallGameMessage(`If you don't have a mouse cursor, press ${toUpperCase(getKeyNameFromId(disableGUIKey))} to disable GUI`, COLOUR_WHITE, 7500); + //showSmallGameMessage(`If you don't have a mouse cursor, press ${toUpperCase(getKeyNameFromId(disableGUIKey))} to disable GUI`, COLOUR_WHITE, 7500); } // =========================================================================== diff --git a/scripts/client/gui/resetpass.js b/scripts/client/gui/resetpass.js index fa8ebb8b..cdde2148 100644 --- a/scripts/client/gui/resetpass.js +++ b/scripts/client/gui/resetpass.js @@ -22,7 +22,7 @@ let resetPassword = { function initResetPasswordGUI() { logToConsole(LOG_DEBUG, `[VRR.GUI] Creating password reset GUI ...`); - resetPassword.window = mexui.window(game.width/2-150, game.height/2-129, 300, 258, 'RESET PASSWORD', { + resetPassword.window = mexui.window(game.width/2-150, game.height/2-130, 300, 260, 'RESET PASSWORD', { main: { backgroundColour: toColour(secondaryColour[0], secondaryColour[1], secondaryColour[2], windowAlpha), transitionTime: 500, @@ -42,7 +42,7 @@ function initResetPasswordGUI() { resetPassword.window.titleBarIconSize = toVector2(0,0); resetPassword.window.titleBarHeight = 0; - resetPassword.logoImage = resetPassword.window.image(100, 20, 100, 100, mainLogoPath, { + resetPassword.logoImage = resetPassword.window.image(85, -10, 140, 140, mainLogoPath, { focused: { borderColour: toColour(0, 0, 0, 0), }, @@ -95,7 +95,7 @@ function initResetPasswordGUI() { }, }, checkResetPassword); - resetPassword.backToLoginButton = resetPassword.window.button(200, 240, 60, 15, 'CANCEL', { + resetPassword.backToLoginButton = resetPassword.window.button(200, 240, 80, 15, 'LOGIN', { main: { backgroundColour: toColour(primaryColour[0], primaryColour[1], primaryColour[2], buttonAlpha), textColour: toColour(primaryTextColour[0], primaryTextColour[1], primaryTextColour[2], 255), @@ -108,7 +108,7 @@ function initResetPasswordGUI() { }, }, switchToLoginGUI); - resetPassword.backToLoginLabel = resetPassword.window.text(20, 140, 60, 15, 'Remembered your password? Click here >', { + resetPassword.backToLoginLabel = resetPassword.window.text(125, 240, 60, 15, 'Remember your password?', { main: { textSize: 8.0, textAlign: 1.0, @@ -133,14 +133,14 @@ function showResetPasswordGUI() { resetPassword.window.shown = true; mexui.focusedControl = resetPassword.emailInput; guiSubmitButton = checkResetPassword; - showSmallGameMessage(`If you don't have a mouse cursor, press ${toUpperCase(getKeyNameFromId(disableGUIKey))} to disable GUI`, COLOUR_WHITE, 7500); + //showSmallGameMessage(`If you don't have a mouse cursor, press ${toUpperCase(getKeyNameFromId(disableGUIKey))} to disable GUI`, COLOUR_WHITE, 7500); } // =========================================================================== function checkResetPassword() { logToConsole(LOG_DEBUG, `[VRR.GUI] Checking password reset with server ...`); - triggerNetworkEvent("vrr.checkResetPassword", resetPassword.emailInput.lines[0]); + sendNetworkEventToServer("vrr.checkResetPassword", resetPassword.emailInput.lines[0]); } // =========================================================================== @@ -154,14 +154,15 @@ function resetPasswordFailed(errorMessage) { // =========================================================================== -function resetPasswordCodeStep() { +function resetPasswordCodeInputGUI() { logToConsole(LOG_DEBUG, `[VRR.GUI] Server reports password reset was successful`); - resetPassword.messageLabel.text = "Check your email for a reset code"; + resetPassword.messageLabel.text = "Check your email for a verification code"; resetPassword.messageLabel.styles.main.textColour = toColour(180, 32, 32, 255); resetPassword.emailInput.text = ""; + resetPassword.emailInput.placeholder = "Verification Code"; - guiSubmitKey = false; + guiSubmitButton = checkResetPassword; closeAllWindows(); } From dc6fad074b46303bbd6d9390055313ab2850b5e7 Mon Sep 17 00:00:00 2001 From: Vortrex <3858226+VortrexFTW@users.noreply.github.com> Date: Sun, 9 Jan 2022 05:23:30 -0600 Subject: [PATCH 075/337] Make yes/no dialog button more flush --- scripts/client/gui/yesno.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/scripts/client/gui/yesno.js b/scripts/client/gui/yesno.js index 131501d5..161c910f 100644 --- a/scripts/client/gui/yesno.js +++ b/scripts/client/gui/yesno.js @@ -48,7 +48,7 @@ function initYesNoDialogGUI() { }, }); - yesNoDialog.yesButton = yesNoDialog.window.button(5, 105, 197, 30, 'YES', { + yesNoDialog.yesButton = yesNoDialog.window.button(5, 100, 197, 25, 'YES', { main: { backgroundColour: toColour(primaryColour[0], primaryColour[1], primaryColour[2], buttonAlpha), textColour: toColour(primaryTextColour[0], primaryTextColour[1], primaryTextColour[2], 255), @@ -61,7 +61,7 @@ function initYesNoDialogGUI() { }, }, yesNoDialogAnswerYes); - yesNoDialog.noButton = yesNoDialog.window.button(207, 105, 197, 30, 'NO', { + yesNoDialog.noButton = yesNoDialog.window.button(202, 105, 197, 25, 'NO', { main: { backgroundColour: toColour(primaryColour[0], primaryColour[1], primaryColour[2], buttonAlpha), textColour: toColour(primaryTextColour[0], primaryTextColour[1], primaryTextColour[2], 255), @@ -90,7 +90,7 @@ function showYesNoPromptGUI(promptMessage, promptTitle) { function yesNoDialogAnswerNo() { logToConsole(LOG_DEBUG, `[VRR.GUI] Responding with answer NO to server prompt`); - triggerNetworkEvent("vrr.promptAnswerNo"); + sendNetworkEventToServer("vrr.promptAnswerNo"); closeAllWindows(); } @@ -98,7 +98,7 @@ function yesNoDialogAnswerNo() { function yesNoDialogAnswerYes() { logToConsole(LOG_DEBUG, `[VRR.GUI] Responding with answer YES to server prompt`); - triggerNetworkEvent("vrr.promptAnswerYes"); + sendNetworkEventToServer("vrr.promptAnswerYes"); closeAllWindows(); } From baa1b6ed82111f25d4b0293b6f9b61feca0d9ee7 Mon Sep 17 00:00:00 2001 From: Vortrex <3858226+VortrexFTW@users.noreply.github.com> Date: Sun, 9 Jan 2022 05:23:49 -0600 Subject: [PATCH 076/337] Add clientside natives file for connected mods --- scripts/client/native/connected.js | 70 ++++++++++++++++++++++++++++++ 1 file changed, 70 insertions(+) diff --git a/scripts/client/native/connected.js b/scripts/client/native/connected.js index e69de29b..dd77dec1 100644 --- a/scripts/client/native/connected.js +++ b/scripts/client/native/connected.js @@ -0,0 +1,70 @@ +// =========================================================================== +// Vortrex's Roleplay Resource +// https://github.com/VortrexFTW/gtac_roleplay +// =========================================================================== +// FILE: connected.js +// DESC: Provides wrapped natives for GTA Connected and Mafia Connected mods +// TYPE: Server (JavaScript) +// =========================================================================== + +function sendNetworkEventToPlayer(networkEvent, client, ...args) { + triggerNetworkEvent.apply(null, networkEvent, client, args); +} + +// =========================================================================== + +function getPlayerPosition() { + return localPlayer.position; +} + +// =========================================================================== + +function setPlayerPosition(position) { + localPlayer.position = position; +} + +// =========================================================================== + +function getElementPosition(element) { + return element.position; +} + +// =========================================================================== + +function setElementPosition(element, position) { + if(!element.isSyncer) { + return false; + } + + element.position = position; +} + +// =========================================================================== + +function deleteGameElement(element, position) { + if(!element.isOwner) { + return false; + } + + destroyGameElement(element); +} + +// =========================================================================== + +function createGameVehicle(modelIndex, position, heading) { + return game.createVehicle(getGameData().vehicles[getGame()][modelIndex][0], position, heading); +} + +// =========================================================================== + +function addNetworkEventHandler(eventName, ...args) { + addNetworkHandler.apply(null, eventName, args); +} + +// =========================================================================== + +function sendNetworkEventToServer(eventName, ...args) { + triggerNetworkEvent.apply(null, eventName, args); +} + +// =========================================================================== \ No newline at end of file From 94b68a5830e5c6023c369f2568d9feb11fa67224 Mon Sep 17 00:00:00 2001 From: Vortrex <3858226+VortrexFTW@users.noreply.github.com> Date: Sun, 9 Jan 2022 05:24:10 -0600 Subject: [PATCH 077/337] Fix variable naming --- scripts/server/accent.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/server/accent.js b/scripts/server/accent.js index c1f683e8..404c14b0 100644 --- a/scripts/server/accent.js +++ b/scripts/server/accent.js @@ -59,9 +59,9 @@ function setAccentCommand(command, params, client) { // =========================================================================== function listAccentsCommand(command, params, client) { - let stationList = getGlobalConfig().accents; + let accentList = getGlobalConfig().accents; - let chunkedList = splitArrayIntoChunks(stationList, 8); + let chunkedList = splitArrayIntoChunks(accentList, 8); messagePlayerInfo(client, `{clanOrange}== {jobYellow}Accents {clanOrange}==================================`); From f3f43f4576ab083af5fd07f4d9ca9eb3e4c1a756 Mon Sep 17 00:00:00 2001 From: Vortrex <3858226+VortrexFTW@users.noreply.github.com> Date: Sun, 9 Jan 2022 05:24:46 -0600 Subject: [PATCH 078/337] Add password reset system --- scripts/client/gui/changepass.js | 30 ++++----------------- scripts/server/account.js | 45 ++++++++++++++++++-------------- 2 files changed, 31 insertions(+), 44 deletions(-) diff --git a/scripts/client/gui/changepass.js b/scripts/client/gui/changepass.js index ea820b61..c6329e5c 100644 --- a/scripts/client/gui/changepass.js +++ b/scripts/client/gui/changepass.js @@ -13,7 +13,6 @@ let passwordChange = { messageLabel: null, passwordInput: null, confirmPasswordInput: null, - verificationCodeInput: null, submitButton: null, }; @@ -40,13 +39,13 @@ function initChangePasswordGUI() { passwordChange.window.titleBarIconSize = toVector2(0,0); passwordChange.window.titleBarHeight = 0; - passwordChange.window.image(115, 10, 65, 65, mainLogoPath, { + passwordChange.window.image(85, -10, 140, 140, mainLogoPath, { focused: { borderColour: toColour(0, 0, 0, 0), }, }); - passwordChange.messageLabel = passwordChange.window.text(20, 75, 260, 20, 'Check your email for a verification code!', { + passwordChange.messageLabel = passwordChange.window.text(20, 75, 260, 20, 'Enter a new password', { main: { textSize: 10.0, textAlign: 0.5, @@ -58,7 +57,7 @@ function initChangePasswordGUI() { }, }); - passwordChange.passwordInput = passwordChange.window.textInput(20, 100, 260, 25, '', { + passwordChange.passwordInput = passwordChange.window.textInput(20, 130, 260, 25, '', { main: { backgroundColour: toColour(0, 0, 0, 120), textColour: toColour(200, 200, 200, 255), @@ -78,7 +77,7 @@ function initChangePasswordGUI() { passwordChange.passwordInput.masked = true; passwordChange.passwordInput.placeholder = "Password"; - passwordChange.confirmPasswordInput = passwordChange.window.textInput(20, 130, 260, 25, '', { + passwordChange.confirmPasswordInput = passwordChange.window.textInput(20, 160, 260, 25, '', { main: { backgroundColour: toColour(0, 0, 0, 120), textColour: toColour(200, 200, 200, 255), @@ -98,25 +97,6 @@ function initChangePasswordGUI() { passwordChange.confirmPasswordInput.masked = true; passwordChange.confirmPasswordInput.placeholder = "Confirm password"; - passwordChange.verificationCodeInput = passwordChange.window.textInput(20, 160, 260, 25, '', { - main: { - backgroundColour: toColour(0, 0, 0, 120), - textColour: toColour(200, 200, 200, 255), - textSize: 10.0, - textFont: robotoFont, - }, - caret: { - lineColour: toColour(255, 255, 255, 255), - }, - placeholder: { - backgroundColour: toColour(0, 0, 0, 120), - textColour: toColour(200, 200, 200, 200), - textSize: 10.0, - textFont: robotoFont, - } - }); - passwordChange.verificationCodeInput.placeholder = "Verification Code (From Email)"; - passwordChange.submitButton = passwordChange.window.button(20, 195, 260, 30, 'CHANGE PASSWORD', { main: { backgroundColour: toColour(primaryColour[0], primaryColour[1], primaryColour[2], buttonAlpha), @@ -147,7 +127,7 @@ function passwordChangeFailed(errorMessage) { function checkChangePassword() { logToConsole(LOG_DEBUG, `[VRR.GUI] Checking password change with server ...`); - triggerNetworkEvent("vrr.checkChangePassword", passwordChange.passwordInput.lines[0], passwordChange.confirmPasswordInput.lines[0], passwordChange.verificationCodeInput.lines[0]); + sendNetworkEventToServer("vrr.checkChangePassword", passwordChange.passwordInput.lines[0], passwordChange.confirmPasswordInput.lines[0]); } // =========================================================================== diff --git a/scripts/server/account.js b/scripts/server/account.js index 25f28700..cdd69734 100644 --- a/scripts/server/account.js +++ b/scripts/server/account.js @@ -945,14 +945,15 @@ function checkAccountResetPasswordRequest(client, inputText) { return false; } - let passwordResetCode = generateEmailVerificationCode(); + let passwordResetCode = toUpperCase(generateEmailVerificationCode()); getPlayerData(client).passwordResetState = VRR_RESETPASS_STATE_CODEINPUT; getPlayerData(client).passwordResetCode = passwordResetCode; - sendPasswordResetEmail(getPlayerData(client).accountData.emailAddress, passwordResetCode); + sendPasswordResetEmail(client, passwordResetCode); + showPlayerResetPasswordCodeInputGUI(client); } else if(getPlayerData(client).passwordResetState == VRR_RESETPASS_STATE_CODEINPUT) { - if(getPlayerData(client).passwordResetCode == inputText) { + if(getPlayerData(client).passwordResetCode == toUpperCase(inputText)) { getPlayerData(client).passwordResetState = VRR_RESETPASS_STATE_SETPASS; - showChangePasswordGUI(client); + showPlayerChangePasswordGUI(client); } else { getPlayerData(client).passwordResetState = VRR_RESETPASS_STATE_NONE; client.disconnect(); @@ -964,7 +965,7 @@ function checkAccountResetPasswordRequest(client, inputText) { // =========================================================================== -function checkAccountChangePassword(client, oldPassword, newPassword, confirmNewPassword) { +function checkAccountChangePassword(client, newPassword, confirmNewPassword) { if(!isPlayerLoggedIn(client)) { if(getPlayerData(client).passwordResetState != VRR_RESETPASS_STATE_SETPASS) { //getPlayerData(client).passwordResetState = VRR_RESETPASS_STATE_NONE; @@ -973,24 +974,29 @@ function checkAccountChangePassword(client, oldPassword, newPassword, confirmNew } } - if(isAccountPasswordCorrect(getPlayerData(client).accountData, hashAccountPassword(getPlayerName(client), oldPassword))) { - messagePlayerError(client, `The old password is incorrect!`); - return false; - } + //if(isAccountPasswordCorrect(getPlayerData(client).accountData, hashAccountPassword(getPlayerName(client), oldPassword))) { + // messagePlayerError(client, `The old password is incorrect!`); + // return false; + //} if(!doesPasswordMeetRequirements(newPassword)) { - messagePlayerError(client, `The new password must meet the requirements!`); - messagePlayerInfo(client, `Passwords must have at least one capital letter, one lowercase letter, and one number!`); + let passwordRequirementsString = `${needsCapitals}, ${needsNumbers}, ${needsSymbols}`; + let needsCapitals = getLocaleString(client, "PasswordNeedsCapitals", "1"); + let needsNumbers = getLocaleString(client, "PasswordNeedsNumbers", "1"); + let needsSymbols = getLocaleString(client, "PasswordNeedsSymbols", "1"); + + messagePlayerError(client, getLocaleString(client, "AccountPasswordNeedsImproved")); + messagePlayerInfo(client, getLocaleString(client, "PasswordNeedsBase", passwordRequirementsString)); return false; } if(newPassword != confirmNewPassword) { - messagePlayerError(client, `The new password and confirm new password aren't the same!`); + messagePlayerError(client, getLocaleString(client, "PasswordsDontMatch")); return false; } getPlayerData(client).accountData.password = hashAccountPassword(getPlayerData(client).accountData.name, params); - messagePlayerSuccess(client, `Your password has been changed!`); + messagePlayerSuccess(client, getLocaleString(client, "PasswordChanged")); if(getPlayerData(client).passwordResetState == VRR_RESETPASS_STATE_SETPASS) { getPlayerData(client).passwordResetState = VRR_RESETPASS_STATE_NONE; @@ -1079,12 +1085,10 @@ function initClient(client) { let sessionId = saveConnectionToDatabase(client); getServerData().clients[client.index].session = sessionId; getServerData().clients[client.index].connectTime = Math.ceil(sdl.ticks); - getServerData().clients[client.index].keyBinds = loadAccountKeybindsFromDatabase(tempAccountData.databaseId); - sendAccountKeyBindsToClient(client); if(tempAccountData != false) { if(isAccountAutoIPLoginEnabled(tempAccountData) && getPlayerData(client).accountData.ipAddress == client.ip) { - messagePlayerAlert(client, "You have been automatically logged in via IP!"); + messagePlayerAlert(client, getLocaleString(client, "AutoLoggedInIP")); loginSuccess(client); } else { if(getServerConfig().useGUI && doesPlayerHaveGUIEnabled(client)) { @@ -1092,7 +1096,7 @@ function initClient(client) { showPlayerLoginGUI(client); } else { logToConsole(LOG_DEBUG, `[VRR.Account] ${getPlayerDisplayForConsole(client)} is being shown the login message (GUI disabled).`); - messagePlayerNormal(client, `Welcome back to ${getServerName()}, ${getPlayerName(client)}! Please /login to continue.`, getColourByName("softGreen")); + messagePlayerNormal(client, getLocaleString(client, "WelcomeBack", getServerName(), getPlayerName(client)), getColourByName("softGreen")); } playRadioStreamForPlayer(client, getServerIntroMusicURL(), true, getPlayerStreamingRadioVolume(client)); } @@ -1102,10 +1106,13 @@ function initClient(client) { showPlayerRegistrationGUI(client); } else { logToConsole(LOG_DEBUG, `[VRR.Account] ${getPlayerDisplayForConsole(client)} is being shown the register message (GUI disabled).`); - messagePlayerNormal(client, `Welcome to ${getServerName()}, ${getPlayerName(client)}! Please /register to continue.`, getColourByName("softGreen")); + messagePlayerNormal(client, getLocaleString(client, "WelcomeNewPlayer", getServerName(), getPlayerName(client)), getColourByName("softGreen")); } playRadioStreamForPlayer(client, getServerIntroMusicURL(), true, getPlayerStreamingRadioVolume(client)); } + + getServerData().clients[client.index].keyBinds = loadAccountKeybindsFromDatabase(getServerData().clients[client.index].accountData.databaseId); + sendAccountKeyBindsToClient(client); } }, 2500); } @@ -1152,7 +1159,7 @@ function loadAccountKeybindsFromDatabase(accountDatabaseID) { tempAccountKeybinds.push(tempKeyBindData); } - if(accountDatabaseID != 0) { + if(accountDatabaseID != 0 && typeof accountDatabaseId != "undefined") { if(dbConnection) { dbQuery = queryDatabase(dbConnection, `SELECT * FROM acct_hotkey WHERE acct_hotkey_enabled = 1 AND acct_hotkey_acct = ${accountDatabaseID} AND acct_hotkey_server = ${getServerId()}`); if(dbQuery) { From 7c1065643d72045ef443bd667671ee51dedeaf76 Mon Sep 17 00:00:00 2001 From: Vortrex <3858226+VortrexFTW@users.noreply.github.com> Date: Sun, 9 Jan 2022 05:25:10 -0600 Subject: [PATCH 079/337] Load config files info global config --- scripts/server/config.js | 28 +++++++++++++--------------- 1 file changed, 13 insertions(+), 15 deletions(-) diff --git a/scripts/server/config.js b/scripts/server/config.js index 615177d2..f6ffe3e9 100644 --- a/scripts/server/config.js +++ b/scripts/server/config.js @@ -51,9 +51,6 @@ let globalConfig = { geoIPCountryDatabaseFilePath: "geoip-country.mmdb", geoIPCityDatabaseFilePath: "geoip-city.mmdb", randomTipInterval: 600000, - locales: [ - ["English", "english"], - ], economy: { passiveIncomePerPayDay: 1000, applyTax: true, @@ -81,6 +78,7 @@ let globalConfig = { VRR_ITEM_USETYPE_VEHTIRE, ], vehicleInactiveRespawnDelay: 1800000, // 20 minutes + chatSectionHeaderLength: 96, }; // =========================================================================== @@ -92,20 +90,20 @@ function loadGameConfig() { // =========================================================================== function loadGlobalConfig() { - //let roleplayConfig = JSON.parse(loadTextFile(`config/roleplay.json`)); - //if(roleplayConfig != null) { - // globalConfig = roleplayConfig; - //} + let localeConfig = JSON.parse(loadTextFile(`config/locale.json`)); + if(localeConfig != null) { + globalConfig.locales = localeConfig; + } - //let localeConfig = JSON.parse(loadTextFile(`config/locale.json`)); - //if(localeConfig != null) { - // globalConfig.locales = localeConfig; - //} + let economyConfig = JSON.parse(loadTextFile(`config/economy.json`)); + if(economyConfig != null) { + globalConfig.economy = economyConfig; + } - //let economyConfig = JSON.parse(loadTextFile(`config/economy.json`)); - //if(economyConfig != null) { - // globalConfig.economy = economyConfig; - //} + let accentsConfig = JSON.parse(loadTextFile(`config/accents.json`)); + if(accentsConfig != null) { + globalConfig.accents = accentsConfig; + } //getGlobalConfig().weaponEquippableTypes = [ // VRR_ITEM_USETYPE_WEAPON, From 860977a444cb8fc464b4f15df8b7c4881f3d5fa4 Mon Sep 17 00:00:00 2001 From: Vortrex <3858226+VortrexFTW@users.noreply.github.com> Date: Sun, 9 Jan 2022 05:25:22 -0600 Subject: [PATCH 080/337] Move database stuff to natives --- scripts/server/database.js | 225 ------------------------------------- 1 file changed, 225 deletions(-) diff --git a/scripts/server/database.js b/scripts/server/database.js index 28ab48ac..00bfeac8 100644 --- a/scripts/server/database.js +++ b/scripts/server/database.js @@ -21,228 +21,3 @@ function initDatabaseScript() { // =========================================================================== -function connectToDatabase() { - if(databaseConfig.usePersistentConnection) { - if(persistentDatabaseConnection == null) { - logToConsole(LOG_DEBUG, "[VRR.Database] Initializing database connection ..."); - persistentDatabaseConnection = module.mysql.connect(databaseConfig.host, databaseConfig.user, databaseConfig.pass, databaseConfig.name, databaseConfig.port); - if(persistentDatabaseConnection.error) { - console.warn("[VRR.Database] Database connection error: " + toString(persistentDatabaseConnection.error)); - persistentDatabaseConnection = null; - return false; - } - - logToConsole(LOG_DEBUG, "[VRR.Database] Database connection successful!"); - return persistentDatabaseConnection; - } else { - logToConsole(LOG_DEBUG, "[VRR.Database] Using existing database connection."); - return persistentDatabaseConnection; - } - } else { - let databaseConnection = module.mysql.connect(databaseConfig.host, databaseConfig.user, databaseConfig.pass, databaseConfig.name, databaseConfig.port); - if(databaseConnection.error) { - console.warn("[VRR.Database] Database connection error: " + toString(persistentDatabaseConnection.error)); - return false; - } else { - return databaseConnection; - } - } -} - -// =========================================================================== - -function disconnectFromDatabase(dbConnection) { - if(!databaseConfig.usePersistentConnection) { - try { - dbConnection.close(); - logToConsole(LOG_DEBUG, `[VRR.Database] Database connection closed successfully`); - } catch(error) { - logToConsole(LOG_ERROR, `[VRR.Database] Database connection could not be closed! (Error: ${error})`); - } - } - return true; -} - -// =========================================================================== - -function queryDatabase(dbConnection, queryString) { - logToConsole(LOG_DEBUG, `[VRR.Database] Query string: ${queryString}`); - return dbConnection.query(queryString); -} - -// =========================================================================== - -function escapeDatabaseString(dbConnection, unsafeString = "") { - if(!dbConnection) { - dbConnection = connectToDatabase(); - } - - if(typeof unsafeString == "string") { - return dbConnection.escapeString(unsafeString); - } - return unsafeString; -} - -// =========================================================================== - -function getDatabaseInsertId(dbConnection) { - return dbConnection.insertId; -} - -// =========================================================================== - -function getQueryNumRows(dbQuery) { - return dbQuery.numRows; -} - -// =========================================================================== - -function getDatabaseError(dbConnection) { - return dbConnection.error; -} - -// =========================================================================== - -function freeDatabaseQuery(dbQuery) { - if(dbQuery != null) { - dbQuery.free(); - } - return; -} - -// =========================================================================== - -function fetchQueryAssoc(dbQuery) { - return dbQuery.fetchAssoc(); -} - -// =========================================================================== - -function quickDatabaseQuery(queryString) { - let dbConnection = connectToDatabase(); - let insertId = 0; - if(dbConnection) { - //logToConsole(LOG_DEBUG, `[VRR.Database] Query string: ${queryString}`); - let dbQuery = queryDatabase(dbConnection, queryString); - if(getDatabaseInsertId(dbConnection)) { - insertId = getDatabaseInsertId(dbConnection); - logToConsole(LOG_DEBUG, `[VRR.Database] Query returned insert id ${insertId}`); - } - - if(dbQuery) { - try { - freeDatabaseQuery(dbQuery); - logToConsole(LOG_DEBUG, `[VRR.Database] Query result free'd successfully`); - } catch(error) { - logToConsole(LOG_ERROR, `[VRR.Database] Query result could not be free'd! (Error: ${error})`); - } - } - - disconnectFromDatabase(dbConnection); - - if(insertId != 0) { - return insertId; - } - - return true; - } - return false; -} - -// =========================================================================== - -function executeDatabaseQueryCommand(command, params, client) { - if(areParamsEmpty(params)) { - messagePlayerSyntax(client, getCommandSyntaxText(command)); - return false; - } - - if(!targetClient) { - messagePlayerError(client, "That player was not found!"); - return false; - } - - if(targetCode == "") { - messagePlayerError(client, "You didn't enter any code!"); - return false; - } - - let success = quickDatabaseQuery(params); - - if(!success) { - messagePlayerAlert(client, `Database query failed to execute: {ALTCOLOUR}${query}`); - } else if(typeof success != "boolean") { - messagePlayeSuccess(client, `Database query successful: {ALTCOLOUR}${query}`); - messagePlayerInfo(client, `Returns: ${success}`); - } else { - messagePlayerSuccess(client, `Database query successful: {ALTCOLOUR}${query}`); - } - return true; -} - -// =========================================================================== - -function setConstantsAsGlobalVariablesInDatabase() { - let dbConnection = connectToDatabase(); - let entries = Object.entries(global); - for(let i in entries) { - logToConsole(LOG_DEBUG, `[VRR.Database] Checking entry ${i} (${entries[i]})`); - if(toString(i).slice(0, 3).indexOf("VRR_") != -1) { - logToConsole(LOG_DEBUG, `[VRR.Database] Adding ${i} (${entries[i]}) to database global variables`); - } - } -} - -// =========================================================================== - -function loadDatabaseConfiguration() { - let databaseConfigFile = loadTextFile("config/database.json"); - return JSON.parse(databaseConfigFile); -} - -// =========================================================================== - -function createDatabaseInsertQuery(tableName, data) { - let fields = []; - let values = []; - - for(let i in data) { - if(data[i][1] != "undefined" && data[i][1] != NaN && data[i][0] != 'NaN') { - if(data[i][1] != "undefined" && data[i][1] != NaN && data[i][1] != 'NaN') { - fields.push(data[i][0]); - - if(typeof data[i][1] == "string") { - values.push(`'${data[i][1]}'`); - } else { - values.push(data[i][1]); - } - } - } - } - - let queryString = `INSERT INTO ${tableName} (${fields.join(", ")}) VALUES (${values.join(", ")})`; - return queryString; -} - -// =========================================================================== - -function createDatabaseUpdateQuery(tableName, data, whereClause) { - let values = []; - - for(let i in data) { - if(data[i][0] != "undefined" && data[i][0] != NaN && data[i][0] != 'NaN') { - if(data[i][1] != "undefined" && data[i][1] != NaN && data[i][1] != 'NaN') { - if(typeof data[i][1] == "string") { - values.push(`${data[i][0]}='${data[i][1]}'`); - } else { - values.push(`${data[i][0]}=${data[i][1]}`); - } - } - } - } - - let queryString = `UPDATE ${tableName} SET ${values.join(", ")} WHERE ${whereClause}`; - return queryString; -} - -// =========================================================================== \ No newline at end of file From 57e65c0483347b7b8247be1bbac4c278ebecb1d0 Mon Sep 17 00:00:00 2001 From: Vortrex <3858226+VortrexFTW@users.noreply.github.com> Date: Sun, 9 Jan 2022 05:25:44 -0600 Subject: [PATCH 081/337] More GUI utils --- scripts/server/gui.js | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/scripts/server/gui.js b/scripts/server/gui.js index b9cf7dac..ff14747a 100644 --- a/scripts/server/gui.js +++ b/scripts/server/gui.js @@ -112,4 +112,16 @@ function playerPromptAnswerNoCommand(command, params, client) { playerPromptAnswerNo(client); } +// =========================================================================== + +function playerToggledGUI(client) { + toggleAccountGUICommand("gui", "", client); +} + +// =========================================================================== + +function showPlayerChangePasswordGUI(client) { + sendNetworkEventToPlayer("vrr.changePassword", client); +} + // =========================================================================== \ No newline at end of file From 646ff837943f65358411fefc8909a075c506116d Mon Sep 17 00:00:00 2001 From: Vortrex <3858226+VortrexFTW@users.noreply.github.com> Date: Sun, 9 Jan 2022 05:26:00 -0600 Subject: [PATCH 082/337] Use new chat section header util --- scripts/server/help.js | 40 ++++++++++++++++++++-------------------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/scripts/server/help.js b/scripts/server/help.js index 56a19887..7562501f 100644 --- a/scripts/server/help.js +++ b/scripts/server/help.js @@ -190,7 +190,7 @@ function helpCommand(command, params, client) { // =========================================================================== function showMainHelpMessage(client) { - messagePlayerInfo(client, `{clanOrange}== {jobYellow}Help {clanOrange}=================================`); + messagePlayerInfo(client, makeChatSectionHeader(getLocaleString(client, "HeaderHelp"))); messagePlayerNormal(client, `{clanOrange}• {MAINCOLOUR}Use /help for commands and info. Example: {ALTCOLOUR}/help vehicle`); messagePlayerNormal(client, `{clanOrange}• {MAINCOLOUR}Help Categories: [#A9A9A9]account, command, vehicle, job, chat, rules, website, anim`); messagePlayerNormal(client, `{clanOrange}• [#A9A9A9]ammunation, skins, mechanic, dealership, discord, colours, keys`); @@ -199,7 +199,7 @@ function showMainHelpMessage(client) { // =========================================================================== function showAccountHelpMessage(client) { - messagePlayerInfo(client, `{clanOrange}== {jobYellow}Account Help {clanOrange}=============================`); + messagePlayerInfo(client, makeChatSectionHeader(getLocaleString(client, "HeaderAccountHelp"))); messagePlayerNormal(client, `{clanOrange}• {MAINCOLOUR}Do not share your password with anybody else.`); messagePlayerNormal(client, `{clanOrange}• {MAINCOLOUR}Use {ALTCOLOUR}/changepass{MAINCOLOUR} to change your password.`); messagePlayerNormal(client, `{clanOrange}• {MAINCOLOUR}Some settings you can use: {ALTCOLOUR}/gui, /logo, /iplogin, /autolastchar, /2fa, /loginalert`); @@ -208,7 +208,7 @@ function showAccountHelpMessage(client) { // =========================================================================== function showVehicleHelpMessage(client) { - messagePlayerInfo(client, `{clanOrange}== {jobYellow}Vehicle Help {clanOrange}=============================`); + messagePlayerInfo(client, makeChatSectionHeader(getLocaleString(client, "HeaderVehicleHelp"))); messagePlayerNormal(client, `{clanOrange}• {MAINCOLOUR}Visit dealerships to buy new vehicles (Use {ALTCOLOUR}/help dealership {MAINCOLOUR}for more info.)`); messagePlayerNormal(client, `{clanOrange}• {MAINCOLOUR}Some commands: {ALTCOLOUR}/lock, /engine, /lights, /trunk, /rentveh, /buyveh, /rentprice, /buyprice`); messagePlayerNormal(client, `{clanOrange}• {MAINCOLOUR}Your personal vehicles will save wherever you or somebody else leaves them!`); @@ -219,7 +219,7 @@ function showVehicleHelpMessage(client) { // =========================================================================== function showVehicleDealershipHelpMessage(client) { - messagePlayerInfo(client, `{clanOrange}== {jobYellow}Vehicle Dealerships {clanOrange}======================`); + messagePlayerInfo(client, makeChatSectionHeader(getLocaleString(client, "HeaderVehicleDealershipHelp"))); messagePlayerNormal(client, `{clanOrange}• {MAINCOLOUR}Visit a vehicle dealer to buy new vehicles. Use {ALTCOLOUR}/gps {MAINCOLOUR}to find one.`); messagePlayerNormal(client, `{clanOrange}• {MAINCOLOUR}At the dealer, simply enter a car you want to buy, and the price will be shown to you`); messagePlayerNormal(client, `{clanOrange}• {MAINCOLOUR}If you want to buy the vehicle and have enough money, use {ALTCOLOUR}/buyveh {MAINCOLOUR}and you will be given keys`); @@ -229,7 +229,7 @@ function showVehicleDealershipHelpMessage(client) { // =========================================================================== function showJobHelpMessage(client) { - messagePlayerInfo(client, `{clanOrange}== {jobYellow}Job Help {clanOrange}=================================`); + messagePlayerInfo(client, makeChatSectionHeader(getLocaleString(client, "HeaderJobHelp"))); messagePlayerNormal(client, `{clanOrange}• {MAINCOLOUR}Visit job locations get a job and earn money. Look for yellow spots on the map`); messagePlayerNormal(client, `{clanOrange}• {MAINCOLOUR}At a job location, use {ALTCOLOUR}/takejob {MAINCOLOUR}to get the job. Use {ALTCOLOUR}/quitjob {MAINCOLOUR}to quit your job`); messagePlayerNormal(client, `{clanOrange}• {MAINCOLOUR}Use {ALTCOLOUR}/startwork {MAINCOLOUR}to begin working. You can also get a job {ALTCOLOUR}/uniform and {ALTCOLOUR}/equipment`); @@ -240,7 +240,7 @@ function showJobHelpMessage(client) { // =========================================================================== function showChatHelpMessage(client) { - messagePlayerInfo(client, `{clanOrange}== {jobYellow}Chat Help {clanOrange}================================`); + messagePlayerInfo(client, makeChatSectionHeader(getLocaleString(client, "HeaderChatHelp"))); messagePlayerNormal(client, `{clanOrange}• {MAINCOLOUR}There are two main types of chat: out-of-character (OOC) and in-character (IC)`); messagePlayerNormal(client, `{clanOrange}• {MAINCOLOUR}Mixing these two types is not proper roleplay. See {ALTCOLOUR}/rules {MAINCOLOUR}for info.`); messagePlayerNormal(client, `{clanOrange}• {MAINCOLOUR}Some chat commands: {ALTCOLOUR}/dm /whisper /talk /shout /me.`); @@ -250,7 +250,7 @@ function showChatHelpMessage(client) { // =========================================================================== function showRulesHelpMessage(client) { - messagePlayerInfo(client, `{clanOrange}== {jobYellow}Server Rules {clanOrange}=============================`); + messagePlayerInfo(client, makeChatSectionHeader(getLocaleString(client, "HeaderServerRulesList"))); messagePlayerNormal(client, `{clanOrange}• {MAINCOLOUR}Unrealistic actions (powergaming) are not allowed. You aren't superman.`); messagePlayerNormal(client, `{clanOrange}• {MAINCOLOUR}No terrorist or terrorism roleplay is allowed.`); messagePlayerNormal(client, `{clanOrange}• {MAINCOLOUR}Always follow instructions given by moderators and admins.`); @@ -261,21 +261,21 @@ function showRulesHelpMessage(client) { // =========================================================================== function showWebsiteHelpMessage(client) { - messagePlayerInfo(client, `{clanOrange}== {jobYellow}Website {clanOrange}=============================`); + messagePlayerInfo(client, makeChatSectionHeader(getLocaleString(client, "HeaderWebsiteInfo"))); messagePlayerNormal(client, `{clanOrange}• {MAINCOLOUR}${server.getRule("Website")}`); } // =========================================================================== function showDiscordHelpMessage(client) { - messagePlayerInfo(client, `{clanOrange}== {jobYellow}Discord {clanOrange}=============================`); + messagePlayerInfo(client, makeChatSectionHeader(getLocaleString(client, "HeaderDiscordInfo"))); messagePlayerNormal(client, `{clanOrange}• {MAINCOLOUR}${server.getRule("Website")}`); } // =========================================================================== function showAnimationHelpMessage(client) { - messagePlayerInfo(client, `{clanOrange}== {jobYellow}Animations {clanOrange}===============================`); + messagePlayerInfo(client, makeChatSectionHeader(getLocaleString(client, "HeaderAnimationHelp"))); messagePlayerNormal(client, `{clanOrange}• {MAINCOLOUR}Animations allow you to enhance roleplay with visual actions`); messagePlayerNormal(client, `{clanOrange}• {MAINCOLOUR}Use {ALTCOLOUR}/an {MAINCOLOUR}or {ALTCOLOUR}/anim {MAINCOLOUR}with a name to use an animation.`); messagePlayerNormal(client, `{clanOrange}• {MAINCOLOUR}To see a list of animations, use {ALTCOLOUR}/animlist`); @@ -284,7 +284,7 @@ function showAnimationHelpMessage(client) { // =========================================================================== function showAmmunationHelpMessage(client) { - messagePlayerInfo(client, `{clanOrange}== {jobYellow}Ammunation {clanOrange}===============================`); + messagePlayerInfo(client, makeChatSectionHeader(getLocaleString(client, "HeaderAmmunationHelp"))); messagePlayerNormal(client, `{clanOrange}• {MAINCOLOUR}Visit an ammunation to buy weapons. Use {ALTCOLOUR}/gps {MAINCOLOUR}to find one.`); messagePlayerNormal(client, `{clanOrange}• {MAINCOLOUR}Buying a weapon requires a weapon license.`); messagePlayerNormal(client, `{clanOrange}• {MAINCOLOUR}Weapon licenses are managed by the police department. Apply there to get one.`); @@ -294,7 +294,7 @@ function showAmmunationHelpMessage(client) { // =========================================================================== function showClothesHelpMessage(client) { - messagePlayerInfo(client, `{clanOrange}== {jobYellow}Clothes {clanOrange}==================================`); + messagePlayerInfo(client, makeChatSectionHeader(getLocaleString(client, "HeaderSkinHelp"))); //messagePlayerNormal(client, `{clanOrange}• {MAINCOLOUR}To change your skin, use {ALTCOLOUR}/gps {MAINCOLOUR}to find a clothing store`); messagePlayerNormal(client, `{clanOrange}• {MAINCOLOUR}At a clothing store, use {ALTCOLOUR}/buy {MAINCOLOUR} to purchase clothes`); messagePlayerNormal(client, `{clanOrange}• {MAINCOLOUR}When you have a clothing item, equip and use it like any other item to show the skin selection (check {ALTCOLOUR}/help items {MAINCOLOUR}to learn how to use items)`); @@ -304,7 +304,7 @@ function showClothesHelpMessage(client) { // =========================================================================== function showBindKeysHelpMessage(client) { - messagePlayerInfo(client, `{clanOrange}== {jobYellow}Bindable Keys {clanOrange}============================`); + messagePlayerInfo(client, makeChatSectionHeader(getLocaleString(client, "HeaderBindableKeysHelp"))); messagePlayerNormal(client, `{clanOrange}• {MAINCOLOUR}You can set your own keys binds. Use {ALTCOLOUR}/keybinds {MAINCOLOUR}to see your binded keys.`); messagePlayerNormal(client, `{clanOrange}• {MAINCOLOUR}Use {ALTCOLOUR}/bindkey {MAINCOLOUR}to add a new keybind and /unbindkey to remove one.`); messagePlayerNormal(client, `{clanOrange}• {MAINCOLOUR}Default keys are: [#0066FF]K {MAINCOLOUR}for vehicle engine, [#0066FF]L {MAINCOLOUR}for lights, and [#0066FF]J {MAINCOLOUR}for lock/unlock`); @@ -317,17 +317,17 @@ function showBindKeysHelpMessage(client) { // =========================================================================== function showBusinessHelpMessage(client) { - messagePlayerInfo(client, `{clanOrange}== {jobYellow}Business {clanOrange}=================================`); + messagePlayerInfo(client, makeChatSectionHeader(getLocaleString(client, "HeaderBusinessHelp"))); messagePlayerNormal(client, `{clanOrange}• {MAINCOLOUR}Use /buy to purchase items or /bizitems to see a list of what's for sale at any business`); messagePlayerNormal(client, `{clanOrange}• {MAINCOLOUR}Businesses are shown with blue names above the icon at their entrance.`); - messagePlayerNormal(client, `{clanOrange}• {MAINCOLOUR}Business owner commands: {ALTCOLOUR}/bizorder, /biz`); + messagePlayerNormal(client, `{clanOrange}• {MAINCOLOUR}Business owner commands: {ALTCOLOUR}/bizorder, /bizlock, /bizlights, /radiostation, /bizitemprice, /bizbuyprice, /bizfee, /biztill, /bizwithdraw, /bizdeposit`); messagePlayerNormal(client, `{clanOrange}• {MAINCOLOUR}A new car for sale will appear when you drive away from the dealer.`); } // =========================================================================== function showClanHelpMessage(client) { - messagePlayerInfo(client, `{clanOrange}== {jobYellow}Clan {clanOrange}================================`); + messagePlayerInfo(client, makeChatSectionHeader(getLocaleString(client, "HeaderClanHelp"))); messagePlayerNormal(client, `{clanOrange}• {MAINCOLOUR}Ask an admin to create a clan (Similar to factions/groups/families)`); messagePlayerNormal(client, `{clanOrange}• {MAINCOLOUR}Clan owners have full control over their clan once it's created`); messagePlayerNormal(client, `{clanOrange}• {MAINCOLOUR}Clan commands: {ALTCOLOUR}/clan, /clanmotd, /clanname, /clanowner, /clanhouse, /clanbiz, /claninvite, /clanuninvite, /clansetrank`); @@ -337,8 +337,8 @@ function showClanHelpMessage(client) { // =========================================================================== function showRadioHelpMessage(client) { - messagePlayerInfo(client, `{clanOrange}== {jobYellow}Radio {clanOrange}===============================`); - messagePlayerNormal(client, `{clanOrange}• {MAINCOLOUR}Use {ALTCOLOUR}/radiostations {MAINCOLOUR}to set the station for your vehicle, house, or business`); + messagePlayerInfo(client, makeChatSectionHeader(getLocaleString(client, "HeaderRadioHelp"))); + messagePlayerNormal(client, `{clanOrange}• {MAINCOLOUR}Use {ALTCOLOUR}/radiostation {MAINCOLOUR}to set the station for your vehicle, house, or business`); messagePlayerNormal(client, `{clanOrange}• {MAINCOLOUR}Use {ALTCOLOUR}/radiostations {MAINCOLOUR}to see a list of stations`); messagePlayerNormal(client, `{clanOrange}• {MAINCOLOUR}You can change your radio streaming volume using {ALTCOLOUR}/radiovolume {MAINCOLOUR}with 0-100 as the percent.`); } @@ -346,7 +346,7 @@ function showRadioHelpMessage(client) { // =========================================================================== function showWealthAndTaxHelpMessage(client) { - messagePlayerInfo(client, `{clanOrange}== {jobYellow}Wealth and Tax {clanOrange}===========================`); + messagePlayerInfo(client, makeChatSectionHeader(getLocaleString(client, "HeaderWealthAndTax"))); messagePlayerNormal(client, `{clanOrange}• {MAINCOLOUR}Your taxes on payday are ${100*getGlobalConfig().economy.incomeTaxRate}% of your calculated wealth.`); messagePlayerNormal(client, `{clanOrange}• {MAINCOLOUR}Your calculated wealth is a total sum based on how many vehicles, houses, and businesses you have.`); messagePlayerNormal(client, `{clanOrange}• {MAINCOLOUR}Each vehicle is {ALTCOLOUR}${getGlobalConfig().economy.upKeepCosts.upKeepPerVehicle}, {MAINCOLOUR}each house is {ALTCOLOUR}${getGlobalConfig().economy.upKeepCosts.upKeepPerHouse}, {MAINCOLOUR}and each business is {ALTCOLOUR}${getGlobalConfig().economy.upKeepCosts.upKeepPerBusiness}`); @@ -371,7 +371,7 @@ function showCommandHelpMessage(client, commandName) { let command = getCommandData(commandName); let aliases = getCommandAliasesNames(command); - messagePlayerInfo(client, `{clanOrange}== {jobYellow}Command Info {clanOrange}=============================`); + messagePlayerInfo(client, makeChatSectionHeader(getLocaleString(client, "HeaderCommandInfo", commandName))); messagePlayerNormal(client, `{clanOrange}• {MAINCOLOUR}Description: ${command.description}`); if(aliases.length > 0) { From 3d9ee04eb5e642e6d1267cc0ff082bcf8d556714 Mon Sep 17 00:00:00 2001 From: Vortrex <3858226+VortrexFTW@users.noreply.github.com> Date: Sun, 9 Jan 2022 05:27:11 -0600 Subject: [PATCH 083/337] Use new locale strings --- scripts/server/business.js | 84 ++++++++++++++++++------------------ scripts/server/clan.js | 64 +++++++++++++-------------- scripts/server/house.js | 20 ++++----- scripts/server/misc.js | 31 +++++++++---- scripts/server/moderation.js | 4 +- scripts/server/radio.js | 28 ++++++------ scripts/server/vehicle.js | 22 +++++----- 7 files changed, 134 insertions(+), 119 deletions(-) diff --git a/scripts/server/business.js b/scripts/server/business.js index 9ab6ebb5..45dfe3f8 100644 --- a/scripts/server/business.js +++ b/scripts/server/business.js @@ -174,7 +174,7 @@ function createBusinessLocationCommand(command, params, client) { } if(!getBusinessData(businessId)) { - messagePlayerError(client, "Business not found!"); + messagePlayerError(client, getLocaleString(client, "InvalidBusiness")); return false; } @@ -217,7 +217,7 @@ function deleteBusinessCommand(command, params, client) { } if(!getBusinessData(businessId)) { - messagePlayerError(client, "Business not found!"); + messagePlayerError(client, getLocaleString(client, "InvalidBusiness")); return false; } @@ -241,7 +241,7 @@ function setBusinessNameCommand(command, params, client) { let businessId = getPlayerBusiness(client); if(!getBusinessData(businessId)) { - messagePlayerError(client, "Business not found!"); + messagePlayerError(client, getLocaleString(client, "InvalidBusiness")); return false; } @@ -269,12 +269,12 @@ function setBusinessOwnerCommand(command, params, client) { let businessId = getPlayerBusiness(client); if(!newBusinessOwner) { - messagePlayerError(client, "Player not found!"); + messagePlayerError(client, getLocaleString(client, "InvalidPlayer")); return false; } if(!getBusinessData(businessId)) { - messagePlayerError(client, "Business not found!"); + messagePlayerError(client, getLocaleString(client, "InvalidBusiness")); return false; } @@ -302,12 +302,12 @@ function setBusinessJobCommand(command, params, client) { let businessId = getPlayerBusiness(client); if(!getJobData(jobId)) { - messagePlayerError(client, "Job not found!"); + messagePlayerError(client, getLocaleString(client, "InvalidJob")); return false; } if(!getBusinessData(businessId)) { - messagePlayerError(client, "Business not found!"); + messagePlayerError(client, getLocaleString(client, "InvalidBusiness")); return false; } @@ -329,14 +329,14 @@ function setBusinessClanCommand(command, params, client) { let businessId = getPlayerBusiness(client); if(!getBusinessData(businessId)) { - messagePlayerError("Business not found!"); + messagePlayerError(getLocaleString(client, "InvalidBusiness")); return false; } let clanId = getPlayerClan(client); if(!getClanData(clanId)) { - messagePlayerError(client, "Clan not found!"); + messagePlayerError(client, getLocaleString(client, "InvalidClan")); return false; } @@ -358,7 +358,7 @@ function setBusinessRankCommand(command, params, client) { let businessId = getPlayerBusiness(client); if(!getBusinessData(businessId)) { - messagePlayerError("Business not found!"); + messagePlayerError(getLocaleString(client, "InvalidBusiness")); return false; } @@ -373,7 +373,7 @@ function setBusinessRankCommand(command, params, client) { let clanId = getClanIdFromDatabaseId(getBusinessData(businessId).ownerId); rankId = getClanRankFromParams(clanId, params); if(!getClanRankData(clanId, rankId)) { - messagePlayerError(client, "Clan rank not found!"); + messagePlayerError(client, getLocaleString(client, "ClanRankInvalid")); return false; } getBusinessData(businessId).rank = getClanRankData(clanId, rankId).databaseId; @@ -406,21 +406,21 @@ function setBusinessRankCommand(command, params, client) { let businessId = getPlayerBusiness(client); if(!getBusinessData(businessId)) { - messagePlayerError("Business not found!"); + messagePlayerError(getLocaleString(client, "InvalidBusiness")); return false; } let clanId = getPlayerClan(client); if(!getClanData(clanId)) { - messagePlayerError(client, "Clan not found!"); + messagePlayerError(client, getLocaleString(client, "InvalidClan")); return false; } let clanRankId = getClanRankFromParams(clanId, params); if(!getClanRankData(clanId, clanRankId)) { - messagePlayerError(client, "Clan rank not found!"); + messagePlayerError(client, getLocaleString(client, "ClanRankInvalid")); return false; } @@ -457,12 +457,12 @@ function setBusinessJobCommand(command, params, client) { } if(!getBusinessData(businessId)) { - messagePlayerError(client, "Business not found!"); + messagePlayerError(client, getLocaleString(client, "InvalidBusiness")); return false; } if(!getJobData(jobId)) { - messagePlayerError(client, "Job not found!"); + messagePlayerError(client, getLocaleString(client, "InvalidJob")); return false; } @@ -483,7 +483,7 @@ function setBusinessPublicCommand(command, params, client) { } if(!getBusinessData(businessId)) { - messagePlayerError(client, "Business not found!"); + messagePlayerError(client, getLocaleString(client, "InvalidBusiness")); return false; } @@ -504,7 +504,7 @@ function lockUnlockBusinessCommand(command, params, client) { } if(!getBusinessData(businessId)) { - messagePlayerError(client, "Business not found!"); + messagePlayerError(client, getLocaleString(client, "InvalidBusiness")); return false; } @@ -535,7 +535,7 @@ function lockUnlockBusinessCommand(command, params, client) { let businessId = getPlayerBusiness(client); if(!getBusinessData(businessId)) { - messagePlayerError(client, "Business not found!"); + messagePlayerError(client, getLocaleString(client, "InvalidBusiness")); return false; } @@ -559,7 +559,7 @@ function setBusinessEntranceFeeCommand(command, params, client) { let businessId = getPlayerBusiness(client); if(!getBusinessData(businessId)) { - messagePlayerError(client, "Business not found!"); + messagePlayerError(client, getLocaleString(client, "InvalidBusiness")); return false; } @@ -583,7 +583,7 @@ function getBusinessInfoCommand(command, params, client) { } if(!getBusinessData(businessId)) { - messagePlayerError(client, "Business not found!"); + messagePlayerError(client, getLocaleString(client, "InvalidBusiness")); return false; } @@ -624,7 +624,7 @@ function getBusinessFloorItemsCommand(command, params, client) { } if(!getBusinessData(businessId)) { - messagePlayerError(client, "Business not found!"); + messagePlayerError(client, getLocaleString(client, "InvalidBusiness")); return false; } @@ -641,7 +641,7 @@ function getBusinessStorageItemsCommand(command, params, client) { } if(!getBusinessData(businessId)) { - messagePlayerError(client, "Business not found!"); + messagePlayerError(client, getLocaleString(client, "InvalidBusiness")); return false; } @@ -656,7 +656,7 @@ function setBusinessPickupCommand(command, params, client) { let businessId = getPlayerBusiness(client); if(!getBusinessData(businessId)) { - messagePlayerError(client, "Business not found!"); + messagePlayerError(client, getLocaleString(client, "InvalidBusiness")); return false; } @@ -687,7 +687,7 @@ function setBusinessInteriorTypeCommand(command, params, client) { let businessId = getPlayerBusiness(client); if(!getBusinessData(businessId)) { - messagePlayerError(client, "Business not found!"); + messagePlayerError(client, getLocaleString(client, "InvalidBusiness")); return false; } @@ -742,7 +742,7 @@ function setBusinessBlipCommand(command, params, client) { let businessId = getPlayerBusiness(client); if(!getBusinessData(businessId)) { - messagePlayerError(client, "Business not found!"); + messagePlayerError(client, getLocaleString(client, "InvalidBusiness")); return false; } @@ -773,7 +773,7 @@ function giveDefaultItemsToBusinessCommand(command, params, client) { let businessId = getPlayerBusiness(client); if(!getBusinessData(businessId)) { - messagePlayerError(client, "Business not found!"); + messagePlayerError(client, getLocaleString(client, "InvalidBusiness")); return false; } @@ -806,7 +806,7 @@ function setBusinessEntranceLabelToDealershipCommand(command, params, client) { let businessId = getPlayerBusiness(client); if(!getBusinessData(businessId)) { - messagePlayerError(client, "Business not found!"); + messagePlayerError(client, getLocaleString(client, "InvalidBusiness")); return false; } @@ -823,7 +823,7 @@ function deleteBusinessFloorItemsCommand(command, params, client) { let businessId = getPlayerBusiness(client); if(!getBusinessData(businessId)) { - messagePlayerError(client, "Business not found!"); + messagePlayerError(client, getLocaleString(client, "InvalidBusiness")); return false; } @@ -844,7 +844,7 @@ function deleteBusinessStorageItemsCommand(command, params, client) { let businessId = getPlayerBusiness(client); if(!getBusinessData(businessId)) { - messagePlayerError(client, "Business not found!"); + messagePlayerError(client, getLocaleString(client, "InvalidBusiness")); return false; } @@ -871,7 +871,7 @@ function withdrawFromBusinessCommand(command, params, client) { let businessId = getPlayerBusiness(client); if(!getBusinessData(businessId)) { - messagePlayerError(client, "Business not found!"); + messagePlayerError(client, getLocaleString(client, "InvalidBusiness")); return false; } @@ -907,7 +907,7 @@ function setBusinessBuyPriceCommand(command, params, client) { let businessId = getPlayerBusiness(client); if(!getBusinessData(businessId)) { - messagePlayerError(client, "Business not found!"); + messagePlayerError(client, getLocaleString(client, "InvalidBusiness")); return false; } @@ -942,7 +942,7 @@ function depositIntoBusinessCommand(command, params, client) { let businessId = getPlayerBusiness(client); if(!getBusinessData(businessId)) { - messagePlayerError(client, "Business not found!"); + messagePlayerError(client, getLocaleString(client, "InvalidBusiness")); return false; } @@ -995,7 +995,7 @@ function orderItemForBusinessCommand(command, params, client) { logToConsole(LOG_DEBUG, `[VRR.Business] ${getPlayerDisplayForConsole(client)} is ordering ${amount} ${splitParams.slice(0,-2).join(" ")} (${value})`); if(!getBusinessData(businessId)) { - messagePlayerError(client, "Business not found!"); + messagePlayerError(client, getLocaleString(client, "InvalidBusiness")); return false; } @@ -1041,7 +1041,7 @@ function viewBusinessTillAmountCommand(command, params, client) { } if(!getBusinessData(businessId)) { - messagePlayerError(client, "Business not found!"); + messagePlayerError(client, getLocaleString(client, "InvalidBusiness")); return false; } @@ -1059,7 +1059,7 @@ function buyBusinessCommand(command, params, client) { let businessId = getPlayerBusiness(client); if(!getBusinessData(businessId)) { - messagePlayerError(client, "Business not found!"); + messagePlayerError(client, getLocaleString(client, "InvalidBusiness")); return false; } @@ -1093,7 +1093,7 @@ function moveBusinessEntranceCommand(command, params, client) { } if(!getBusinessData(businessId)) { - messagePlayerError(client, "Business not found!"); + messagePlayerError(client, getLocaleString(client, "InvalidBusiness")); return false; } @@ -1124,7 +1124,7 @@ function moveBusinessExitCommand(command, params, client) { } if(!getBusinessData(businessId)) { - messagePlayerError(client, "Business not found!"); + messagePlayerError(client, getLocaleString(client, "InvalidBusiness")); return false; } @@ -1618,7 +1618,7 @@ function buyFromBusinessCommand(command, params, client) { let splitParams = params.split(" "); if(!getBusinessData(businessId)) { - messagePlayerError(client, "Business not found!"); + messagePlayerError(client, getLocaleString(client, "InvalidBusiness")); return false; } @@ -1716,7 +1716,7 @@ function setBusinessItemSellPriceCommand(command, params, client) { let businessId = getBusinessFromParams(splitParams[2]) || getPlayerBusiness(client); if(!getBusinessData(businessId)) { - messagePlayerError(client, "Business not found!"); + messagePlayerError(client, getLocaleString(client, "InvalidBusiness")); return false; } @@ -1751,7 +1751,7 @@ function storeItemInBusinessStorageCommand(command, params, client) { let businessId = getBusinessFromParams(splitParams[2]) || getPlayerBusiness(client); if(!getBusinessData(businessId)) { - messagePlayerError(client, "Business not found!"); + messagePlayerError(client, getLocaleString(client, "InvalidBusiness")); return false; } @@ -1787,7 +1787,7 @@ function stockItemOnBusinessFloorCommand(command, params, client) { let businessId = getPlayerBusiness(client); if(!getBusinessData(businessId)) { - messagePlayerError(client, "Business not found!"); + messagePlayerError(client, getLocaleString(client, "InvalidBusiness")); return false; } diff --git a/scripts/server/clan.js b/scripts/server/clan.js index 0fe5a808..0938b0d3 100644 --- a/scripts/server/clan.js +++ b/scripts/server/clan.js @@ -163,7 +163,7 @@ function listClanRanksCommand(command, params, client) { } if(!getClanData(clanId)) { - messagePlayerError(client, "Clan not found!"); + messagePlayerError(client, getLocaleString(client, "InvalidClan")); return false; } @@ -207,7 +207,7 @@ function deleteClanCommand(command, params, client) { let clanId = getClanFromParams(params); if(!getClanData(clanId)) { - messagePlayerError(client, "Clan not found!"); + messagePlayerError(client, getLocaleString(client, "InvalidClan")); return false; } @@ -233,12 +233,12 @@ function setClanOwnerCommand(command, params, client) { let targetClient = getPlayerFromParams(splitParams[1]); if(!targetClient) { - messagePlayerError(client, "Player not found!"); + messagePlayerError(client, getLocaleString(client, "InvalidPlayer")); return false; } if(!getClanData(clanId)) { - messagePlayerError(client, "Clan not found!"); + messagePlayerError(client, getLocaleString(client, "InvalidClan")); return false; } @@ -265,7 +265,7 @@ function setClanTagCommand(command, params, client) { let clanId = getPlayerClan(client); if(!getClanData(clanId)) { - messagePlayerError(client, "Clan not found!"); + messagePlayerError(client, getLocaleString(client, "InvalidClan")); return false; } @@ -290,7 +290,7 @@ function setClanNameCommand(command, params, client) { let clanId = getPlayerClan(client); if(!getClanData(clanId)) { - messagePlayerError(client, "Clan not found!"); + messagePlayerError(client, getLocaleString(client, "InvalidClan")); return false; } @@ -315,7 +315,7 @@ function createClanRankCommand(command, params, client) { let clanId = getPlayerClan(client); if(!getClanData(clanId)) { - messagePlayerError(client, "Clan not found!"); + messagePlayerError(client, getLocaleString(client, "InvalidClan")); return false; } @@ -345,7 +345,7 @@ function deleteClanRankCommand(command, params, client) { let clanId = getPlayerClan(client); if(!getClanData(clanId)) { - messagePlayerError(client, "Clan not found!"); + messagePlayerError(client, getLocaleString(client, "InvalidClan")); return false; } @@ -353,7 +353,7 @@ function deleteClanRankCommand(command, params, client) { let tempRankName = getClanRankData(clanId, rankId); if(!getClanRankData(clanId, rankId)) { - messagePlayerError(client, "Clan rank not found!"); + messagePlayerError(client, getLocaleString(client, "ClanRankInvalid")); return false; } @@ -379,7 +379,7 @@ function setClanMemberTagCommand(command, params, client) { let targetClient = getPlayerFromParams(splitParams[0]); if(!targetClient) { - messagePlayerError(client, "Player not found!"); + messagePlayerError(client, getLocaleString(client, "InvalidPlayer")); return false; } @@ -425,7 +425,7 @@ function setClanRankTagCommand(command, params, client) { let newTag = splitParams[splitParams.length-1]; if(!getClanRankData(clanId, rankId)) { - messagePlayerError(client, "Clan rank not found!"); + messagePlayerError(client, getLocaleString(client, "ClanRankInvalid")); return false; } @@ -456,7 +456,7 @@ function setClanRankLevelCommand(command, params, client) { let clanId = getPlayerClan(client); if(!getClanData(clanId)) { - messagePlayerError(client, "Clan not found!"); + messagePlayerError(client, getLocaleString(client, "InvalidClan")); return false; } @@ -464,7 +464,7 @@ function setClanRankLevelCommand(command, params, client) { let newLevel = splitParams[splitParams.length-1]; if(!getClanRankData(clanId, rankId)) { - messagePlayerError(client, "Clan rank not found!"); + messagePlayerError(client, getLocaleString(client, "ClanRankInvalid")); return false; } @@ -504,7 +504,7 @@ function addClanMemberFlagCommand(command, params, client) { let clanId = getPlayerClan(client); if(!getClanData(clanId)) { - messagePlayerError(client, "Clan not found!"); + messagePlayerError(client, getLocaleString(client, "InvalidClan")); return false; } @@ -512,7 +512,7 @@ function addClanMemberFlagCommand(command, params, client) { let targetClient = getPlayerFromParams(splitParams[0]); if(!targetClient) { - messagePlayerError(client, "Player not found!"); + messagePlayerError(client, getLocaleString(client, "InvalidPlayer")); return false; } @@ -556,7 +556,7 @@ function removeClanMemberFlagCommand(command, params, client) { let clanId = getPlayerClan(client); if(!getClanData(clanId)) { - messagePlayerError(client, "Clan not found!"); + messagePlayerError(client, getLocaleString(client, "InvalidClan")); return false; } @@ -564,7 +564,7 @@ function removeClanMemberFlagCommand(command, params, client) { let targetClient = getPlayerFromParams(splitParams[0]); if(!targetClient) { - messagePlayerError(client, "Player not found!"); + messagePlayerError(client, getLocaleString(client, "InvalidPlayer")); return false; } @@ -608,7 +608,7 @@ function addClanRankFlagCommand(command, params, client) { let clanId = getPlayerClan(client); if(!getClanData(clanId)) { - messagePlayerError(client, "Clan not found!"); + messagePlayerError(client, getLocaleString(client, "InvalidClan")); return false; } @@ -616,7 +616,7 @@ function addClanRankFlagCommand(command, params, client) { let rankId = getClanRankFromParams(clanId, splitParams[0]); if(!getClanRankData(clanId, rankId)) { - messagePlayerError(client, "Clan rank not found!"); + messagePlayerError(client, getLocaleString(client, "ClanRankInvalid")); return false; } @@ -647,7 +647,7 @@ function removeClanRankFlagCommand(command, params, client) { let clanId = getPlayerClan(client); if(!getClanData(clanId)) { - messagePlayerError(client, "Clan not found!"); + messagePlayerError(client, getLocaleString(client, "InvalidClan")); return false; } @@ -655,7 +655,7 @@ function removeClanRankFlagCommand(command, params, client) { let rankId = getClanRankFromParams(clanId, splitParams[0]); if(!getClanRankData(clanId, rankId)) { - messagePlayerError(client, "Clan rank not found!"); + messagePlayerError(client, getLocaleString(client, "ClanRankInvalid")); return false; } @@ -686,7 +686,7 @@ function showClanRankFlagsCommand(command, params, client) { let clanId = getPlayerClan(client); if(!getClanData(clanId)) { - messagePlayerError(client, "Clan not found!"); + messagePlayerError(client, getLocaleString(client, "InvalidClan")); return false; } @@ -694,7 +694,7 @@ function showClanRankFlagsCommand(command, params, client) { let rankId = getClanRankFromParams(clanId, splitParams[0]); if(!getClanRankData(clanId, rankId)) { - messagePlayerError(client, "Clan rank not found!"); + messagePlayerError(client, getLocaleString(client, "ClanRankInvalid")); return false; } @@ -734,7 +734,7 @@ function setClanMemberTitleCommand(command, params, client) { let clanId = getPlayerClan(client); if(!getClanData(clanId)) { - messagePlayerError(client, "Clan not found!"); + messagePlayerError(client, getLocaleString(client, "InvalidClan")); return false; } @@ -742,7 +742,7 @@ function setClanMemberTitleCommand(command, params, client) { let targetClient = getPlayerFromParams(splitParams[0]); if(!targetClient) { - messagePlayerError(client, "Player not found!"); + messagePlayerError(client, getLocaleString(client, "InvalidPlayer")); return false; } @@ -781,7 +781,7 @@ function setClanRankTitleCommand(command, params, client) { let clanId = getPlayerClan(client); if(!getClanData(clanId)) { - messagePlayerError(client, "Clan not found!"); + messagePlayerError(client, getLocaleString(client, "InvalidClan")); return false; } @@ -789,7 +789,7 @@ function setClanRankTitleCommand(command, params, client) { let rankId = getClanRankFromParams(clanId, splitParams[0]); if(!getClanRankData(clanId, rankId)) { - messagePlayerError(client, "Clan rank not found!"); + messagePlayerError(client, getLocaleString(client, "ClanRankInvalid")); return false; } @@ -814,7 +814,7 @@ function setClanMemberRankCommand(command, params, client) { let clanId = getPlayerClan(client); if(!getClanData(clanId)) { - messagePlayerError(client, "Clan not found!"); + messagePlayerError(client, getLocaleString(client, "InvalidClan")); return false; } @@ -823,12 +823,12 @@ function setClanMemberRankCommand(command, params, client) { let rankId = getClanRankFromParams(clanId, splitParams[1]); if(!targetClient) { - messagePlayerError(client, "Player not found!"); + messagePlayerError(client, getLocaleString(client, "InvalidPlayer")); return false; } if(!getClanRankData(clanId, rankId)) { - messagePlayerError(client, "Clan rank not found!"); + messagePlayerError(client, getLocaleString(client, "ClanRankInvalid")); return false; } @@ -1189,7 +1189,7 @@ function showClanFlagListCommand(command, params, client) { let clanId = getPlayerClan(client); if(!getClanData(clanId)) { - messagePlayerError(client, "Clan not found!"); + messagePlayerError(client, getLocaleString(client, "InvalidClan")); return false; } @@ -1197,7 +1197,7 @@ function showClanFlagListCommand(command, params, client) { let rankId = getClanRankFromParams(clanId, splitParams[0]); if(!getClanRankData(clanId, rankId)) { - messagePlayerError(client, "Clan rank not found!"); + messagePlayerError(client, getLocaleString(client, "ClanRankInvalid")); return false; } diff --git a/scripts/server/house.js b/scripts/server/house.js index 9f6069c2..969e9fd0 100644 --- a/scripts/server/house.js +++ b/scripts/server/house.js @@ -253,7 +253,7 @@ function setHouseClanCommand(command, params, client) { let clanId = getPlayerClan(params); if(!getClanData(clanId)) { - messagePlayerError(client, "Clan not found!"); + messagePlayerError(client, getLocaleString(client, "InvalidClan")); return false; } @@ -293,14 +293,14 @@ function setHouseClanCommand(command, params, client) { let clanId = getPlayerClan(params); if(!getClanData(clanId)) { - messagePlayerError(client, "Clan not found!"); + messagePlayerError(client, getLocaleString(client, "InvalidClan")); return false; } let clanRankId = getClanRankFromParams(clanId, params); if(!getClanRankData(clanId, clanRankId)) { - messagePlayerError(client, "Clan rank not found!"); + messagePlayerError(client, getLocaleString(client, "ClanRankInvalid")); return false; } @@ -335,7 +335,7 @@ function setHousePickupCommand(command, params, client) { let houseId = getPlayerHouse(client); if(!getHouseData(houseId)) { - messagePlayerError(client, "House not found!"); + messagePlayerError(client, getLocaleString(client, "InvalidHouse")); return false; } @@ -380,7 +380,7 @@ function setHouseInteriorTypeCommand(command, params, client) { let houseId = getPlayerHouse(client); if(!getHouseData(houseId)) { - messagePlayerError(client, "House not found!"); + messagePlayerError(client, getLocaleString(client, "InvalidHouse")); return false; } @@ -439,7 +439,7 @@ function setHouseBlipCommand(command, params, client) { let houseId = getPlayerHouse(client); if(!getHouseData(houseId)) { - messagePlayerError(client, "House not found!"); + messagePlayerError(client, getLocaleString(client, "InvalidHouse")); return false; } @@ -990,7 +990,7 @@ function getHouseInfoCommand(command, params, client) { } if(!getHouseData(houseId)) { - messagePlayerError(client, "House not found!"); + messagePlayerError(client, getLocaleString(client, "InvalidHouse")); return false; } @@ -1035,7 +1035,7 @@ function setHouseBuyPriceCommand(command, params, client) { let houseId = getPlayerHouse(client); if(!getHouseData(houseId)) { - messagePlayerError(client, "House not found!"); + messagePlayerError(client, getLocaleString(client, "InvalidHouse")); return false; } @@ -1063,7 +1063,7 @@ function setHouseRentPriceCommand(command, params, client) { let houseId = getPlayerHouse(client); if(!getHouseData(houseId)) { - messagePlayerError(client, "House not found!"); + messagePlayerError(client, getLocaleString(client, "InvalidHouse")); return false; } @@ -1083,7 +1083,7 @@ function buyHouseCommand(command, params, client) { let houseId = getPlayerHouse(client); if(!getHouseData(houseId)) { - messagePlayerError(client, "House not found!"); + messagePlayerError(client, getLocaleString(client, "InvalidHouse")); return false; } diff --git a/scripts/server/misc.js b/scripts/server/misc.js index f95daade..1caa1c3f 100644 --- a/scripts/server/misc.js +++ b/scripts/server/misc.js @@ -191,18 +191,18 @@ function enterExitPropertyCommand(command, params, client) { if(isEntrance) { if(getDistance(closestProperty.entrancePosition, getPlayerPosition(client)) <= getGlobalConfig().enterPropertyDistance) { if(closestProperty.locked) { - meActionToNearbyPlayers(client, `tries to open the ${(isBusiness) ? "business" : "house"} door but fails because it's locked`); + meActionToNearbyPlayers(client, getLocaleString(client, "EnterExitPropertyDoorLocked", (isBusiness) ? getLocaleString(client, "Business") : getLocaleString(client, "House"))); return false; } if(!closestProperty.hasInterior) { - messagePlayerAlert(client, `This ${(isBusiness) ? "business" : "house"} does not have an interior, but you can still use commands at the door icon.`); + messagePlayerAlert(client, getLocaleString(client, "PropertyNoInterior", (isBusiness) ? getLocaleString(client, "Business") : getLocaleString(client, "House"))); return false; } clearPlayerStateToEnterExitProperty(client); getPlayerData(client).pedState = VRR_PEDSTATE_ENTERINGPROPERTY; - meActionToNearbyPlayers(client, `opens the door and enters the ${(isBusiness) ? "business" : "house"}`); + meActionToNearbyPlayers(client, getLocaleString(client, "EntersProperty", (isBusiness) ? getLocaleString(client, "Business") : getLocaleString(client, "House"))); if(isFadeCameraSupported()) { fadeCamera(client, false, 1.0); @@ -232,12 +232,12 @@ function enterExitPropertyCommand(command, params, client) { } else { if(getDistance(closestProperty.exitPosition, getPlayerPosition(client)) <= getGlobalConfig().exitPropertyDistance) { if(closestProperty.locked) { - meActionToNearbyPlayers(client, `tries to open the ${(isBusiness) ? "business" : "house"} door but fails because it's locked`); + meActionToNearbyPlayers(client, getLocaleString(client, "EnterExitPropertyDoorLocked", (isBusiness) ? getLocaleString(client, "Business") : getLocaleString(client, "House"))); return false; } getPlayerData(client).pedState = VRR_PEDSTATE_EXITINGPROPERTY; clearPlayerStateToEnterExitProperty(client) - meActionToNearbyPlayers(client, `opens the door and exits the ${(isBusiness) ? "business" : "house"}`); + meActionToNearbyPlayers(client, getLocaleString(client, "ExitsProperty", (isBusiness) ? getLocaleString(client, "Business") : getLocaleString(client, "House"))); if(isFadeCameraSupported()) { fadeCamera(client, false, 1.0); @@ -276,7 +276,7 @@ function getPlayerInfoCommand(command, params, client) { targetClient = getPlayerFromParams(params); if(!getPlayerData(targetClient)) { - messagePlayerError(client, "Player not found!"); + messagePlayerError(client, getLocaleString(client, "InvalidPlayer")); return false; } } @@ -394,6 +394,7 @@ function gpsCommand(command, params, client) { case "skin": case "skins": case "clothes": + case "player": useType = VRR_ITEM_USETYPE_SKIN; break; @@ -402,6 +403,7 @@ function gpsCommand(command, params, client) { case "weapon": case "weapons": case "wep": + case "weps": useType = VRR_ITEM_USETYPE_WEAPON; break; @@ -414,10 +416,23 @@ function gpsCommand(command, params, client) { useType = VRR_ITEM_USETYPE_DRINK; break; + case "alcohol": + case "booze": + case "bar": + useType = VRR_ITEM_USETYPE_ALCOHOL; + break; + case "repair": + case "carrepair": + case "vehrepair": + case "spray": + case "fix": useType = VRR_ITEM_USETYPE_VEHREPAIR; break; + case "vehiclecolour": + case "vehcolour": + case "carcolour": case "colour": useType = VRR_ITEM_USETYPE_VEHCOLOUR; break; @@ -432,12 +447,12 @@ function gpsCommand(command, params, client) { let businessId = getClosestBusinessWithBuyableItemOfUseType(useType); if(!businessId) { - messagePlayerError(client, `There is no business with that item available`); + messagePlayerError(client, getLocaleString(client, "NoBusinessWithItemType")); return false; } if(!getBusinessData(businessId)) { - messagePlayerError(client, `There is no business with that item available`); + messagePlayerError(client, getLocaleString(client, "NoBusinessWithItemType")); return false; } diff --git a/scripts/server/moderation.js b/scripts/server/moderation.js index 06d3a3eb..b1f42c97 100644 --- a/scripts/server/moderation.js +++ b/scripts/server/moderation.js @@ -544,7 +544,7 @@ function playerInteriorCommand(command, params, client) { let splitParams = params.split(" "); let targetClient = getPlayerFromParams(splitParams[0]); if(!targetClient) { - messagePlayerError(client, "Player not found!"); + messagePlayerError(client, getLocaleString(client, "InvalidPlayer")); return false; } @@ -569,7 +569,7 @@ function playerVirtualWorldCommand(command, params, client) { let splitParams = params.split(" "); let targetClient = getPlayerFromParams(splitParams[0]); if(!targetClient) { - messagePlayerError(client, "Player not found!"); + messagePlayerError(client, getLocaleString(client, "InvalidPlayer")); return false; } diff --git a/scripts/server/radio.js b/scripts/server/radio.js index 47ea8afc..2b7cc0de 100644 --- a/scripts/server/radio.js +++ b/scripts/server/radio.js @@ -48,16 +48,16 @@ function playStreamingRadioCommand(command, params, client) { return false; } - let radioStationId = params; + let radioStationId = getRadioStationFromParams(params); if(radioStationId != 0 && typeof getServerData().radioStations[radioStationId-1] == "undefined") { - messagePlayerError(client, "That radio station ID does not exist!"); + messagePlayerError(client, getLocaleString(client, "InvalidRadioStation")); return false; } if(isPlayerInAnyVehicle(client)) { if(!getVehicleData(getPlayerVehicle(client))) { - messagePlayerError(client, "This is a random traffic vehicle and commands can't be used for it."); + messagePlayerError(client, getLocaleString(client, "RandomVehicleCommandsDisabled")); return false; } @@ -77,7 +77,7 @@ function playStreamingRadioCommand(command, params, client) { getVehicleData(getPlayerVehicle(client)).streamingRadioStation = radioStationId-1; getPlayerData(client).streamingRadioStation = radioStationId-1; - meActionToNearbyPlayers(client, `changes their vehicle's radio station to ${getRadioStationData(radioStationId-1).name} (${getRadioStationData(radioStationId-1).genre})`); + meActionToNearbyPlayers(client, getLocaleString(client, "ActionVehicleRadioStationChange", getRadioStationData(radioStationId-1).name, getRadioStationData(radioStationId-1).genre)); let clients = getClients(); for(let i in clients) { @@ -103,7 +103,7 @@ function playStreamingRadioCommand(command, params, client) { } else { getHouseData(houseId).streamingRadioStation = radioStationId-1; getPlayerData(client).streamingRadioStation = radioStationId-1; - meActionToNearbyPlayers(client, `changes their house radio station to ${getRadioStationData(radioStationId-1).name} (${getRadioStationData(radioStationId-1).genre})`); + meActionToNearbyPlayers(client, getLocaleString(client, "ActionHouseRadioStationChange", getRadioStationData(radioStationId-1).name, getRadioStationData(radioStationId-1).genre)); let clients = getClients(); for(let i in clients) { @@ -129,7 +129,7 @@ function playStreamingRadioCommand(command, params, client) { } else { getBusinessData(businessId).streamingRadioStation = radioStationId-1; getPlayerData(client).streamingRadioStation = radioStationId-1; - meActionToNearbyPlayers(client, `changes the business radio station to ${getRadioStationData(radioStationId-1).name} (${getRadioStationData(radioStationId-1).genre})`); + meActionToNearbyPlayers(client, getLocaleString(client, "ActionBusinessRadioStationChange", getRadioStationData(radioStationId-1).name, getRadioStationData(radioStationId-1).genre)); let clients = getClients(); for(let i in clients) { @@ -140,7 +140,7 @@ function playStreamingRadioCommand(command, params, client) { } } } else { - messagePlayerError(client, "You need to be in a vehicle, business, or house to set it's radio station!"); + messagePlayerError(client, getLocaleString(client, "RadioStationLocationInvalid")); return false; } } @@ -157,7 +157,7 @@ function setStreamingRadioVolumeCommand(command, params, client) { let volumeLevel = params; if(isNaN(volumeLevel)) { - messagePlayerError(client, "Volume level must a number"); + messagePlayerError(client, getLocaleString(client, "RadioVolumeNotNumber")); return false; } @@ -165,16 +165,16 @@ function setStreamingRadioVolumeCommand(command, params, client) { getPlayerData(client).accountData.streamingRadioVolume = toInteger(volumeLevel); let volumeEmoji = ''; if(volumeLevel >= 60) { - volumeEmoji = '🔊 '; + volumeEmoji = '🔊'; } else if(volumeLevel >= 30 && volumeLevel < 60) { - volumeEmoji = '🔉 '; + volumeEmoji = '🔉'; } else if(volumeLevel > 0 && volumeLevel < 30) { - volumeEmoji = '🔈 '; + volumeEmoji = '🔈'; } else if(volumeLevel <= 0) { - volumeEmoji = '🔇 '; + volumeEmoji = '🔇'; } - messagePlayerSuccess(client, `${volumeEmoji}You set your streaming radio volume to ${volumeLevel}%`); + messagePlayerSuccess(client, getLocaleString(client, "RadioVolumeChanged", volumeEmoji, volumeLevel)); } // =========================================================================== @@ -193,7 +193,7 @@ function showRadioStationListCommand(command, params, client) { let chunkedList = splitArrayIntoChunks(stationList, 4); - messagePlayerNormal(client, `{clanOrange}== {jobYellow}Radio Stations {clanOrange}===========================`); + messagePlayerNormal(client, makeChatSectionHeader(getLocaleString(client, "HeaderRadioStationsList"))); for(let i in chunkedList) { messagePlayerInfo(client, chunkedList[i].join(", ")); diff --git a/scripts/server/vehicle.js b/scripts/server/vehicle.js index 3566f8ec..1560c1f9 100644 --- a/scripts/server/vehicle.js +++ b/scripts/server/vehicle.js @@ -260,7 +260,7 @@ function vehicleLockCommand(command, params, client) { } if(!getVehicleData(vehicle)) { - messagePlayerError(client, "This is a random traffic vehicle and commands can't be used for it."); + messagePlayerError(client, getLocaleString(client, "RandomVehicleCommandsDisabled")); return false; } @@ -297,7 +297,7 @@ function vehicleTrunkCommand(command, params, client) { } if(!getVehicleData(vehicle)) { - messagePlayerError(client, "This is a random traffic vehicle and commands can't be used for it."); + messagePlayerError(client, getLocaleString(client, "RandomVehicleCommandsDisabled")); return false; } @@ -324,7 +324,7 @@ function vehicleLightsCommand(command, params, client) { let vehicle = getPlayerVehicle(client); if(!getVehicleData(vehicle)) { - messagePlayerError(client, "This is a random traffic vehicle and commands can't be used for it."); + messagePlayerError(client, getLocaleString(client, "RandomVehicleCommandsDisabled")); return false; } @@ -410,7 +410,7 @@ function vehicleSirenCommand(command, params, client) { let vehicle = getPlayerVehicle(client); if(!getVehicleData(vehicle)) { - messagePlayerError(client, "This is a random traffic vehicle and commands can't be used for it."); + messagePlayerError(client, getLocaleString(client, "RandomVehicleCommandsDisabled")); return false; } @@ -448,7 +448,7 @@ function vehicleAdminColourCommand(command, params, client) { let vehicle = getPlayerVehicle(client); if(!getVehicleData(vehicle)) { - messagePlayerError(client, "This is a random traffic vehicle and commands can't be used for it."); + messagePlayerError(client, getLocaleString(client, "RandomVehicleCommandsDisabled")); return false; } @@ -491,7 +491,7 @@ function vehicleAdminRepairCommand(command, params, client) { let vehicle = getPlayerVehicle(client); if(!getVehicleData(vehicle)) { - messagePlayerError(client, "This is a random traffic vehicle and commands can't be used for it."); + messagePlayerError(client, getLocaleString(client, "RandomVehicleCommandsDisabled")); return false; } @@ -526,7 +526,7 @@ function vehicleAdminLiveryCommand(command, params, client) { let vehicle = getPlayerVehicle(client); if(!getVehicleData(vehicle)) { - messagePlayerError(client, "This is a random traffic vehicle and commands can't be used for it."); + messagePlayerError(client, getLocaleString(client, "RandomVehicleCommandsDisabled")); return false; } @@ -567,7 +567,7 @@ function buyVehicleCommand(command, params, client) { let vehicle = getPlayerVehicle(client); if(!getVehicleData(vehicle)) { - messagePlayerError(client, "This is a random traffic vehicle and commands can't be used for it."); + messagePlayerError(client, getLocaleString(client, "RandomVehicleCommandsDisabled")); return false; } @@ -602,7 +602,7 @@ function rentVehicleCommand(command, params, client) { let vehicle = getPlayerVehicle(client); if(!getVehicleData(vehicle)) { - messagePlayerError(client, "This is a random traffic vehicle and commands can't be used for it."); + messagePlayerError(client, getLocaleString(client, "RandomVehicleCommandsDisabled")); return false; } @@ -648,7 +648,7 @@ function rentVehicleCommand(command, params, client) { // =========================================================================== function enterVehicleAsPassengerCommand(command, params, client) { - triggerNetworkEvent("vrr.passenger", client); + sendNetworkEventToPlayer("vrr.passenger", client); } // =========================================================================== @@ -791,7 +791,7 @@ function setVehicleRankCommand(command, params, client) { if(getVehicleData(vehicle).ownerType == VRR_VEHOWNER_CLAN) { rankId = getClanRankFromParams(getVehicleData(vehicle).ownerId, params); if(!getClanRankData(getVehicleData(vehicle).ownerId, rankId)) { - messagePlayerError(client, "Clan rank not found!"); + messagePlayerError(client, getLocaleString(client, "ClanRankInvalid")); return false; } getVehicleData(vehicle).rank = getClanRankData(getVehicleData(vehicle).ownerId, rankId).databaseId; From 290b5122529155dd5fdcf86bc99b85a65e9c0bd4 Mon Sep 17 00:00:00 2001 From: Vortrex <3858226+VortrexFTW@users.noreply.github.com> Date: Sun, 9 Jan 2022 05:27:22 -0600 Subject: [PATCH 084/337] Fixed tazed anim wrong type --- scripts/shared/gamedata.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/shared/gamedata.js b/scripts/shared/gamedata.js index b48bd13f..68a3ae65 100644 --- a/scripts/shared/gamedata.js +++ b/scripts/shared/gamedata.js @@ -3177,7 +3177,7 @@ let gameData = { ["sitright", 0, 111, VRR_ANIMTYPE_NORMAL, 0.0, null, null, null, null, VRR_ANIMMOVE_RIGHT], ["sitforward", 0, 111, VRR_ANIMTYPE_NORMAL, 0.0, null, null, null, null, VRR_ANIMMOVE_FORWARD], ["sitarmright", 0, 120, VRR_ANIMTYPE_NORMAL, 0.0, null, null, null, null, VRR_ANIMMOVE_BACK], - ["tazed", 0, 13, VRR_ANIMTYPE_FREEZE, 0.0, null, null, null, null, VRR_ANIMMOVE_NONE], + ["tazed", 0, 13, VRR_ANIMTYPE_FORCED, 0.0, null, null, null, null, VRR_ANIMMOVE_NONE], ], [ // GTA VC ["walk", 0, 0, VRR_ANIMTYPE_NORMAL, 0.0, null, null, null, null, VRR_ANIMMOVE_NONE], From 2d833d00c3ddccd8ee0ba2b0b88dfa3efac42e2a Mon Sep 17 00:00:00 2001 From: Vortrex <3858226+VortrexFTW@users.noreply.github.com> Date: Sun, 9 Jan 2022 05:27:44 -0600 Subject: [PATCH 085/337] Move bool/int conversion utils to shared --- scripts/shared/utilities.js | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/scripts/shared/utilities.js b/scripts/shared/utilities.js index 9fa21035..00eb2350 100644 --- a/scripts/shared/utilities.js +++ b/scripts/shared/utilities.js @@ -865,4 +865,16 @@ function splitArrayIntoChunks(originalArray, perChunk) { return tempArray; } +// =========================================================================== + +function intToBool(intVal) { + return (intVal == 1) ? true : false; +} + +// =========================================================================== + +function boolToInt(boolVal) { + return (boolVal) ? 1 : 0; +} + // =========================================================================== \ No newline at end of file From b5540fc5d38f4310ef3b8dc3ae6893952f0698a2 Mon Sep 17 00:00:00 2001 From: Vortrex <3858226+VortrexFTW@users.noreply.github.com> Date: Sun, 9 Jan 2022 05:28:05 -0600 Subject: [PATCH 086/337] Only update conn log if valid + chat msg header util --- scripts/server/utilities.js | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/scripts/server/utilities.js b/scripts/server/utilities.js index 55f430c7..34352b41 100644 --- a/scripts/server/utilities.js +++ b/scripts/server/utilities.js @@ -592,18 +592,6 @@ function canClientUseGuns(client) { // =========================================================================== -function intToBool(intVal) { - return (intVal == 1) ? true : false; -} - -// =========================================================================== - -function boolToInt(boolVal) { - return (boolVal) ? 1 : 0; -} - -// =========================================================================== - function sendAllBlips(client) { sendAllPoliceStationBlips(client); sendAllFireStationBlips(client); @@ -1395,7 +1383,9 @@ function isConsole(client) { // =========================================================================== function updateConnectionLogOnQuit(client, quitReasonId) { - quickDatabaseQuery(`UPDATE conn_main SET conn_when_disconnect=NOW(), conn_how_disconnect=${quitReasonId} WHERE conn_id = ${getPlayerData(client).connectionId}`); + if(getPlayerData(client) != false) { + quickDatabaseQuery(`UPDATE conn_main SET conn_when_disconnect=NOW(), conn_how_disconnect=${quitReasonId} WHERE conn_id = ${getPlayerData(client).connectionId}`); + } } // =========================================================================== @@ -1539,4 +1529,14 @@ function clearTemporaryPeds() { } } } -} \ No newline at end of file +} + +// =========================================================================== + +function makeChatSectionHeader(name) { + let resultString = `== ${name} `; + let endFiller = fillStringWithCharacter("=", getGlobalConfig().chatSectionHeaderLength-resultString.length); + return `${resultString} ${endFiller}`; +} + +// =========================================================================== \ No newline at end of file From b30ff1735263417ea894f685b98db3c9e9123e02 Mon Sep 17 00:00:00 2001 From: Vortrex <3858226+VortrexFTW@users.noreply.github.com> Date: Sun, 9 Jan 2022 05:28:19 -0600 Subject: [PATCH 087/337] Add anim freeze type const --- scripts/shared/const.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/shared/const.js b/scripts/shared/const.js index 80ac8964..4d27d354 100644 --- a/scripts/shared/const.js +++ b/scripts/shared/const.js @@ -67,7 +67,7 @@ const VRR_ANIMTYPE_SHARED = 3; // Forces this animation to play const VRR_ANIMTYPE_SPECIALACTION = 4; // This animtype uses a special action (only in SA) const VRR_ANIMTYPE_SURRENDER = 5; // This animtype is used to surrender (like handsup or cower) const VRR_ANIMTYPE_FORCED = 6; // This animtype is forced (can't use stopanim to get out of it) -const VRR_ANIMTYPE_FREEZE = 6; // This animtype is forced (can't use stopanim to get out of it) +const VRR_ANIMTYPE_FREEZE = 7; // This animtype is forced (can't use stopanim to get out of it) // Animation Move Types const VRR_ANIMMOVE_NONE = 0; From 38de06740ce8bda3cecd2dd8f9219d72e05b7109 Mon Sep 17 00:00:00 2001 From: Vortrex <3858226+VortrexFTW@users.noreply.github.com> Date: Sun, 9 Jan 2022 05:28:30 -0600 Subject: [PATCH 088/337] Remove old translation system --- scripts/server/translate.js | 235 ------------------------------------ 1 file changed, 235 deletions(-) delete mode 100644 scripts/server/translate.js diff --git a/scripts/server/translate.js b/scripts/server/translate.js deleted file mode 100644 index aa6d902c..00000000 --- a/scripts/server/translate.js +++ /dev/null @@ -1,235 +0,0 @@ -// =========================================================================== -// Vortrex's Roleplay Resource -// https://github.com/VortrexFTW/gtac_roleplay -// =========================================================================== -// FILE: translate.js -// DESC: Provides translation functions -// TYPE: Server (JavaScript) -// =========================================================================== - -let translationBaseURL = `http://api.mymemory.translated.net/get?de=example@example.com&q={0}&langpair={1}|{2}`; - -let translationLanguages = [ - ["Abkhazian", "AB"], - ["Afar", "AA"], - ["Afrikaans", "AF"], - ["Albanian", "SQ"], - ["Amharic", "AM"], - ["Arabic", "AR"], - ["Armenian", "HY"], - ["Assamese", "AS"], - ["Aymara", "AY"], - ["Azerbaijani", "AZ"], - ["Bashkir", "BA"], - ["Basque", "EU"], - ["Bengali, Bangla", "BN"], - ["Bhutani", "DZ"], - ["Bihari", "BH"], - ["Bislama", "BI"], - ["Breton", "BR"], - ["Bulgarian", "BG"], - ["Burmese", "MY"], - ["Byelorussian", "BE"], - ["Cambodian", "KM"], - ["Catalan", "CA"], - ["Chinese", "ZH"], - ["Corsican", "CO"], - ["Croatian", "HR"], - ["Czech", "CS"], - ["Danish", "DA"], - ["Dutch", "NL"], - ["English", "EN"], - ["Esperanto", "EO"], - ["Estonian", "ET"], - ["Faeroese", "FO"], - ["Fiji", "FJ"], - ["Finnish", "FI"], - ["French", "FR"], - ["Frisian", "FY"], - ["Gaelic (Scots Gaelic)", "GD"], - ["Galician", "GL"], - ["Georgian", "KA"], - ["German", "DE"], - ["Greek", "EL"], - ["Greenlandic", "KL"], - ["Guarani", "GN"], - ["Gujarati", "GU"], - ["Hausa", "HA"], - ["Hebrew", "IW"], - ["Hindi", "HI"], - ["Hungarian", "HU"], - ["Icelandic", "IS"], - ["Indonesian", "IN"], - ["Interlingua", "IA"], - ["Interlingue", "IE"], - ["Inupiak", "IK"], - ["Irish", "GA"], - ["Italian", "IT"], - ["Japanese", "JA"], - ["Javanese", "JW"], - ["Kannada", "KN"], - ["Kashmiri", "KS"], - ["Kazakh", "KK"], - ["Kinyarwanda", "RW"], - ["Kirghiz", "KY"], - ["Kirundi", "RN"], - ["Korean", "KO"], - ["Kurdish", "KU"], - ["Laothian", "LO"], - ["Latin", "LA"], - ["Latvian, Lettish", "LV"], - ["Lingala", "LN"], - ["Lithuanian", "LT"], - ["Macedonian", "MK"], - ["Malagasy", "MG"], - ["Malay", "MS"], - ["Malayalam", "ML"], - ["Maltese", "MT"], - ["Maori", "MI"], - ["Marathi", "MR"], - ["Moldavian", "MO"], - ["Mongolian", "MN"], - ["Nauru", "NA"], - ["Nepali", "NE"], - ["Norwegian", "NO"], - ["Occitan", "OC"], - ["Oriya", "OR"], - ["Oromo, Afan", "OM"], - ["Pashto, Pushto", "PS"], - ["Persian", "FA"], - ["Polish", "PL"], - ["Portuguese", "PT"], - ["Punjabi", "PA"], - ["Quechua", "QU"], - ["Rhaeto-Romance", "RM"], - ["Romanian", "RO"], - ["Russian", "RU"], - ["Samoan", "SM"], - ["Sangro", "SG"], - ["Sanskrit", "SA"], - ["Serbian", "SR"], - ["Serbo-Croatian", "SH"], - ["Sesotho", "ST"], - ["Setswana", "TN"], - ["Shona", "SN"], - ["Sindhi", "SD"], - ["Singhalese", "SI"], - ["Siswati", "SS"], - ["Slovak", "SK"], - ["Slovenian", "SL"], - ["Somali", "SO"], - ["Spanish", "ES"], - ["Sudanese", "SU"], - ["Swahili", "SW"], - ["Swedish", "SV"], - ["Tagalog", "TL"], - ["Tajik", "TG"], - ["Tamil", "TA"], - ["Tatar", "TT"], - ["Tegulu", "TE"], - ["Thai", "TH"], - ["Tibetan", "BO"], - ["Tigrinya", "TI"], - ["Tonga", "TO"], - ["Tsonga", "TS"], - ["Turkish", "TR"], - ["Turkmen", "TK"], - ["Twi", "TW"], - ["Ukrainian", "UK"], - ["Urdu", "UR"], - ["Uzbek", "UZ"], - ["Vietnamese", "VI"], - ["Volapuk", "VO"], - ["Welsh", "CY"], - ["Wolof", "WO"], - ["Xhosa", "XH"], - ["Yiddish", "JI"], - ["Yoruba", "YO"], - ["Zulu", "ZU"] -], - -// =========================================================================== - -translationCache = []; - -// =========================================================================== - -async function translateMessage(messageText, translateFrom = defaultLanguageId, translateTo = defaultLanguageId) { - if(translateFrom == translateTo) { - return messageText; - } - - return new Promise(resolve => { - for(let i in translationCache[translateFrom][translateTo]) { - if(translationCache[translateFrom][translateTo][0] == messageText) { - logToConsole(LOG_DEBUG, `[Translate]: Using existing translation for ${translationLanguages[translateFrom][0]} to ${translationLanguages[translateTo][0]} - (${messageText}), (${translationCache[translateFrom][translateTo][1]})`); - resolve(translationCache[translateFrom][translateTo][1]); - } - } - - let thisTranslationURL = translateURL.format(encodeURI(messageText), translationLanguages[translateFrom][1], translationLanguages[translateTo][1], scriptConfig.translatorEmailAddress); - httpGet( - thisTranslationURL, - "", - function(data) { - data = String(data).substr(0, String(data).lastIndexOf("}")+1); - let translationData = JSON.parse(data); - translationCache[translateFrom][translateTo].push([messageText, translationData.responseData.translatedText]); - resolve(translationData.responseData.translatedText); - }, - function(data) { - } - ); - }); -} - -// =========================================================================== - -function addTranslationToCache(originalText, translatedText, fromLanguageId, toLanguageId) { - translationCache[fromLanguageId][toLanguageId].push([originalText, translatedText]); - return true; -} - -// =========================================================================== - -function formatTranslationURL(originalText, fromLanguageId, toLanguageId) { - return getServerData().translation.translationBaseURL.format(encodeURI(originalText), getLanguageShortCode(fromLanguageId), getLanguageShortCode(toLanguageId)); -} - -// =========================================================================== - -function getLanguageShortCode(languageId) { - return translationLanguages[languageId][1]; -} - -// =========================================================================== - -function getLanguageFullName(languageId) { - return translationLanguages[languageId][0]; -} - -// =========================================================================== - -function getLanguageIdFromFullName(languageName) { - let languages = translationLanguages; - for(let i in languages) { - if(languages[i][0] == languageName) { - return i; - } - } - return false; -} - -// =========================================================================== - -function getLanguageIdFromShortCode(languageShortCode) { - let languages = translationLanguages; - for(let i in languages) { - if(languages[i][1] == languageShortCode) { - return i; - } - } - return false; -} - -// =========================================================================== \ No newline at end of file From f1c63023859cb4acd53f7171658ba7330ed7cf20 Mon Sep 17 00:00:00 2001 From: Vortrex <3858226+VortrexFTW@users.noreply.github.com> Date: Sun, 9 Jan 2022 05:28:47 -0600 Subject: [PATCH 089/337] Remove old char inhouse/inbiz data save --- scripts/server/subaccount.js | 2 -- 1 file changed, 2 deletions(-) diff --git a/scripts/server/subaccount.js b/scripts/server/subaccount.js index 3ea74ba3..c80fde68 100644 --- a/scripts/server/subaccount.js +++ b/scripts/server/subaccount.js @@ -122,8 +122,6 @@ function saveSubAccountToDatabase(subAccountData) { ["sacct_rot_z", subAccountData.spawnHeading], ["sacct_int", subAccountData.interior], ["sacct_vw", subAccountData.dimension], - ["sacct_inhouse", (subAccountData.inHouse != 0) ? getHouseData(subAccountData.inHouse).databaseId : 0], - ["sacct_inbusiness", (subAccountData.inBusiness != 0) ? getBusinessData(subAccountData.inBusiness).databaseId : 0], ["sacct_health", subAccountData.health], ["sacct_armour", subAccountData.armour], ["sacct_accent", subAccountData.accent], From 2252388a6847ad21a7838793d300a6f329d268f3 Mon Sep 17 00:00:00 2001 From: Vortrex <3858226+VortrexFTW@users.noreply.github.com> Date: Sun, 9 Jan 2022 05:29:08 -0600 Subject: [PATCH 090/337] Only use lightbulb emoji for tip msg header --- scripts/server/messaging.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/server/messaging.js b/scripts/server/messaging.js index 3949fbfd..373e8bc8 100644 --- a/scripts/server/messaging.js +++ b/scripts/server/messaging.js @@ -197,7 +197,7 @@ function messagePlayerAdminChat(client, adminChattingClient, messageText) { function messagePlayerNewbieTip(client, message) { if(!hasBitFlag(getPlayerData(client).accountData.settings, getAccountSettingsFlagValue("NoActionTips"))) { - messagePlayerNormal(client, `💡 TIP: ${message}`); + messagePlayerNormal(client, `💡 ${message}`); } } @@ -206,7 +206,7 @@ function messagePlayerNewbieTip(client, message) { function messagePlayerTimedRandomTip(client, message) { if(isPlayerLoggedIn(client) && isPlayerSpawned(client)) { if(!hasBitFlag(getPlayerData(client).accountData.settings, getAccountSettingsFlagValue("NoRandomTips"))) { - messagePlayerNormal(client, `💡 TIP: ${message}`); + messagePlayerNormal(client, `💡 ${message}`); } } } From c08bade4920c63d47e630679af3c2f5edffe10df Mon Sep 17 00:00:00 2001 From: Vortrex <3858226+VortrexFTW@users.noreply.github.com> Date: Sun, 9 Jan 2022 05:29:24 -0600 Subject: [PATCH 091/337] Use new force player anim util for tazer --- scripts/server/item/tazer.js | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/scripts/server/item/tazer.js b/scripts/server/item/tazer.js index 799b9501..f4fa16d5 100644 --- a/scripts/server/item/tazer.js +++ b/scripts/server/item/tazer.js @@ -21,19 +21,12 @@ function tazePlayer(client) { let animationId = getAnimationFromParams("tazed"); if(animationId != false) { - forcePedAnimation(client.player, animationId); - - getPlayerData(client).currentAnimation = animationId; - getPlayerData(client).currentAnimationPositionOffset = toVector3(0.0, 0.0, 0.0); - getPlayerData(client).currentAnimationPositionReturnTo = getPlayerPosition(client); - getPlayerData(client).animationStart = getCurrentUnixTimestamp(); - getPlayerData(client).animationForced = true; + forcePlayerPlayAnimation(client, animationId); } setTimeout(function() { unTazePlayer(client); doActionToNearbyPlayers(client, `The tazer effect wears off`); - }, getGlobalConfig().tazerEffectDuration); } @@ -45,8 +38,7 @@ function unTazePlayer(client) { setPlayerControlState(client, true); setPlayerPosition(client, getPlayerData(client).currentAnimationPositionReturnTo); makePedStopAnimation(getPlayerData(client).ped); - setPlayerMouseCameraState(client, false); - getPlayerData(client).forcedPedAnimation = -1; + } // =========================================================================== \ No newline at end of file From 39e9664ae0a5b18ea31a9d0aabc022d1bf002f1e Mon Sep 17 00:00:00 2001 From: Vortrex <3858226+VortrexFTW@users.noreply.github.com> Date: Sun, 9 Jan 2022 05:30:00 -0600 Subject: [PATCH 092/337] Use new force player anim util for item actions --- scripts/server/item.js | 29 +++++++++++++++-------------- 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/scripts/server/item.js b/scripts/server/item.js index e7bf69db..aadad5b8 100644 --- a/scripts/server/item.js +++ b/scripts/server/item.js @@ -218,7 +218,7 @@ function useItemCommand(command, params, client) { } if(getItemTypeData(getItemData(itemId).itemTypeIndex).useAnimationIndex != false) { - makePlayerPlayAnimation(client, getItemTypeData(getItemData(itemId).itemTypeIndex).useAnimationIndex, 0.0); + forcePlayerPlayAnimation(client, getItemTypeData(getItemData(itemId).itemTypeIndex).useAnimationIndex, 0.0); } getPlayerData(client).itemActionState = VRR_ITEM_ACTION_USE; @@ -291,7 +291,7 @@ function pickupItemCommand(command, params, client) { } if(getItemTypeData(getItemData(itemId).itemTypeIndex).dropAnimationIndex != false) { - makePlayerPlayAnimation(client, getItemTypeData(getItemData(itemId).itemTypeIndex).pickupAnimationIndex, 0.0); + forcePlayerPlayAnimation(client, getItemTypeData(getItemData(itemId).itemTypeIndex).pickupAnimationIndex, 0.0); } getPlayerData(client).itemActionState = VRR_ITEM_ACTION_PICKUP; @@ -352,7 +352,7 @@ function dropItemCommand(command, params, client) { } if(getItemTypeData(getItemData(itemId).itemTypeIndex).dropAnimationIndex != false) { - makePlayerPlayAnimation(client, getItemTypeData(getItemData(itemId).itemTypeIndex).dropAnimationIndex, 0.0); + forcePlayerPlayAnimation(client, getItemTypeData(getItemData(itemId).itemTypeIndex).dropAnimationIndex, 0.0); } getPlayerData(client).itemActionState = VRR_ITEM_ACTION_DROP; @@ -399,7 +399,7 @@ function putItemCommand(command, params, client) { } if(getItemTypeData(getItemData(itemId).itemTypeIndex).putAnimationIndex != false) { - makePlayerPlayAnimation(client, getItemTypeData(getItemData(itemId).itemTypeIndex).putAnimationIndex, 0.0); + forcePlayerPlayAnimation(client, getItemTypeData(getItemData(itemId).itemTypeIndex).putAnimationIndex, 0.0); } getPlayerData(client).itemActionItem = hotBarSlot; @@ -446,7 +446,7 @@ function takeItemCommand(command, params, client) { //} if(getItemTypeData(getItemData(itemId).itemTypeIndex).takeAnimationIndex != false) { - makePlayerPlayAnimation(client, getItemTypeData(getItemData(itemId).itemTypeIndex).takeAnimationIndex, 0.0); + forcePlayerPlayAnimation(client, getItemTypeData(getItemData(itemId).itemTypeIndex).takeAnimationIndex, 0.0); } getPlayerData(client).itemActionItem = itemId; @@ -481,7 +481,7 @@ function setItemTypeDropModelCommand(command, params, client) { let modelId = splitParams[splitParams.length-1]; if(!getItemTypeData(itemTypeIndex)) { - messagePlayerError(client, `Invalid item type`); + messagePlayerError(client, getLocaleString(client, "InvalidItemType")); return false; } @@ -502,7 +502,7 @@ function setItemTypeOrderPriceCommand(command, params, client) { let orderPrice = splitParams[splitParams.length-1]; if(!getItemTypeData(itemTypeIndex)) { - messagePlayerError(client, `Invalid item type`); + messagePlayerError(client, getLocaleString(client, "InvalidItemType")); return false; } @@ -523,7 +523,7 @@ function setItemTypeRiskMultiplierCommand(command, params, client) { let riskMultiplier = splitParams[splitParams.length-1]; if(!getItemTypeData(itemTypeIndex)) { - messagePlayerError(client, `Invalid item type`); + messagePlayerError(client, getLocaleString(client, "InvalidItemType")); return false; } @@ -542,7 +542,7 @@ function toggleItemTypeEnabledCommand(command, params, client) { let itemTypeIndex = getItemTypeFromParams(params); if(!getItemTypeData(itemTypeIndex)) { - messagePlayerError(client, `Invalid item type`); + messagePlayerError(client, getLocaleString(client, "InvalidItemType")); return false; } @@ -563,7 +563,7 @@ function setItemTypeUseTypeCommand(command, params, client) { let useType = splitParams[splitParams.length-1]; if(!getItemTypeData(itemTypeIndex)) { - messagePlayerError(client, `Invalid item type`); + messagePlayerError(client, getLocaleString(client, "InvalidItemType")); return false; } @@ -584,7 +584,7 @@ function setItemTypeUseValueCommand(command, params, client) { let useValue = splitParams[splitParams.length-1]; if(!getItemTypeData(itemTypeIndex)) { - messagePlayerError(client, `Invalid item type`); + messagePlayerError(client, getLocaleString(client, "InvalidItemType")); return false; } @@ -1372,7 +1372,7 @@ function listBusinessStorageInventoryCommand(command, params, client) { let businessId = (isPlayerInAnyBusiness(client)) ? getPlayerBusiness(client) : getClosestBusinessEntrance(getPlayerPosition(client)); if(!getBusinessData(businessId)) { - messagePlayerError(client, "Business not found!"); + messagePlayerError(client, getLocaleString(client, "InvalidBusiness")); return false; } @@ -1390,7 +1390,7 @@ function listBusinessFloorInventoryCommand(command, params, client) { let businessId = (isPlayerInAnyBusiness(client)) ? getPlayerBusiness(client) : getClosestBusinessEntrance(getPlayerPosition(client)); if(!getBusinessData(businessId)) { - messagePlayerError(client, "Business not found!"); + messagePlayerError(client, getLocaleString(client, "InvalidBusiness")); return false; } @@ -1408,7 +1408,7 @@ function listHouseInventoryCommand(command, params, client) { let houseId = (isPlayerInAnyHouse(client)) ? getPlayerHouse(client) : getClosestHouseEntrance(getPlayerPosition(client)); if(!getHouseData(houseId)) { - messagePlayerError(client, "House not found!"); + messagePlayerError(client, getLocaleString(client, "InvalidHouse")); return false; } @@ -1851,6 +1851,7 @@ function getOrderPriceForItemType(itemType) { function clearPlayerItemActionState(client) { getPlayerData(client).itemActionState = VRR_ITEM_ACTION_NONE; getPlayerData(client).itemActionItem = -1; + makePlayerStopAnimation(client); } // =========================================================================== From 0cc861fd944a2b19dbebbabaf59acb7107645267 Mon Sep 17 00:00:00 2001 From: Vortrex <3858226+VortrexFTW@users.noreply.github.com> Date: Sun, 9 Jan 2022 05:30:30 -0600 Subject: [PATCH 093/337] Add generic alcohol item use-type const --- scripts/server/const.js | 1 + 1 file changed, 1 insertion(+) diff --git a/scripts/server/const.js b/scripts/server/const.js index 4833f562..7850e756 100644 --- a/scripts/server/const.js +++ b/scripts/server/const.js @@ -222,6 +222,7 @@ const VRR_ITEM_USETYPE_SNORTDRUG = 49; // const VRR_ITEM_USETYPE_PLANT = 50; const VRR_ITEM_USETYPE_MEGAPHONE = 51; const VRR_ITEM_USETYPE_INJECTDRUG = 52; +const VRR_ITEM_USETYPE_ALCOHOL = 53; // Item Drop Types const VRR_ITEM_DROPTYPE_NONE = 0; // Can't be dropped From f94785be9b971b49553d5eaa1d916ac16b3c9715 Mon Sep 17 00:00:00 2001 From: Vortrex <3858226+VortrexFTW@users.noreply.github.com> Date: Sun, 9 Jan 2022 05:31:19 -0600 Subject: [PATCH 094/337] Check if player spawned for prox chat --- scripts/server/chat.js | 54 ++++++++++++++++++++++++++++-------------- 1 file changed, 36 insertions(+), 18 deletions(-) diff --git a/scripts/server/chat.js b/scripts/server/chat.js index bc0b1c1e..fd4e7447 100644 --- a/scripts/server/chat.js +++ b/scripts/server/chat.js @@ -152,8 +152,10 @@ function clanChatCommand(command, params, client) { function talkToNearbyPlayers(client, messageText) { let clients = getClients(); for(let i in clients) { - if(hasBitFlag(getPlayerData(clients[i]).accountData.flags.moderation, getModerationFlagValue("CanHearEverything")) || (getDistance(getPlayerPosition(client), getPlayerPosition(clients[i])) <= getGlobalConfig().talkDistance && getPlayerDimension(client) == getPlayerDimension(clients[i]))) { - messagePlayerTalk(clients[i], client, messageText); + if(isPlayerSpawned(clients[i])) { + if(hasBitFlag(getPlayerData(clients[i]).accountData.flags.moderation, getModerationFlagValue("CanHearEverything")) || (getDistance(getPlayerPosition(client), getPlayerPosition(clients[i])) <= getGlobalConfig().talkDistance && getPlayerDimension(client) == getPlayerDimension(clients[i]))) { + messagePlayerTalk(clients[i], client, messageText); + } } } } @@ -163,8 +165,10 @@ function talkToNearbyPlayers(client, messageText) { function phoneOutgoingToNearbyPlayers(client, messageText) { let clients = getClients(); for(let i in clients) { - if(hasBitFlag(getPlayerData(clients[i]).accountData.flags.moderation, getModerationFlagValue("CanHearEverything")) || (getDistance(getPlayerPosition(client), getPlayerPosition(clients[i])) <= getGlobalConfig().talkDistance && getPlayerDimension(client) == getPlayerDimension(clients[i]))) { - messagePlayerNormal(`[#CCCCCC]${getCharacterFullName(client)} {ALTCOLOUR}(to phone): {MAINCOLOUR}${messageText}`); + if(isPlayerSpawned(clients[i])) { + if(hasBitFlag(getPlayerData(clients[i]).accountData.flags.moderation, getModerationFlagValue("CanHearEverything")) || (getDistance(getPlayerPosition(client), getPlayerPosition(clients[i])) <= getGlobalConfig().talkDistance && getPlayerDimension(client) == getPlayerDimension(clients[i]))) { + messagePlayerNormal(`[#CCCCCC]${getCharacterFullName(client)} {ALTCOLOUR}(to phone): {MAINCOLOUR}${messageText}`); + } } } } @@ -174,8 +178,10 @@ function phoneOutgoingToNearbyPlayers(client, messageText) { function phoneIncomingToNearbyPlayers(client, messageText) { let clients = getClients(); for(let i in clients) { - if(hasBitFlag(getPlayerData(clients[i]).accountData.flags.moderation, getModerationFlagValue("CanHearEverything")) || (getDistance(getPlayerPosition(client), getPlayerPosition(clients[i])) <= getGlobalConfig().phoneSpeakerDistance && getPlayerDimension(client) == getPlayerDimension(clients[i]))) { - messagePlayerNormal(`[#CCCCCC]${getCharacterFullName(client)} {ALTCOLOUR}(from phone): {MAINCOLOUR}${messageText}`); + if(isPlayerSpawned(clients[i])) { + if(hasBitFlag(getPlayerData(clients[i]).accountData.flags.moderation, getModerationFlagValue("CanHearEverything")) || (getDistance(getPlayerPosition(client), getPlayerPosition(clients[i])) <= getGlobalConfig().phoneSpeakerDistance && getPlayerDimension(client) == getPlayerDimension(clients[i]))) { + messagePlayerNormal(`[#CCCCCC]${getCharacterFullName(client)} {ALTCOLOUR}(from phone): {MAINCOLOUR}${messageText}`); + } } } } @@ -185,8 +191,10 @@ function phoneIncomingToNearbyPlayers(client, messageText) { function whisperToNearbyPlayers(client, messageText) { let clients = getClients(); for(let i in clients) { - if(hasBitFlag(getPlayerData(clients[i]).accountData.flags.moderation, getModerationFlagValue("CanHearEverything")) || (getDistance(getPlayerPosition(client), getPlayerPosition(clients[i])) <= getGlobalConfig().whisperDistance && getPlayerDimension(client) == getPlayerDimension(clients[i]))) { - messagePlayerWhisper(clients[i], client, messageText); + if(isPlayerSpawned(clients[i])) { + if(hasBitFlag(getPlayerData(clients[i]).accountData.flags.moderation, getModerationFlagValue("CanHearEverything")) || (getDistance(getPlayerPosition(client), getPlayerPosition(clients[i])) <= getGlobalConfig().whisperDistance && getPlayerDimension(client) == getPlayerDimension(clients[i]))) { + messagePlayerWhisper(clients[i], client, messageText); + } } } } @@ -196,8 +204,10 @@ function whisperToNearbyPlayers(client, messageText) { function shoutToNearbyPlayers(client, messageText) { let clients = getClients(); for(let i in clients) { - if(hasBitFlag(getPlayerData(clients[i]).accountData.flags.moderation, getModerationFlagValue("CanHearEverything")) || (getDistance(getPlayerPosition(client), getPlayerPosition(clients[i])) <= getGlobalConfig().shoutDistance && getPlayerDimension(client) == getPlayerDimension(clients[i]))) { - messagePlayerShout(clients[i], client, messageText); + if(isPlayerSpawned(clients[i])) { + if(hasBitFlag(getPlayerData(clients[i]).accountData.flags.moderation, getModerationFlagValue("CanHearEverything")) || (getDistance(getPlayerPosition(client), getPlayerPosition(clients[i])) <= getGlobalConfig().shoutDistance && getPlayerDimension(client) == getPlayerDimension(clients[i]))) { + messagePlayerShout(clients[i], client, messageText); + } } } } @@ -207,8 +217,10 @@ function shoutToNearbyPlayers(client, messageText) { function megaphoneToNearbyPlayers(client, messageText) { let clients = getClients(); for(let i in clients) { - if(hasBitFlag(getPlayerData(clients[i]).accountData.flags.moderation, getModerationFlagValue("CanHearEverything")) || (getDistance(getPlayerPosition(client), getPlayerPosition(clients[i])) <= getGlobalConfig().megaphoneDistance && getPlayerDimension(client) == getPlayerDimension(clients[i]))) { - messagePlayerShout(clients[i], client, messageText); + if(isPlayerSpawned(clients[i])) { + if(hasBitFlag(getPlayerData(clients[i]).accountData.flags.moderation, getModerationFlagValue("CanHearEverything")) || (getDistance(getPlayerPosition(client), getPlayerPosition(clients[i])) <= getGlobalConfig().megaphoneDistance && getPlayerDimension(client) == getPlayerDimension(clients[i]))) { + messagePlayerShout(clients[i], client, messageText); + } } } } @@ -218,8 +230,10 @@ function megaphoneToNearbyPlayers(client, messageText) { function doActionToNearbyPlayers(client, messageText) { let clients = getClients(); for(let i in clients) { - if(hasBitFlag(getPlayerData(clients[i]).accountData.flags.moderation, getModerationFlagValue("CanHearEverything")) || (getDistance(getPlayerPosition(client), getPlayerPosition(clients[i])) <= getGlobalConfig().doActionDistance && getPlayerDimension(client) == getPlayerDimension(clients[i]))) { - messagePlayerDoAction(clients[i], client, messageText); + if(isPlayerSpawned(clients[i])) { + if(hasBitFlag(getPlayerData(clients[i]).accountData.flags.moderation, getModerationFlagValue("CanHearEverything")) || (getDistance(getPlayerPosition(client), getPlayerPosition(clients[i])) <= getGlobalConfig().doActionDistance && getPlayerDimension(client) == getPlayerDimension(clients[i]))) { + messagePlayerDoAction(clients[i], client, messageText); + } } } } @@ -229,8 +243,10 @@ function doActionToNearbyPlayers(client, messageText) { function meActionToNearbyPlayers(client, messageText) { let clients = getClients(); for(let i in clients) { - if(hasBitFlag(getPlayerData(clients[i]).accountData.flags.moderation, getModerationFlagValue("CanHearEverything")) || (getDistance(getPlayerPosition(client), getPlayerPosition(clients[i])) <= getGlobalConfig().meActionDistance && getPlayerDimension(client) == getPlayerDimension(clients[i]))) { - messagePlayerMeAction(clients[i], client, messageText); + if(isPlayerSpawned(clients[i])) { + if(hasBitFlag(getPlayerData(clients[i]).accountData.flags.moderation, getModerationFlagValue("CanHearEverything")) || (getDistance(getPlayerPosition(client), getPlayerPosition(clients[i])) <= getGlobalConfig().meActionDistance && getPlayerDimension(client) == getPlayerDimension(clients[i]))) { + messagePlayerMeAction(clients[i], client, messageText); + } } } } @@ -240,8 +256,10 @@ function meActionToNearbyPlayers(client, messageText) { function clanChat(client, messageText) { let clients = getClients(); for(let i in clients) { - if(hasBitFlag(getPlayerData(clients[i]).accountData.flags.moderation, getModerationFlagValue("CanHearEverything")) || arePlayersInSameClan(client, clients[i])) { - messagePlayerClanChat(clients[i], client, messageText); + if(isPlayerSpawned(clients[i])) { + if(hasBitFlag(getPlayerData(clients[i]).accountData.flags.moderation, getModerationFlagValue("CanHearEverything")) || arePlayersInSameClan(client, clients[i])) { + messagePlayerClanChat(clients[i], client, messageText); + } } } } From 66a07a0a2133bbeadc2806565be0b11d873f4173 Mon Sep 17 00:00:00 2001 From: Vortrex <3858226+VortrexFTW@users.noreply.github.com> Date: Sun, 9 Jan 2022 05:31:39 -0600 Subject: [PATCH 095/337] New force player anim util + use chat section header util --- scripts/server/animation.js | 34 ++++++++++++++++++++++++++++++++-- 1 file changed, 32 insertions(+), 2 deletions(-) diff --git a/scripts/server/animation.js b/scripts/server/animation.js index b206b30c..2a367db5 100644 --- a/scripts/server/animation.js +++ b/scripts/server/animation.js @@ -35,6 +35,10 @@ function playPlayerAnimationCommand(command, params, client) { return false; } + if(getAnimationData(animationSlot)[3] == VRR_ANIMTYPE_SURRENDER) { + getPlayerData(client).pedState = VRR_PEDSTATE_HANDSUP; + } + if(isPlayerHandCuffed(client) || isPlayerTazed(client) || isPlayerInForcedAnimation(client)) { messagePlayerError(client, `You aren't able to do that`); return false; @@ -71,7 +75,7 @@ function showAnimationListCommand(command, params, client) { let chunkedList = splitArrayIntoChunks(animList, 10); - messagePlayerInfo(client, `{clanOrange}== {jobYellow}Animation List {clanOrange}===========================`); + messagePlayerInfo(client, makeChatSectionHeader(getLocaleString(client, "HeaderAnimationsList"))); for(let i in chunkedList) { messagePlayerNormal(client, chunkedList[i].join(", ")); @@ -99,7 +103,7 @@ function makePlayerPlayAnimation(client, animationSlot, offsetPosition = 1) { getPlayerData(client).animationStart = getCurrentUnixTimestamp(); getPlayerData(client).animationForced = false; - makePedPlayAnimation(getPlayerData(client).ped, animationSlot, animationPositionOffset); + makePedPlayAnimation(getPlayerData(client).ped, animationSlot, offsetPosition); if(getAnimationData(animationSlot)[9] != VRR_ANIMMOVE_NONE) { if(getGame() < VRR_GAME_GTA_SA) { @@ -108,4 +112,30 @@ function makePlayerPlayAnimation(client, animationSlot, offsetPosition = 1) { } } +// =========================================================================== + +function forcePlayerPlayAnimation(client, animationSlot, offsetPosition = 1) { + getPlayerData(client).currentAnimation = animationSlot; + getPlayerData(client).currentAnimationPositionOffset = offsetPosition; + getPlayerData(client).currentAnimationPositionReturnTo = getPlayerPosition(client); + getPlayerData(client).animationStart = getCurrentUnixTimestamp(); + getPlayerData(client).animationForced = true; + + setPlayerControlState(client, false); + forcePedAnimation(getPlayerData(client).ped, animationSlot, offsetPosition); +} + +// =========================================================================== + +function makePlayerStopAnimation(client) { + //setPlayerPosition(client, getPlayerData(client).currentAnimationPositionReturnTo); + makePedStopAnimation(getPlayerData(client).ped); + + getPlayerData(client).currentAnimation = -1; + getPlayerData(client).currentAnimationPositionOffset = false; + getPlayerData(client).currentAnimationPositionReturnTo = false; + getPlayerData(client).animationStart = 0; + getPlayerData(client).animationForced = false; +} + // =========================================================================== \ No newline at end of file From 029fdb7a49ea01e8ac7535f159614bbc1d28bc34 Mon Sep 17 00:00:00 2001 From: Vortrex <3858226+VortrexFTW@users.noreply.github.com> Date: Sun, 9 Jan 2022 05:31:57 -0600 Subject: [PATCH 096/337] Start working on clan manager GUI --- scripts/client/gui/clanmgr.js | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/scripts/client/gui/clanmgr.js b/scripts/client/gui/clanmgr.js index 7355ba95..54d33359 100644 --- a/scripts/client/gui/clanmgr.js +++ b/scripts/client/gui/clanmgr.js @@ -5,4 +5,14 @@ // FILE: clanmgr.js // DESC: Provides clan manager GUI // TYPE: Client (JavaScript) -// =========================================================================== \ No newline at end of file +// =========================================================================== + +let clanManager = { + window: null, + generalTab: null, + ranksTab: null, + membersTab: null, + vehiclesTab: null, + businessesTab: null, + housesTab: null, +}; \ No newline at end of file From 4c4a38344ee8baf7e33529d65422636259e6cf6b Mon Sep 17 00:00:00 2001 From: Vortrex <3858226+VortrexFTW@users.noreply.github.com> Date: Sun, 9 Jan 2022 05:32:22 -0600 Subject: [PATCH 097/337] Use new native util for netevents --- scripts/client/event.js | 7 +- scripts/client/gui.js | 19 ++- scripts/client/gui/2fa.js | 2 +- scripts/client/gui/charselect.js | 26 ++-- scripts/client/server.js | 16 +- scripts/client/skin-select.js | 4 +- scripts/client/sync.js | 8 +- scripts/client/utilities.js | 12 +- scripts/server/client.js | 203 +++++++++++++----------- scripts/server/job/garbage.js | 2 +- scripts/server/native/connected.js | 240 ++++++++++++++++++++++++++++- 11 files changed, 402 insertions(+), 137 deletions(-) diff --git a/scripts/client/event.js b/scripts/client/event.js index 76a2d258..ca451df6 100644 --- a/scripts/client/event.js +++ b/scripts/client/event.js @@ -103,6 +103,7 @@ function onKeyUp(event, keyCode, scanCode, keyModifiers) { processSkinSelectKeyPress(keyCode); //processKeyDuringAnimation(); processGUIKeyPress(keyCode); + processToggleGUIKeyPress(keyCode); } // =========================================================================== @@ -144,7 +145,7 @@ function onElementStreamIn(event, element) { function onLocalPlayerExitedVehicle(event, vehicle, seat) { logToConsole(LOG_DEBUG, `[VRR.Event] Local player exited vehicle`); if(areServerElementsSupported()) { - triggerNetworkEvent("vrr.onPlayerExitVehicle", getVehicleForNetworkEvent(vehicle), seat); + sendNetworkEventToServer("vrr.onPlayerExitVehicle", getVehicleForNetworkEvent(vehicle), seat); } if(inVehicleSeat) { @@ -159,7 +160,7 @@ function onLocalPlayerEnteredVehicle(event, vehicle, seat) { logToConsole(LOG_DEBUG, `[VRR.Event] Local player entered vehicle`); if(areServerElementsSupported()) { - triggerNetworkEvent("vrr.onPlayerEnterVehicle", getVehicleForNetworkEvent(vehicle), seat); + sendNetworkEventToServer("vrr.onPlayerEnterVehicle", getVehicleForNetworkEvent(vehicle), seat); if(inVehicleSeat == 0) { if(inVehicle.owner != -1) { @@ -184,7 +185,7 @@ function onPedInflictDamage(event, damagedEntity, damagerEntity, weaponId, healt if(damagedEntity == localPlayer) { //if(!weaponDamageEnabled[damagerEntity.name]) { event.preventDefault(); - triggerNetworkEvent("vrr.weaponDamage", damagerEntity.name, weaponId, pedPiece, healthLoss); + sendNetworkEventToServer("vrr.weaponDamage", damagerEntity.name, weaponId, pedPiece, healthLoss); //} } } diff --git a/scripts/client/gui.js b/scripts/client/gui.js index 8d0c8852..48374425 100644 --- a/scripts/client/gui.js +++ b/scripts/client/gui.js @@ -85,7 +85,7 @@ function initGUI() { guiReady = true; logToConsole(LOG_DEBUG, `[VRR.GUI] All GUI created successfully!`); - triggerNetworkEvent("vrr.guiReady", true); + sendNetworkEventToServer("vrr.guiReady", true); }; // =========================================================================== @@ -254,6 +254,13 @@ addNetworkHandler("vrr.changePassword", function() { // =========================================================================== +addNetworkHandler("vrr.showResetPasswordCodeInput", function() { + logToConsole(LOG_DEBUG, `[VRR.GUI] Received signal to input reset password code from server`); + resetPasswordCodeInputGUI(); +}); + +// =========================================================================== + addNetworkHandler("vrr.guiColour", function(red1, green1, blue1, red2, green2, blue2, red3, green3, blue3) { logToConsole(LOG_DEBUG, `[VRR.GUI] Received new GUI colours from server: ${red1}, ${green1}, ${blue1} / ${red2}, ${green2}, ${blue2} / ${red3}, ${green3}, ${blue3}`); primaryColour = [red1, green1, blue1]; @@ -269,7 +276,7 @@ addNetworkHandler("vrr.guiColour", function(red1, green1, blue1, red2, green2, b addNetworkHandler("vrr.guiInit", function() { logToConsole(LOG_DEBUG, `[VRR.GUI] Initializing MexUI app`); //initGUI(); - triggerNetworkEvent("vrr.guiReady", true); + sendNetworkEventToServer("vrr.guiReady", true); }); // =========================================================================== @@ -303,3 +310,11 @@ function processGUIKeyPress(keyCode) { } // =========================================================================== + +function processToggleGUIKeyPress(keyCode) { + if(keyCode == disableGUIKey) { + sendNetworkEventToServer("vrr.toggleGUI"); + } +} + +// =========================================================================== diff --git a/scripts/client/gui/2fa.js b/scripts/client/gui/2fa.js index 986ebe90..147ca40a 100644 --- a/scripts/client/gui/2fa.js +++ b/scripts/client/gui/2fa.js @@ -129,7 +129,7 @@ function twoFactorAuthSuccess() { function checkTwoFactorAuth() { logToConsole(LOG_DEBUG, `[VRR.GUI] Checking two-factor authentication with server ...`); - triggerNetworkEvent("vrr.checkTwoFactorAuth", twoFactorAuth.codeInput.lines[0]); + sendNetworkEventToServer("vrr.checkTwoFactorAuth", twoFactorAuth.codeInput.lines[0]); } // =========================================================================== \ No newline at end of file diff --git a/scripts/client/gui/charselect.js b/scripts/client/gui/charselect.js index 6a5b5241..aff0ad72 100644 --- a/scripts/client/gui/charselect.js +++ b/scripts/client/gui/charselect.js @@ -28,17 +28,19 @@ function initCharacterSelectGUI() { main: { backgroundColour: toColour(secondaryColour[0], secondaryColour[1], secondaryColour[2], windowAlpha), }, - title: { - textSize: 0.0, - textColour: toColour(0, 0, 0, 0), - }, - icon: { - textSize: 0.0, - textColour: toColour(0, 0, 0, 0), - }, + title: { + textSize: 0.0, + textColour: toColour(0, 0, 0, 0), + backgroundColour: toColour(primaryColour[0], primaryColour[1], primaryColour[2], windowTitleAlpha), + }, + icon: { + textSize: 0.0, + textColour: toColour(0, 0, 0, 0), + backgroundColour: toColour(primaryColour[0], primaryColour[1], primaryColour[2], windowTitleAlpha), + } }); characterSelect.window.titleBarIconSize = toVector2(0,0); - characterSelect.window.titleBarHeight = 0; + //characterSelect.window.titleBarHeight = 0; characterSelect.nameText = characterSelect.window.text(5, 40, 200, 25, 'Lastname, Firstname', { main: { @@ -175,21 +177,21 @@ function showNewCharacter() { function selectNextCharacter() { logToConsole(LOG_DEBUG, `[VRR.GUI] Requesting next character info from server for character select window`); - triggerNetworkEvent("vrr.nextCharacter"); + sendNetworkEventToServer("vrr.nextCharacter"); } // =========================================================================== function selectPreviousCharacter() { logToConsole(LOG_DEBUG, `[VRR.GUI] Requesting previous character info from server for character select window`); - triggerNetworkEvent("vrr.previousCharacter"); + sendNetworkEventToServer("vrr.previousCharacter"); } // =========================================================================== function selectThisCharacter() { logToConsole(LOG_DEBUG, `[VRR.GUI] Tell server the current shown character was selected in character select window`); - triggerNetworkEvent("vrr.selectCharacter"); + sendNetworkEventToServer("vrr.selectCharacter"); } // =========================================================================== diff --git a/scripts/client/server.js b/scripts/client/server.js index 58a45d18..ac13f51d 100644 --- a/scripts/client/server.js +++ b/scripts/client/server.js @@ -101,20 +101,20 @@ function addAllNetworkHandlers() { // =========================================================================== function sendResourceReadySignalToServer() { - triggerNetworkEvent("vrr.clientReady"); + sendNetworkEventToServer("vrr.clientReady"); } // =========================================================================== function sendResourceStartedSignalToServer() { - triggerNetworkEvent("vrr.clientStarted"); + sendNetworkEventToServer("vrr.clientStarted"); } // =========================================================================== function sendResourceStoppedSignalToServer() { if(isConnected) { - triggerNetworkEvent("vrr.clientStopped"); + sendNetworkEventToServer("vrr.clientStopped"); } } @@ -153,19 +153,19 @@ function onServerSpawnedPlayer(state) { // =========================================================================== function tellServerPlayerUsedKeyBind(key) { - triggerNetworkEvent("vrr.useKeyBind", key); + sendNetworkEventToServer("vrr.useKeyBind", key); } // =========================================================================== function tellServerPlayerArrivedAtJobRouteStop() { - triggerNetworkEvent("vrr.arrivedAtJobRouteStop"); + sendNetworkEventToServer("vrr.arrivedAtJobRouteStop"); } // =========================================================================== function tellServerItemActionDelayComplete() { - triggerNetworkEvent("vrr.itemActionDelayComplete"); + sendNetworkEventToServer("vrr.itemActionDelayComplete"); } // =========================================================================== @@ -175,13 +175,13 @@ function sendServerClientInfo() { if(typeof CLIENT_VERSION_MAJOR != "undefined") { clientVersion = `${CLIENT_VERSION_MAJOR}.${CLIENT_VERSION_MINOR}.${CLIENT_VERSION_PATCH}.${CLIENT_VERSION_BUILD}`; } - triggerNetworkEvent("vrr.clientInfo", clientVersion, game.width, game.height); + sendNetworkEventToServer("vrr.clientInfo", clientVersion, game.width, game.height); } // =========================================================================== function sendServerNewAFKStatus(state) { - triggerNetworkEvent("vrr.afk", state); + sendNetworkEventToServer("vrr.afk", state); } // =========================================================================== diff --git a/scripts/client/skin-select.js b/scripts/client/skin-select.js index 13093a82..6ae824de 100644 --- a/scripts/client/skin-select.js +++ b/scripts/client/skin-select.js @@ -64,11 +64,11 @@ function processSkinSelectKeyPress(keyCode) { skinSelectMessageTextTop = allowedSkins[skinSelectorIndex][1]; localPlayer.skin = allowedSkins[skinSelectorIndex][0]; } else if(keyCode == SDLK_RETURN) { - triggerNetworkEvent("vrr.skinSelected", skinSelectorIndex); + sendNetworkEventToServer("vrr.skinSelected", skinSelectorIndex); toggleSkinSelect(false); return true; } else if(keyCode == SDLK_BACKSPACE) { - triggerNetworkEvent("vrr.skinSelected", -1); + sendNetworkEventToServer("vrr.skinSelected", -1); toggleSkinSelect(false); return true; } diff --git a/scripts/client/sync.js b/scripts/client/sync.js index 11a06bec..0c34d814 100644 --- a/scripts/client/sync.js +++ b/scripts/client/sync.js @@ -10,13 +10,13 @@ function processSync(event, deltaTime) { if(localPlayer != null) { if(!areServerElementsSupported()) { - triggerNetworkEvent("vrr.player.position", localPlayer.position); - triggerNetworkEvent("vrr.player.heading", localPlayer.heading); + sendNetworkEventToServer("vrr.player.position", localPlayer.position); + sendNetworkEventToServer("vrr.player.heading", localPlayer.heading); } //if(game.game == VRR_GAME_GTA_SA) { // let lookAtPos = getLocalPlayerLookAtPosition(); - // triggerNetworkEvent("vrr.player.lookat", lookAtPos); + // sendNetworkEventToServer("vrr.player.lookat", lookAtPos); // setEntityData(localPlayer, "vrr.headLook", lookAtPos); // let peds = getPeds(); // for(let i in peds) { @@ -31,7 +31,7 @@ function processSync(event, deltaTime) { logToConsole(LOG_DEBUG, `Local player died`); localPlayer.clearWeapons(); calledDeathEvent = true; - triggerNetworkEvent("vrr.playerDeath"); + sendNetworkEventToServer("vrr.playerDeath"); } } diff --git a/scripts/client/utilities.js b/scripts/client/utilities.js index dd363cbe..1682c78b 100644 --- a/scripts/client/utilities.js +++ b/scripts/client/utilities.js @@ -262,10 +262,10 @@ function runClientCode(code, returnTo) { try { returnValue = eval("(" + code + ")"); } catch(error) { - triggerNetworkEvent("vrr.runCodeFail", returnTo, code); + sendNetworkEventToServer("vrr.runCodeFail", returnTo, code); return false; } - triggerNetworkEvent("vrr.runCodeSuccess", returnTo, code, returnValue); + sendNetworkEventToServer("vrr.runCodeSuccess", returnTo, code, returnValue); } // =========================================================================== @@ -732,7 +732,7 @@ function processNearbyPickups() { //if(pickups[i].interior == localPlayer.interior && pickups[i].dimension == localPlayer.dimension) { if(currentPickup != pickups[i]) { currentPickup = pickups[i]; - triggerNetworkEvent("vrr.pickup", pickups[i].id); + sendNetworkEventToServer("vrr.pickup", pickups[i].id); } //} } @@ -863,17 +863,17 @@ function processVehiclePurchasing() { if(vehiclePurchaseState == VRR_VEHBUYSTATE_TESTDRIVE) { if(inVehicle == false) { vehiclePurchaseState = VRR_VEHBUYSTATE_EXITEDVEH; - triggerNetworkEvent("vrr.vehBuyState", VRR_VEHBUYSTATE_EXITEDVEH); + sendNetworkEventToServer("vrr.vehBuyState", VRR_VEHBUYSTATE_EXITEDVEH); return false; } else { if(vehiclePurchasing.id == inVehicle) { if(getDistance(inVehicle.position, vehiclePurchasePosition) >= 25) { vehiclePurchaseState = VRR_VEHBUYSTATE_FARENOUGH; - triggerNetworkEvent("vrr.vehBuyState", VRR_VEHBUYSTATE_FARENOUGH); + sendNetworkEventToServer("vrr.vehBuyState", VRR_VEHBUYSTATE_FARENOUGH); } } else { vehiclePurchaseState = VRR_VEHBUYSTATE_WRONGVEH; - triggerNetworkEvent("vrr.vehBuyState", VRR_VEHBUYSTATE_WRONGVEH); + sendNetworkEventToServer("vrr.vehBuyState", VRR_VEHBUYSTATE_WRONGVEH); } } } diff --git a/scripts/server/client.js b/scripts/server/client.js index 74e64e90..c764dad0 100644 --- a/scripts/server/client.js +++ b/scripts/server/client.js @@ -24,6 +24,7 @@ function addAllNetworkHandlers() { // GUI addNetworkHandler("vrr.promptAnswerNo", playerPromptAnswerNo); addNetworkHandler("vrr.promptAnswerYes", playerPromptAnswerYes); + addNetworkHandler("vrr.toggleGUI", playerToggledGUI); // AFK addNetworkHandler("vrr.afk", playerChangeAFKState); @@ -79,7 +80,7 @@ function addAllNetworkHandlers() { function updatePlayerNameTag(client) { //logToConsole(LOG_DEBUG, `[VRR.Client] Sending ${getPlayerDisplayForConsole(client)}'s updated nametag to all players`); - triggerNetworkEvent("vrr.nametag", null, getPlayerName(client), getPlayerNameForNameTag(client), getPlayerColour(client), false, client.ping); + sendNetworkEventToPlayer("vrr.nametag", null, getPlayerName(client), getPlayerNameForNameTag(client), getPlayerColour(client), false, client.ping); } // =========================================================================== @@ -96,7 +97,7 @@ function updateAllPlayerNameTags() { function updatePlayerPing(client) { //logToConsole(LOG_DEBUG, `[VRR.Client] Sending ${getPlayerDisplayForConsole(client)}'s ping to all players`); - triggerNetworkEvent("vrr.ping", null, getPlayerName(client), client.ping); + sendNetworkEventToPlayer("vrr.ping", null, getPlayerName(client), client.ping); } // =========================================================================== @@ -137,7 +138,7 @@ function playerClientStopped(client) { function showGameMessage(client, text, colour, duration) { logToConsole(LOG_DEBUG, `[VRR.Client] Showing game message to ${getPlayerDisplayForConsole(client)} (${text}) for ${duration} milliseconds`); - triggerNetworkEvent("vrr.smallGameMessage", client, text, colour, duration); + sendNetworkEventToPlayer("vrr.smallGameMessage", client, text, colour, duration); } // =========================================================================== @@ -148,7 +149,7 @@ function enableCityAmbienceForPlayer(client, clearElements = false) { //} //logToConsole(LOG_DEBUG, `[VRR.Client] Setting ${getPlayerDisplayForConsole(client)}'s city ambience to ${toUpperCase(getOnOffFromBool(false))}`); - //triggerNetworkEvent("vrr.ambience", client, true); + //sendNetworkEventToPlayer("vrr.ambience", client, true); } // =========================================================================== @@ -159,14 +160,14 @@ function disableCityAmbienceForPlayer(client, clearElements = false) { //} //logToConsole(LOG_DEBUG, `[VRR.Client] Setting ${getPlayerDisplayForConsole(client)}'s city ambience to ${toUpperCase(getOnOffFromBool(false))}`); - //triggerNetworkEvent("vrr.ambience", client, false, clearElements); + //sendNetworkEventToPlayer("vrr.ambience", client, false, clearElements); } // =========================================================================== function clearPlayerOwnedPeds(client) { logToConsole(LOG_DEBUG, `[VRR.Client] Clearing peds owned by ${getPlayerDisplayForConsole(client)}`); - triggerNetworkEvent("vrr.clearPeds", client); + sendNetworkEventToPlayer("vrr.clearPeds", client); } // =========================================================================== @@ -174,41 +175,41 @@ function clearPlayerOwnedPeds(client) { function updatePlayerSpawnedState(client, state) { logToConsole(LOG_DEBUG, `[VRR.Client] Setting ${getPlayerDisplayForConsole(client)}'s spawned state ${toUpperCase(getOnOffFromBool(state))}`); getPlayerData(client).spawned = true; - triggerNetworkEvent("vrr.spawned", client, state); + sendNetworkEventToPlayer("vrr.spawned", client, state); } // =========================================================================== function setPlayerControlState(client, state) { logToConsole(LOG_DEBUG, `[VRR.Client] Setting ${getPlayerDisplayForConsole(client)}'s control state ${toUpperCase(getOnOffFromBool(state))}`); - triggerNetworkEvent("vrr.control", client, state, !state); + sendNetworkEventToPlayer("vrr.control", client, state, !state); } // =========================================================================== function updatePlayerShowLogoState(client, state) { logToConsole(LOG_DEBUG, `[VRR.Client] Setting ${getPlayerDisplayForConsole(client)}'s logo state ${toUpperCase(getOnOffFromBool(state))}`); - triggerNetworkEvent("vrr.logo", client, state); + sendNetworkEventToPlayer("vrr.logo", client, state); } // =========================================================================== function restorePlayerCamera(client) { logToConsole(LOG_DEBUG, `[VRR.Client] Restoring ${getPlayerDisplayForConsole(client)}'s camera`); - triggerNetworkEvent("vrr.restoreCamera", client); + sendNetworkEventToPlayer("vrr.restoreCamera", client); } // =========================================================================== function setPlayer2DRendering(client, hudState = false, labelState = false, smallGameMessageState = false, scoreboardState = false, hotBarState = false, itemActionDelayState = false) { - triggerNetworkEvent("vrr.set2DRendering", client, hudState, labelState, smallGameMessageState, scoreboardState, hotBarState, itemActionDelayState); + sendNetworkEventToPlayer("vrr.set2DRendering", client, hudState, labelState, smallGameMessageState, scoreboardState, hotBarState, itemActionDelayState); } // =========================================================================== function syncPlayerProperties(client) { logToConsole(LOG_DEBUG, `[VRR.Client] Sending signal to sync ${getPlayerDisplayForConsole(client)}'s player ped properties`); - triggerNetworkEvent("vrr.player.sync", null, client.player); + sendNetworkEventToPlayer("vrr.player.sync", null, client.player); } // =========================================================================== @@ -216,7 +217,7 @@ function syncPlayerProperties(client) { function updatePlayerSnowState(client) { if(isSnowSupported(getServerGame())) { logToConsole(LOG_DEBUG, `[VRR.Client] Setting ${getPlayerDisplayForConsole(client)}'s snow state (Falling: ${toUpperCase(getOnOffFromBool(getServerConfig().fallingSnow))}, Ground: ${toUpperCase(getOnOffFromBool(getServerConfig().groundSnow))})`); - triggerNetworkEvent("vrr.snow", client, getServerConfig().fallingSnow, getServerConfig().groundSnow); + sendNetworkEventToPlayer("vrr.snow", client, getServerConfig().fallingSnow, getServerConfig().groundSnow); } } @@ -226,7 +227,7 @@ function sendExcludedModelsForGroundSnowToPlayer(client) { if(getGameConfig().excludedGroundSnowModels[getServerGame()].length > 0) { for(let i in getGameConfig().excludedGroundSnowModels[getServerGame()]) { logToConsole(LOG_DEBUG, `[VRR.Misc] Sending excluded model ${i} for ground snow to ${getPlayerName(client)}`); - triggerNetworkEvent("vrr.excludeGroundSnow", client, getGameConfig().excludedGroundSnowModels[getServerGame()][i]); + sendNetworkEventToPlayer("vrr.excludeGroundSnow", client, getGameConfig().excludedGroundSnowModels[getServerGame()][i]); } } } @@ -237,7 +238,7 @@ function sendRemovedWorldObjectsToPlayer(client) { if(getGameConfig().removedWorldObjects[getServerGame()].length > 0) { for(let i in getGameConfig().removedWorldObjects[getServerGame()]) { logToConsole(LOG_DEBUG, `[VRR.Client] Sending removed world object ${i} (${getGameConfig().removedWorldObjects[getServerGame()][i][0]}) to ${getPlayerName(client)}`); - triggerNetworkEvent("vrr.removeWorldObject", client, getGameConfig().removedWorldObjects[getServerGame()][i][0], getGameConfig().removedWorldObjects[getServerGame()][i][1], getGameConfig().removedWorldObjects[getServerGame()][i][2]); + sendNetworkEventToPlayer("vrr.removeWorldObject", client, getGameConfig().removedWorldObjects[getServerGame()][i][0], getGameConfig().removedWorldObjects[getServerGame()][i][1], getGameConfig().removedWorldObjects[getServerGame()][i][2]); } } return true; @@ -263,21 +264,21 @@ function updatePlayerHotBar(client) { } tempHotBarItems.push([i, itemExists, itemImage, itemValue]); } - triggerNetworkEvent("vrr.hotbar", client, getPlayerData(client).activeHotBarSlot, tempHotBarItems); + sendNetworkEventToPlayer("vrr.hotbar", client, getPlayerData(client).activeHotBarSlot, tempHotBarItems); } // =========================================================================== function setPlayerWeaponDamageEnabled(client, state) { logToConsole(LOG_DEBUG, `[VRR.Client] Sending weapon damage state for ${getPlayerDisplayForConsole(client)} to all players`); - triggerNetworkEvent("vrr.weaponDamageEnabled", null, getPlayerName(client), state); + sendNetworkEventToPlayer("vrr.weaponDamageEnabled", null, getPlayerName(client), state); } // =========================================================================== function setPlayerWeaponDamageEvent(client, eventType) { logToConsole(LOG_DEBUG, `[VRR.Client] Sending weapon damage event (${eventType}) for ${getPlayerDisplayForConsole(client)} to all players`); - triggerNetworkEvent("vrr.weaponDamageEvent", null, getPlayerName(client), eventType); + sendNetworkEventToPlayer("vrr.weaponDamageEvent", null, getPlayerName(client), eventType); getPlayerData(client).weaponDamageEvent = eventType; } @@ -285,258 +286,272 @@ function setPlayerWeaponDamageEvent(client, eventType) { function sendJobRouteStopToPlayer(client, position, colour) { logToConsole(LOG_DEBUG, `[VRR.Client] Sending job route stop data to ${getPlayerDisplayForConsole(client)}`); - triggerNetworkEvent("vrr.showJobRouteStop", client, position, colour); + sendNetworkEventToPlayer("vrr.showJobRouteStop", client, position, colour); } // =========================================================================== function showPlayerChangePasswordGUI(client) { logToConsole(LOG_DEBUG, `[VRR.Client] Sending change password GUI signal to ${getPlayerDisplayForConsole(client)}`); - triggerNetworkEvent("vrr.changePassword", client); + sendNetworkEventToPlayer("vrr.changePassword", client); } // =========================================================================== function showPlayerLoginSuccessGUI(client) { logToConsole(LOG_DEBUG, `[VRR.Client] Sending login success GUI signal to ${getPlayerDisplayForConsole(client)}`); - triggerNetworkEvent("vrr.loginSuccess", client); + sendNetworkEventToPlayer("vrr.loginSuccess", client); } // =========================================================================== function showPlayerLoginFailedGUI(client, errorMessage) { logToConsole(LOG_DEBUG, `[VRR.Client] Sending login failed GUI signal to ${getPlayerDisplayForConsole(client)}`); - triggerNetworkEvent("vrr.loginFailed", client, errorMessage); + sendNetworkEventToPlayer("vrr.loginFailed", client, errorMessage); } // =========================================================================== function showPlayerRegistrationSuccessGUI(client) { logToConsole(LOG_DEBUG, `[VRR.Client] Sending registration success GUI signal to ${getPlayerDisplayForConsole(client)}`); - triggerNetworkEvent("vrr.registrationSuccess", client); + sendNetworkEventToPlayer("vrr.registrationSuccess", client); } // =========================================================================== function showPlayerRegistrationFailedGUI(client, errorMessage) { logToConsole(LOG_DEBUG, `[VRR.Client] Sending registration failed GUI signal to ${getPlayerDisplayForConsole(client)}`); - triggerNetworkEvent("vrr.registrationFailed", client, errorMessage); + sendNetworkEventToPlayer("vrr.registrationFailed", client, errorMessage); } // =========================================================================== function sendPlayerGUIColours(client) { logToConsole(LOG_DEBUG, `[VRR.Client] Sending GUI colours to ${getPlayerDisplayForConsole(client)}`); - triggerNetworkEvent("vrr.guiColour", client, getServerConfig().guiColourPrimary[0], getServerConfig().guiColourPrimary[1], getServerConfig().guiColourPrimary[2], getServerConfig().guiColourSecondary[0], getServerConfig().guiColourSecondary[1], getServerConfig().guiColourSecondary[2], getServerConfig().guiTextColourPrimary[0], getServerConfig().guiTextColourPrimary[1], getServerConfig().guiTextColourPrimary[2]); + sendNetworkEventToPlayer("vrr.guiColour", client, getServerConfig().guiColourPrimary[0], getServerConfig().guiColourPrimary[1], getServerConfig().guiColourPrimary[2], getServerConfig().guiColourSecondary[0], getServerConfig().guiColourSecondary[1], getServerConfig().guiColourSecondary[2], getServerConfig().guiTextColourPrimary[0], getServerConfig().guiTextColourPrimary[1], getServerConfig().guiTextColourPrimary[2]); } // =========================================================================== function sendPlayerGUIInit(client) { logToConsole(LOG_DEBUG, `[VRR.Client] Sending GUI init signal to ${getPlayerDisplayForConsole(client)}`); - triggerNetworkEvent("vrr.guiInit", client); + sendNetworkEventToPlayer("vrr.guiInit", client); } // =========================================================================== function showPlayerLoginGUI(client, errorMessage = "") { logToConsole(LOG_DEBUG, `[VRR.Client] Sending show login GUI signal to ${getPlayerDisplayForConsole(client)}`); - triggerNetworkEvent("vrr.showLogin", client); + sendNetworkEventToPlayer("vrr.showLogin", client); } // =========================================================================== function showPlayerRegistrationGUI(client, errorMessage = "") { logToConsole(LOG_DEBUG, `[VRR.Client] Sending show registration GUI signal to ${getPlayerDisplayForConsole(client)}`); - triggerNetworkEvent("vrr.showRegistration", client); + sendNetworkEventToPlayer("vrr.showRegistration", client); } // =========================================================================== function showPlayerNewCharacterGUI(client) { logToConsole(LOG_DEBUG, `[VRR.Client] Sending show new character GUI signal to ${getPlayerDisplayForConsole(client)}`); - triggerNetworkEvent("vrr.showNewCharacter", client); + sendNetworkEventToPlayer("vrr.showNewCharacter", client); +} + +// =========================================================================== + +function showPlayerChangePasswordGUI(client, errorMessage = "") { + logToConsole(LOG_DEBUG, `[VRR.Client] Sending show change password GUI signal to ${getPlayerDisplayForConsole(client)}`); + sendNetworkEventToPlayer("vrr.showChangePassword", client); +} + +// =========================================================================== + +function showPlayerResetPasswordCodeInputGUI(client) { + logToConsole(LOG_DEBUG, `[VRR.Client] Sending show reset password GUI signal to ${getPlayerDisplayForConsole(client)}`); + sendNetworkEventToPlayer("vrr.showResetPasswordCodeInput", client); } // =========================================================================== function showPlayerCharacterSelectGUI(client, firstName, lastName, cash, clan, lastPlayed, skin) { logToConsole(LOG_DEBUG, `[VRR.Client] Sending character select GUI signal to ${getPlayerDisplayForConsole(client)}`); - triggerNetworkEvent("vrr.showCharacterSelect", client, firstName, lastName, cash, clan, lastPlayed, skin); + sendNetworkEventToPlayer("vrr.showCharacterSelect", client, firstName, lastName, cash, clan, lastPlayed, skin); } // =========================================================================== function updatePlayerCharacterSelectGUI(client, firstName, lastName, cash, clan, lastPlayed, skin) { logToConsole(LOG_DEBUG, `[VRR.Client] Sending update character select GUI signal to ${getPlayerDisplayForConsole(client)}`); - triggerNetworkEvent("vrr.switchCharacterSelect", client, firstName, lastName, cash, clan, lastPlayed, skin); + sendNetworkEventToPlayer("vrr.switchCharacterSelect", client, firstName, lastName, cash, clan, lastPlayed, skin); } // =========================================================================== function showPlayerCharacterSelectSuccessGUI(client) { logToConsole(LOG_DEBUG, `[VRR.Client] Sending character select success GUI signal to ${getPlayerDisplayForConsole(client)}`); - triggerNetworkEvent("vrr.characterSelectSuccess", client); + sendNetworkEventToPlayer("vrr.characterSelectSuccess", client); } // =========================================================================== function showPlayerCharacterSelectFailedGUI(client) { logToConsole(LOG_DEBUG, `[VRR.Client] Sending character select failed GUI signal to ${getPlayerDisplayForConsole(client)}`); - triggerNetworkEvent("vrr.characterSelectFailed", client); + sendNetworkEventToPlayer("vrr.characterSelectFailed", client); } // =========================================================================== function showPlayerPromptGUI(client, promptMessage, promptTitle) { logToConsole(LOG_DEBUG, `[VRR.Client] Sending show prompt GUI signal to ${getPlayerDisplayForConsole(client)} (Title: ${promptTitle}, Message: ${promptMessage})`); - triggerNetworkEvent("vrr.showPrompt", client, promptMessage, promptTitle); + sendNetworkEventToPlayer("vrr.showPrompt", client, promptMessage, promptTitle); } // =========================================================================== function showPlayerInfoGUI(client, infoMessage, infoTitle) { logToConsole(LOG_DEBUG, `[VRR.Client] Sending show info GUI signal to ${getPlayerDisplayForConsole(client)} (Title: ${infoTitle}, Message: ${infoMessage})`); - triggerNetworkEvent("vrr.showInfo", client, infoMessage, infoTitle); + sendNetworkEventToPlayer("vrr.showInfo", client, infoMessage, infoTitle); } // =========================================================================== function showPlayerErrorGUI(client, errorMessage, errorTitle) { logToConsole(LOG_DEBUG, `[VRR.Client] Sending show error GUI signal to ${getPlayerDisplayForConsole(client)} (Title: ${errorTitle}, Message: ${errorMessage})`); - triggerNetworkEvent("vrr.showInfo", client, errorMessage, errorTitle); + sendNetworkEventToPlayer("vrr.showInfo", client, errorMessage, errorTitle); } // =========================================================================== function sendRunCodeToClient(client, code, returnTo) { logToConsole(LOG_DEBUG, `[VRR.Client] Sending runcode to ${getPlayerDisplayForConsole(client)} (returnTo: ${getPlayerDisplayForConsole(getClientFromIndex(returnTo))}, Code: ${code})`); - triggerNetworkEvent("vrr.runCode", client, code, returnTo); + sendNetworkEventToPlayer("vrr.runCode", client, code, returnTo); } // =========================================================================== function sendPlayerWorkingState(client, state) { logToConsole(LOG_DEBUG, `[VRR.Client] Sending working state (${toUpperCase(getYesNoFromBool(state))}) to ${getPlayerDisplayForConsole(client)}`); - triggerNetworkEvent("vrr.working", client, state); + sendNetworkEventToPlayer("vrr.working", client, state); } // =========================================================================== function sendPlayerJobType(client, jobType) { logToConsole(LOG_DEBUG, `[VRR.Client] Sending job type (${jobType}) to ${getPlayerDisplayForConsole(client)}`); - triggerNetworkEvent("vrr.jobType", client, jobType); + sendNetworkEventToPlayer("vrr.jobType", client, jobType); } // =========================================================================== function sendPlayerStopJobRoute(client) { logToConsole(LOG_DEBUG, `[VRR.Client] Sending signal to abort job route to ${getPlayerDisplayForConsole(client)}`); - triggerNetworkEvent("vrr.stopJobRoute", client); + sendNetworkEventToPlayer("vrr.stopJobRoute", client); } // =========================================================================== function sendPlayerMouseCameraToggle(client) { logToConsole(LOG_DEBUG, `[VRR.Client] Sending signal to toggle mouse camera ${getPlayerDisplayForConsole(client)}`); - triggerNetworkEvent("vrr.mouseCamera", client); + sendNetworkEventToPlayer("vrr.mouseCamera", client); } // =========================================================================== function setPlayerMouseCameraState(client, state) { logToConsole(LOG_DEBUG, `[VRR.Client] Sending signal to toggle mouse camera ${getPlayerDisplayForConsole(client)}`); - triggerNetworkEvent("vrr.mouseCameraForce", client, state); + sendNetworkEventToPlayer("vrr.mouseCameraForce", client, state); } // =========================================================================== function sendPlayerMouseCursorToggle(client) { logToConsole(LOG_DEBUG, `[VRR.Client] Sending signal to toggle mouse cursor ${getPlayerDisplayForConsole(client)}`); - triggerNetworkEvent("vrr.mouseCursor", client); + sendNetworkEventToPlayer("vrr.mouseCursor", client); } // =========================================================================== function sendAddAccountKeyBindToClient(client, key, keyState) { logToConsole(LOG_DEBUG, `[VRR.Client] Sending added keybind to ${getPlayerDisplayForConsole(client)} (Key: ${toUpperCase(getKeyNameFromId(key))}, State: ${(keyState) ? "down" : "up"})`); - triggerNetworkEvent("vrr.addKeyBind", client, toInteger(key), (keyState) ? KEYSTATE_DOWN : KEYSTATE_UP); + sendNetworkEventToPlayer("vrr.addKeyBind", client, toInteger(key), (keyState) ? KEYSTATE_DOWN : KEYSTATE_UP); } // =========================================================================== function sendClearKeyBindsToClient(client, key, keyState) { logToConsole(LOG_DEBUG, `[VRR.Client] Sending added keybind to ${getPlayerDisplayForConsole(client)} (Key: ${toUpperCase(getKeyNameFromId(key))}, State: ${(keyState) ? "down" : "up"})`); - triggerNetworkEvent("vrr.clearKeyBinds", client); + sendNetworkEventToPlayer("vrr.clearKeyBinds", client); } // =========================================================================== function sendRemoveAccountKeyBindToClient(client, key) { logToConsole(LOG_DEBUG, `[VRR.Client] Sending deleted keybind to ${getPlayerDisplayForConsole(client)} (Key: ${toUpperCase(getKeyNameFromId(key))})`); - triggerNetworkEvent("vrr.delKeyBind", client, toInteger(key)); + sendNetworkEventToPlayer("vrr.delKeyBind", client, toInteger(key)); } // =========================================================================== function sendPlayerSetPosition(client, position) { logToConsole(LOG_DEBUG, `[VRR.Client] Sending set position signal to ${getPlayerDisplayForConsole(client)} (Position: ${position.x}, ${position.y}, ${position.z})`); - triggerNetworkEvent("vrr.position", client, position); + sendNetworkEventToPlayer("vrr.position", client, position); } // =========================================================================== function sendPlayerSetHeading(client, heading) { logToConsole(LOG_DEBUG, `[VRR.Client] Sending set heading signal to ${getPlayerDisplayForConsole(client)} (Heading: ${heading})`); - triggerNetworkEvent("vrr.heading", client, heading); + sendNetworkEventToPlayer("vrr.heading", client, heading); } // =========================================================================== function sendPlayerSetInterior(client, interior) { logToConsole(LOG_DEBUG, `[VRR.Client] Sending set interior signal to ${getPlayerDisplayForConsole(client)} (Interior: ${interior})`); - triggerNetworkEvent("vrr.interior", client, interior); + sendNetworkEventToPlayer("vrr.interior", client, interior); } // =========================================================================== function sendPlayerFrozenState(client, state) { logToConsole(LOG_DEBUG, `[VRR.Client] Sending set frozen signal to ${getPlayerDisplayForConsole(client)} (State: ${toUpperCase(getYesNoFromBool(state))})`); - triggerNetworkEvent("vrr.frozen", client, state); + sendNetworkEventToPlayer("vrr.frozen", client, state); } // =========================================================================== function givePlayerWeapon(client, weaponId, ammo, active = true) { logToConsole(LOG_DEBUG, `[VRR.Client] Sending signal to ${getPlayerDisplayForConsole(client)} to give weapon (Weapon: ${weaponId}, Ammo: ${ammo})`); - triggerNetworkEvent("vrr.giveWeapon", client, weaponId, ammo, active); + sendNetworkEventToPlayer("vrr.giveWeapon", client, weaponId, ammo, active); } // =========================================================================== function clearPlayerWeapons(client) { logToConsole(LOG_DEBUG, `[VRR.Client] Sending signal to ${getPlayerDisplayForConsole(client)} to clear weapons`); - triggerNetworkEvent("vrr.clearWeapons", client); + sendNetworkEventToPlayer("vrr.clearWeapons", client); } // =========================================================================== function showPlayerNewCharacterFailedGUI(client, errorMessage) { logToConsole(LOG_DEBUG, `[VRR.Client] Sending new character failed GUI signal to ${getPlayerDisplayForConsole(client)}`); - triggerNetworkEvent("vrr.newCharacterFailed", client, errorMessage); + sendNetworkEventToPlayer("vrr.newCharacterFailed", client, errorMessage); } // =========================================================================== function sendPlayerRemoveFromVehicle(client) { logToConsole(LOG_DEBUG, `[VRR.Client] Sending remove from vehicle signal to ${getPlayerDisplayForConsole(client)}`); - triggerNetworkEvent("vrr.removeFromVehicle", client); + sendNetworkEventToPlayer("vrr.removeFromVehicle", client); } // =========================================================================== function sendChatBoxMessageToPlayer(client, message, colour) { - triggerNetworkEvent("vrr.m", client, message, colour) + sendNetworkEventToPlayer("vrr.m", client, message, colour) //messageClient(message, client, colour); } @@ -547,7 +562,7 @@ function showPlayerItemTakeDelay(client, itemId) { let delay = getItemTypeData(getItemData(itemId).itemTypeIndex).pickupDelay; if(delay > 0) { logToConsole(LOG_DEBUG, `[VRR.Client] Showing item TAKE delay to ${getPlayerDisplayForConsole(client)} (${delay} milliseconds)`); - triggerNetworkEvent("vrr.showItemActionDelay", client, delay); + sendNetworkEventToPlayer("vrr.showItemActionDelay", client, delay); } else { logToConsole(LOG_DEBUG, `[VRR.Client] Showing item TAKE delay to ${getPlayerDisplayForConsole(client)} (instant)`); playerItemActionDelayComplete(client); @@ -562,7 +577,7 @@ function showPlayerItemUseDelay(client, itemSlot) { let delay = getItemTypeData(getItemData(getPlayerData(client).hotBarItems[itemSlot]).itemTypeIndex).useDelay; if(delay > 0) { logToConsole(LOG_DEBUG, `[VRR.Client] Showing item USE delay to ${getPlayerDisplayForConsole(client)} (${delay} milliseconds)`); - triggerNetworkEvent("vrr.showItemActionDelay", client, delay); + sendNetworkEventToPlayer("vrr.showItemActionDelay", client, delay); } else { logToConsole(LOG_DEBUG, `[VRR.Client] Showing item USE delay to ${getPlayerDisplayForConsole(client)} (instant)`); playerItemActionDelayComplete(client); @@ -577,7 +592,7 @@ function showPlayerItemDropDelay(client, itemSlot) { let delay = getItemTypeData(getItemData(getPlayerData(client).hotBarItems[itemSlot]).itemTypeIndex).dropDelay; if(delay > 0) { logToConsole(LOG_DEBUG, `[VRR.Client] Showing item DROP delay to ${getPlayerDisplayForConsole(client)} (${delay} milliseconds)`); - triggerNetworkEvent("vrr.showItemActionDelay", client, delay); + sendNetworkEventToPlayer("vrr.showItemActionDelay", client, delay); } else { logToConsole(LOG_DEBUG, `[VRR.Client] Showing item DROP delay to ${getPlayerDisplayForConsole(client)} (instant)`); playerItemActionDelayComplete(client); @@ -592,7 +607,7 @@ function showPlayerItemPickupDelay(client, itemId) { let delay = getItemTypeData(getItemData(itemId).itemTypeIndex).pickupDelay; if(delay > 0) { logToConsole(LOG_DEBUG, `[VRR.Client] Showing item PICKUP delay to ${getPlayerDisplayForConsole(client)} (${delay} milliseconds)`); - triggerNetworkEvent("vrr.showItemActionDelay", client, delay); + sendNetworkEventToPlayer("vrr.showItemActionDelay", client, delay); } else { logToConsole(LOG_DEBUG, `[VRR.Client] Showing item PICKUP delay to ${getPlayerDisplayForConsole(client)} (instant)`); playerItemActionDelayComplete(client); @@ -607,7 +622,7 @@ function showPlayerItemPutDelay(client, itemSlot) { let delay = getItemTypeData(getItemData(getPlayerData(client).hotBarItems[itemSlot]).itemTypeIndex).putDelay; if(delay > 0) { logToConsole(LOG_DEBUG, `[VRR.Client] Showing item PUT delay to ${getPlayerDisplayForConsole(client)} (${delay} milliseconds)`); - triggerNetworkEvent("vrr.showItemActionDelay", client, delay); + sendNetworkEventToPlayer("vrr.showItemActionDelay", client, delay); } else { logToConsole(LOG_DEBUG, `[VRR.Client] Showing item PUT delay to ${getPlayerDisplayForConsole(client)} (instant)`); playerItemActionDelayComplete(client); @@ -623,7 +638,7 @@ function showPlayerItemSwitchDelay(client, itemSlot) { let delay = getItemTypeData(getItemData(getPlayerData(client).hotBarItems[itemSlot]).itemTypeIndex).switchDelay; if(delay > 0) { logToConsole(LOG_DEBUG, `[VRR.Client] Showing item switch delay to ${getPlayerDisplayForConsole(client)} (${delay} milliseconds)`); - triggerNetworkEvent("vrr.showItemActionDelay", client, delay); + sendNetworkEventToPlayer("vrr.showItemActionDelay", client, delay); } else{ logToConsole(LOG_DEBUG, `[VRR.Client] Showing item switch delay to ${getPlayerDisplayForConsole(client)} (instant)`); playerItemActionDelayComplete(client); @@ -642,14 +657,14 @@ function showPlayerItemSwitchDelay(client, itemSlot) { function sendPlayerDrunkEffect(client, amount, duration) { logToConsole(LOG_DEBUG, `[VRR.Client] Setting drunk effect for ${getPlayerDisplayForConsole(client)} to ${amount} for ${duration} milliseconds`); - triggerNetworkEvent("vrr.drunkEffect", client, amount, duration); + sendNetworkEventToPlayer("vrr.drunkEffect", client, amount, duration); } // =========================================================================== function sendPlayerClearPedState(client) { logToConsole(LOG_DEBUG, `[VRR.Client] Clearing ped state for ${getPlayerDisplayForConsole(client)}`); - triggerNetworkEvent("vrr.clearPedState", client); + sendNetworkEventToPlayer("vrr.clearPedState", client); } // =========================================================================== @@ -707,13 +722,13 @@ function playerDamagedByPlayer(client, damagerEntityName, weaponId, pedPiece, he // =========================================================================== function setPlayerCameraLookAt(client, cameraPosition, lookAtPosition) { - triggerNetworkEvent("vrr.cameraLookAt", client, cameraPosition, lookAtPosition); + sendNetworkEventToPlayer("vrr.cameraLookAt", client, cameraPosition, lookAtPosition); } // =========================================================================== function sendTimeMinuteDurationToPlayer(client, minuteDuration) { - triggerNetworkEvent("vrr.minuteDuration", client, minuteDuration); + sendNetworkEventToPlayer("vrr.minuteDuration", client, minuteDuration); } // =========================================================================== @@ -744,13 +759,13 @@ function forcePlayerIntoSkinSelect(client) { setPlayerDimension(client, client.index+500); } - triggerNetworkEvent("vrr.skinSelect", client, true); + sendNetworkEventToPlayer("vrr.skinSelect", client, true); } // =========================================================================== function updatePlayerCash(client) { - triggerNetworkEvent("vrr.money", client, getPlayerCurrentSubAccount(client).cash); + sendNetworkEventToPlayer("vrr.money", client, getPlayerCurrentSubAccount(client).cash); } // =========================================================================== @@ -768,7 +783,7 @@ function sendAllPoliceStationBlips(client) { getColourByName("policeBlue"), ]); } - triggerNetworkEvent("vrr.blips", client, tempBlips); + sendNetworkEventToPlayer("vrr.blips", client, tempBlips); } } @@ -787,7 +802,7 @@ function sendAllFireStationBlips(client) { getColourByName("firefighterRed"), ]); } - triggerNetworkEvent("vrr.blips", client, tempBlips); + sendNetworkEventToPlayer("vrr.blips", client, tempBlips); } } @@ -806,7 +821,7 @@ function sendAllHospitalBlips(client) { getColourByName("medicPink"), ]); } - triggerNetworkEvent("vrr.blips", client, tempBlips); + sendNetworkEventToPlayer("vrr.blips", client, tempBlips); } } @@ -825,7 +840,7 @@ function sendAllAmmunationBlips(client) { 0 ]); } - triggerNetworkEvent("vrr.blips", client, tempBlips); + sendNetworkEventToPlayer("vrr.blips", client, tempBlips); } } @@ -844,7 +859,7 @@ function sendAllPayAndSprayBlips(client) { 0 ]); } - triggerNetworkEvent("vrr.blips", client, tempBlips); + sendNetworkEventToPlayer("vrr.blips", client, tempBlips); } } @@ -863,27 +878,27 @@ function sendAllFuelStationBlips(client) { getColourByName("burntOrange"), ]); } - triggerNetworkEvent("vrr.blips", client, tempBlips); + sendNetworkEventToPlayer("vrr.blips", client, tempBlips); } } // =========================================================================== function sendPlayerSetHealth(client, health) { - triggerNetworkEvent("vrr.health", client, health); + sendNetworkEventToPlayer("vrr.health", client, health); } // =========================================================================== function sendPlayerSetArmour(client, armour) { - triggerNetworkEvent("vrr.armour", client, armour); + sendNetworkEventToPlayer("vrr.armour", client, armour); } // =========================================================================== function playerFinishedSkinSelection(client, allowedSkinIndex) { - triggerNetworkEvent("vrr.skinSelect", client, false); + sendNetworkEventToPlayer("vrr.skinSelect", client, false); if(allowedSkinIndex == -1) { messagePlayerAlert(client, "You canceled the skin change."); restorePlayerCamera(client); @@ -934,28 +949,28 @@ function playerFinishedSkinSelection(client, allowedSkinIndex) { // =========================================================================== function sendPlayerChatScrollLines(client, amount) { - triggerNetworkEvent("vrr.chatScrollLines", client, amount); + sendNetworkEventToPlayer("vrr.chatScrollLines", client, amount); } // =========================================================================== function playRadioStreamForPlayer(client, streamURL, loop = true, volume = 0, element = false) { logToConsole(LOG_DEBUG, `[VRR.Client] Forcing ${getPlayerDisplayForConsole(client)} to stream ${streamURL}`); - triggerNetworkEvent("vrr.radioStream", client, streamURL, loop, volume, element); + sendNetworkEventToPlayer("vrr.radioStream", client, streamURL, loop, volume, element); } // =========================================================================== function playAudioFileForPlayer(client, audioName, loop = true, volume = 0, element = false) { logToConsole(LOG_DEBUG, `[VRR.Client] Forcing ${getPlayerDisplayForConsole(client)} to play audio ${audioName}`); - triggerNetworkEvent("vrr.audioFileStream", client, audioName, loop, volume); + sendNetworkEventToPlayer("vrr.audioFileStream", client, audioName, loop, volume); } // =========================================================================== function stopRadioStreamForPlayer(client) { logToConsole(LOG_DEBUG, `[VRR.Client] Forcing ${getPlayerDisplayForConsole(client)} to stop their radio stream`); - triggerNetworkEvent("vrr.stopRadioStream", client); + sendNetworkEventToPlayer("vrr.stopRadioStream", client); } // =========================================================================== @@ -963,20 +978,20 @@ function stopRadioStreamForPlayer(client) { function setPlayerStreamingRadioVolume(client, volumeLevel, elementId = false) { getPlayerData(client).accountData.streamingRadioVolume = volumeLevel; getPlayerData(client).streamingRadioElement = elementId; - triggerNetworkEvent("vrr.radioVolume", client, volumeLevel, elementId); + sendNetworkEventToPlayer("vrr.radioVolume", client, volumeLevel, elementId); } // =========================================================================== function setVehicleLightsState(vehicle, state) { setEntityData(vehicle, "vrr.lights", getVehicleData(vehicle).lights); - triggerNetworkEvent("vrr.veh.lights", null, vehicle.id, state); + sendNetworkEventToPlayer("vrr.veh.lights", null, vehicle.id, state); } // =========================================================================== function sendPlayerEnterPropertyKey(client, key) { - triggerNetworkEvent("vrr.enterPropertyKey", client, key); + sendNetworkEventToPlayer("vrr.enterPropertyKey", client, key); } // =========================================================================== @@ -1011,13 +1026,13 @@ function makePedPlayAnimation(ped, animationSlot, positionOffset) { break; } //} - triggerNetworkEvent("vrr.pedAnim", null, ped.id, animationData[1], animationData[2], animationData[3], animationData[4], animationData[5], positionOffset, freezePlayer); + sendNetworkEventToPlayer("vrr.pedAnim", null, ped.id, animationData[1], animationData[2], animationData[3], animationData[4], animationData[5], positionOffset, freezePlayer); } // =========================================================================== function makePedStopAnimation(ped) { - triggerNetworkEvent("vrr.pedStopAnim", null, ped.id); + sendNetworkEventToPlayer("vrr.pedStopAnim", null, ped.id); } // =========================================================================== @@ -1025,13 +1040,13 @@ function makePedStopAnimation(ped) { function forcePedAnimation(ped, animationSlot) { let animationData = getAnimationData(animationSlot); - triggerNetworkEvent("vrr.forcePedAnim", null, ped.id, animationData[1], animationData[2], animationData[3], animationData[4]); + sendNetworkEventToPlayer("vrr.forcePedAnim", null, ped.id, animationData[1], animationData[2], animationData[3], animationData[4]); } // =========================================================================== function hideAllPlayerGUI(client) { - triggerNetworkEvent("vrr.hideAllGUI", client); + sendNetworkEventToPlayer("vrr.hideAllGUI", client); } // =========================================================================== @@ -1045,44 +1060,44 @@ function setPlayerHeadLookPosition(client, position) { // =========================================================================== function sendPlayerGameScriptState(client, scriptName, state) { - triggerNetworkEvent("vrr.gameScript", client, scriptName, state); + sendNetworkEventToPlayer("vrr.gameScript", client, scriptName, state); } // =========================================================================== function requestClientInfo(client) { - triggerNetworkEvent("vrr.clientInfo", client); + sendNetworkEventToPlayer("vrr.clientInfo", client); } // =========================================================================== function updateInteriorLightsForPlayer(client, state) { - triggerNetworkEvent("vrr.interiorLights", client, state); + sendNetworkEventToPlayer("vrr.interiorLights", client, state); } // =========================================================================== function forcePlayerToSyncElementProperties(client, element) { - triggerNetworkEvent("vrr.syncElement", client, element.id); + sendNetworkEventToPlayer("vrr.syncElement", client, element.id); } // =========================================================================== function sendPlayerPedPartsAndProps(client) { - triggerNetworkEvent("vrr.ped") + sendNetworkEventToPlayer("vrr.ped") } // =========================================================================== function setPlayerVanillaRadioStation(client, radioStationId) { - triggerNetworkEvent("vrr.vanillaRadio", client, radioStationId); + sendNetworkEventToPlayer("vrr.vanillaRadio", client, radioStationId); return true; } // =========================================================================== function forcePlayerWantedLevel(client, wantedLevel) { - triggerNetworkEvent("vrr.wantedLevel", client, wantedLevel); + sendNetworkEventToPlayer("vrr.wantedLevel", client, wantedLevel); return true; } diff --git a/scripts/server/job/garbage.js b/scripts/server/job/garbage.js index cd19d9f6..cda21555 100644 --- a/scripts/server/job/garbage.js +++ b/scripts/server/job/garbage.js @@ -109,7 +109,7 @@ function showNextGarbageStop(client) { // =========================================================================== function showCurrentGarbageStop(client) { - triggerNetworkEvent("vrr.showGarbageStop", client, getGarbageRouteStopPosition(getPlayerIsland(client), getPlayerData(client).jobRoute, getPlayerData(client).jobRouteStop), getColourByName("garbageDriverGreen")); + sendNetworkEventToPlayer("vrr.showGarbageStop", client, getGarbageRouteStopPosition(getPlayerIsland(client), getPlayerData(client).jobRoute, getPlayerData(client).jobRouteStop), getColourByName("garbageDriverGreen")); } // =========================================================================== diff --git a/scripts/server/native/connected.js b/scripts/server/native/connected.js index 50339477..a68c4cff 100644 --- a/scripts/server/native/connected.js +++ b/scripts/server/native/connected.js @@ -2,8 +2,8 @@ // Vortrex's Roleplay Resource // https://github.com/VortrexFTW/gtac_roleplay // =========================================================================== -// FILE: gtac.js -// DESC: Provides natives for GTA and Mafia Connected mods +// FILE: connected.js +// DESC: Provides wrapped natives for GTA Connected and Mafia Connected mods // TYPE: Server (JavaScript) // =========================================================================== @@ -591,7 +591,7 @@ function getPlayerElement(client) { // =========================================================================== function setElementPosition(element, position) { - triggerNetworkEvent("vrr.elementPosition", getClientFromSyncerId(element.syncer), element.id, position); + sendNetworkEventToPlayer("vrr.elementPosition", getClientFromSyncerId(element.syncer), element.id, position); } // =========================================================================== @@ -616,7 +616,7 @@ function setElementInterior(element, interior) { // =========================================================================== function setElementCollisionsEnabled(element, state) { - triggerNetworkEvent("vrr.elementCollisions", getClientFromSyncerId(element.syncer), element.id, state); + sendNetworkEventToPlayer("vrr.elementCollisions", getClientFromSyncerId(element.syncer), element.id, state); } // =========================================================================== @@ -660,4 +660,236 @@ function getPlayerWeapon(client) { return client.player.weapon; } +// =========================================================================== + +function connectToDatabase() { + if(databaseConfig.usePersistentConnection) { + if(persistentDatabaseConnection == null) { + logToConsole(LOG_DEBUG, "[VRR.Database] Initializing database connection ..."); + persistentDatabaseConnection = module.mysql.connect(databaseConfig.host, databaseConfig.user, databaseConfig.pass, databaseConfig.name, databaseConfig.port); + if(persistentDatabaseConnection.error) { + console.warn("[VRR.Database] Database connection error: " + toString(persistentDatabaseConnection.error)); + persistentDatabaseConnection = null; + return false; + } + + logToConsole(LOG_DEBUG, "[VRR.Database] Database connection successful!"); + return persistentDatabaseConnection; + } else { + logToConsole(LOG_DEBUG, "[VRR.Database] Using existing database connection."); + return persistentDatabaseConnection; + } + } else { + let databaseConnection = module.mysql.connect(databaseConfig.host, databaseConfig.user, databaseConfig.pass, databaseConfig.name, databaseConfig.port); + if(databaseConnection.error) { + console.warn("[VRR.Database] Database connection error: " + toString(persistentDatabaseConnection.error)); + return false; + } else { + return databaseConnection; + } + } +} + +// =========================================================================== + +function disconnectFromDatabase(dbConnection) { + if(!databaseConfig.usePersistentConnection) { + try { + dbConnection.close(); + logToConsole(LOG_DEBUG, `[VRR.Database] Database connection closed successfully`); + } catch(error) { + logToConsole(LOG_ERROR, `[VRR.Database] Database connection could not be closed! (Error: ${error})`); + } + } + return true; +} + +// =========================================================================== + +function queryDatabase(dbConnection, queryString) { + logToConsole(LOG_DEBUG, `[VRR.Database] Query string: ${queryString}`); + return dbConnection.query(queryString); +} + +// =========================================================================== + +function escapeDatabaseString(dbConnection, unsafeString = "") { + if(!dbConnection) { + dbConnection = connectToDatabase(); + } + + if(typeof unsafeString == "string") { + return dbConnection.escapeString(unsafeString); + } + return unsafeString; +} + +// =========================================================================== + +function getDatabaseInsertId(dbConnection) { + return dbConnection.insertId; +} + +// =========================================================================== + +function getQueryNumRows(dbQuery) { + return dbQuery.numRows; +} + +// =========================================================================== + +function getDatabaseError(dbConnection) { + return dbConnection.error; +} + +// =========================================================================== + +function freeDatabaseQuery(dbQuery) { + if(dbQuery != null) { + dbQuery.free(); + } + return; +} + +// =========================================================================== + +function fetchQueryAssoc(dbQuery) { + return dbQuery.fetchAssoc(); +} + +// =========================================================================== + +function quickDatabaseQuery(queryString) { + let dbConnection = connectToDatabase(); + let insertId = 0; + if(dbConnection) { + //logToConsole(LOG_DEBUG, `[VRR.Database] Query string: ${queryString}`); + let dbQuery = queryDatabase(dbConnection, queryString); + if(getDatabaseInsertId(dbConnection)) { + insertId = getDatabaseInsertId(dbConnection); + logToConsole(LOG_DEBUG, `[VRR.Database] Query returned insert id ${insertId}`); + } + + if(dbQuery) { + try { + freeDatabaseQuery(dbQuery); + logToConsole(LOG_DEBUG, `[VRR.Database] Query result free'd successfully`); + } catch(error) { + logToConsole(LOG_ERROR, `[VRR.Database] Query result could not be free'd! (Error: ${error})`); + } + } + + disconnectFromDatabase(dbConnection); + + if(insertId != 0) { + return insertId; + } + + return true; + } + return false; +} + +// =========================================================================== + +function executeDatabaseQueryCommand(command, params, client) { + if(areParamsEmpty(params)) { + messagePlayerSyntax(client, getCommandSyntaxText(command)); + return false; + } + + if(!targetClient) { + messagePlayerError(client, "That player was not found!"); + return false; + } + + if(targetCode == "") { + messagePlayerError(client, "You didn't enter any code!"); + return false; + } + + let success = quickDatabaseQuery(params); + + if(!success) { + messagePlayerAlert(client, `Database query failed to execute: {ALTCOLOUR}${query}`); + } else if(typeof success != "boolean") { + messagePlayeSuccess(client, `Database query successful: {ALTCOLOUR}${query}`); + messagePlayerInfo(client, `Returns: ${success}`); + } else { + messagePlayerSuccess(client, `Database query successful: {ALTCOLOUR}${query}`); + } + return true; +} + +// =========================================================================== + +function setConstantsAsGlobalVariablesInDatabase() { + let dbConnection = connectToDatabase(); + let entries = Object.entries(global); + for(let i in entries) { + logToConsole(LOG_DEBUG, `[VRR.Database] Checking entry ${i} (${entries[i]})`); + if(toString(i).slice(0, 3).indexOf("VRR_") != -1) { + logToConsole(LOG_DEBUG, `[VRR.Database] Adding ${i} (${entries[i]}) to database global variables`); + } + } +} + +// =========================================================================== + +function loadDatabaseConfiguration() { + let databaseConfigFile = loadTextFile("config/database.json"); + return JSON.parse(databaseConfigFile); +} + +// =========================================================================== + +function createDatabaseInsertQuery(tableName, data) { + let fields = []; + let values = []; + + for(let i in data) { + if(data[i][1] != "undefined" && data[i][1] != NaN && data[i][0] != 'NaN') { + if(data[i][1] != "undefined" && data[i][1] != NaN && data[i][1] != 'NaN') { + fields.push(data[i][0]); + + if(typeof data[i][1] == "string") { + values.push(`'${data[i][1]}'`); + } else { + values.push(data[i][1]); + } + } + } + } + + let queryString = `INSERT INTO ${tableName} (${fields.join(", ")}) VALUES (${values.join(", ")})`; + return queryString; +} + +// =========================================================================== + +function createDatabaseUpdateQuery(tableName, data, whereClause) { + let values = []; + + for(let i in data) { + if(data[i][0] != "undefined" && data[i][0] != NaN && data[i][0] != 'NaN') { + if(data[i][1] != "undefined" && data[i][1] != NaN && data[i][1] != 'NaN') { + if(typeof data[i][1] == "string") { + values.push(`${data[i][0]}='${data[i][1]}'`); + } else { + values.push(`${data[i][0]}=${data[i][1]}`); + } + } + } + } + + let queryString = `UPDATE ${tableName} SET ${values.join(", ")} WHERE ${whereClause}`; + return queryString; +} + +// =========================================================================== + +function sendNetworkEventToPlayer(networkEvent, client, ...args) { + triggerNetworkEvent.apply(null, networkEvent, client, args); +} + // =========================================================================== \ No newline at end of file From e5e9347737929ec4a0717724aeff5cdcef80662f Mon Sep 17 00:00:00 2001 From: Vortrex <3858226+VortrexFTW@users.noreply.github.com> Date: Sun, 9 Jan 2022 05:33:08 -0600 Subject: [PATCH 098/337] Remove duplicate english string entry --- locale/english.json | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/locale/english.json b/locale/english.json index f4d54b29..2b051a98 100644 --- a/locale/english.json +++ b/locale/english.json @@ -99,6 +99,5 @@ "ActionHouseRadioStationChange": "changes the house radio station to {1} ({2})", "ActionVehicleRadioStationChange": "changes the vehicle radio station to {1} ({2})", "ActionItemRadioStationChange": "changes the {1}'s station to {2} ({3})", - "RandomVehicleCommandsDisabled": "This is a random traffic vehicle and commands can't be used for it.", - "RandomVehicleCommandsDisabled": "This is a random traffic vehicle and commands can't be used for it.", + "RandomVehicleCommandsDisabled": "This is a random traffic vehicle and commands can't be used for it." } From 990fc9b450e193bdbd97be4dd6195ff38b5d793a Mon Sep 17 00:00:00 2001 From: Vortrex <3858226+VortrexFTW@users.noreply.github.com> Date: Sun, 9 Jan 2022 05:37:15 -0600 Subject: [PATCH 099/337] Add netevent handler native wrap --- scripts/client/gui.js | 30 +++---- scripts/client/native/connected.js | 4 +- scripts/client/server.js | 136 ++++++++++++++--------------- scripts/server/client.js | 66 +++++++------- scripts/server/native/connected.js | 6 ++ 5 files changed, 124 insertions(+), 118 deletions(-) diff --git a/scripts/client/gui.js b/scripts/client/gui.js index 48374425..f73404f4 100644 --- a/scripts/client/gui.js +++ b/scripts/client/gui.js @@ -169,49 +169,49 @@ let isAnyGUIActive = function() { // =========================================================================== -addNetworkHandler("vrr.showCharacterSelect", function(firstName, lastName, cash, clan, lastPlayed, skinId) { +addNetworkEventHandler("vrr.showCharacterSelect", function(firstName, lastName, cash, clan, lastPlayed, skinId) { logToConsole(LOG_DEBUG, `[VRR.GUI] Received request from server to show character selection window`); showCharacterSelectGUI(firstName, lastName, cash, clan, lastPlayed, skinId); }); // =========================================================================== -addNetworkHandler("vrr.switchCharacterSelect", function(firstName, lastName, cash, clan, lastPlayed, skinId) { +addNetworkEventHandler("vrr.switchCharacterSelect", function(firstName, lastName, cash, clan, lastPlayed, skinId) { logToConsole(LOG_DEBUG, `[VRR.GUI] Received request from server to update character selection window with new info`); switchCharacterSelectGUI(firstName, lastName, cash, clan, lastPlayed, skinId); }); // =========================================================================== -addNetworkHandler("vrr.showError", function(errorMessage, errorTitle) { +addNetworkEventHandler("vrr.showError", function(errorMessage, errorTitle) { logToConsole(LOG_DEBUG, `[VRR.GUI] Received request from server to show error window`); showError(errorMessage, errorTitle); }); // =========================================================================== -addNetworkHandler("vrr.showPrompt", function(promptMessage, promptTitle) { +addNetworkEventHandler("vrr.showPrompt", function(promptMessage, promptTitle) { logToConsole(LOG_DEBUG, `[VRR.GUI] Received request from server to show prompt window`); showYesNoPromptGUI(promptMessage, promptTitle); }); // =========================================================================== -addNetworkHandler("vrr.showInfo", function(infoMessage) { +addNetworkEventHandler("vrr.showInfo", function(infoMessage) { logToConsole(LOG_DEBUG, `[VRR.GUI] Received request from server to show info dialog`); showInfo(infoMessage); }); // =========================================================================== -addNetworkHandler("vrr.loginSuccess", function() { +addNetworkEventHandler("vrr.loginSuccess", function() { logToConsole(LOG_DEBUG, `[VRR.GUI] Received signal of successful login from server`); loginSuccess(); }); // =========================================================================== -addNetworkHandler("vrr.characterSelectSuccess", function() { +addNetworkEventHandler("vrr.characterSelectSuccess", function() { logToConsole(LOG_DEBUG, `[VRR.GUI] Received signal of successful character selection from server`); characterSelectSuccess(); setChatWindowEnabled(true); @@ -219,49 +219,49 @@ addNetworkHandler("vrr.characterSelectSuccess", function() { // =========================================================================== -addNetworkHandler("vrr.loginFailed", function(remainingAttempts) { +addNetworkEventHandler("vrr.loginFailed", function(remainingAttempts) { logToConsole(LOG_DEBUG, `[VRR.GUI] Received signal of failed login from server`); loginFailed(remainingAttempts); }); // =========================================================================== -addNetworkHandler("vrr.registrationSuccess", function() { +addNetworkEventHandler("vrr.registrationSuccess", function() { logToConsole(LOG_DEBUG, `[VRR.GUI] Received signal of successful registration from server`); registrationSuccess(); }); // =========================================================================== -addNetworkHandler("vrr.registrationFailed", function(errorMessage) { +addNetworkEventHandler("vrr.registrationFailed", function(errorMessage) { logToConsole(LOG_DEBUG, `[VRR.GUI] Received signal of failed registration from server`); registrationFailed(errorMessage); }); // =========================================================================== -addNetworkHandler("vrr.newCharacterFailed", function(errorMessage) { +addNetworkEventHandler("vrr.newCharacterFailed", function(errorMessage) { logToConsole(LOG_DEBUG, `[VRR.GUI] Received signal of failed registration from server`); newCharacterFailed(errorMessage); }); // =========================================================================== -addNetworkHandler("vrr.changePassword", function() { +addNetworkEventHandler("vrr.changePassword", function() { logToConsole(LOG_DEBUG, `[VRR.GUI] Received signal to change password from server`); showChangePasswordGUI(); }); // =========================================================================== -addNetworkHandler("vrr.showResetPasswordCodeInput", function() { +addNetworkEventHandler("vrr.showResetPasswordCodeInput", function() { logToConsole(LOG_DEBUG, `[VRR.GUI] Received signal to input reset password code from server`); resetPasswordCodeInputGUI(); }); // =========================================================================== -addNetworkHandler("vrr.guiColour", function(red1, green1, blue1, red2, green2, blue2, red3, green3, blue3) { +addNetworkEventHandler("vrr.guiColour", function(red1, green1, blue1, red2, green2, blue2, red3, green3, blue3) { logToConsole(LOG_DEBUG, `[VRR.GUI] Received new GUI colours from server: ${red1}, ${green1}, ${blue1} / ${red2}, ${green2}, ${blue2} / ${red3}, ${green3}, ${blue3}`); primaryColour = [red1, green1, blue1]; secondaryColour = [red2, green2, blue2]; @@ -273,7 +273,7 @@ addNetworkHandler("vrr.guiColour", function(red1, green1, blue1, red2, green2, b // =========================================================================== -addNetworkHandler("vrr.guiInit", function() { +addNetworkEventHandler("vrr.guiInit", function() { logToConsole(LOG_DEBUG, `[VRR.GUI] Initializing MexUI app`); //initGUI(); sendNetworkEventToServer("vrr.guiReady", true); diff --git a/scripts/client/native/connected.js b/scripts/client/native/connected.js index dd77dec1..8215fa01 100644 --- a/scripts/client/native/connected.js +++ b/scripts/client/native/connected.js @@ -57,8 +57,8 @@ function createGameVehicle(modelIndex, position, heading) { // =========================================================================== -function addNetworkEventHandler(eventName, ...args) { - addNetworkHandler.apply(null, eventName, args); +function addNetworkEventHandler(eventName, handlerFunction) { + addNetworkHandler(eventName, handlerFunction); } // =========================================================================== diff --git a/scripts/client/server.js b/scripts/client/server.js index ac13f51d..56c55c22 100644 --- a/scripts/client/server.js +++ b/scripts/client/server.js @@ -18,84 +18,84 @@ function initServerScript() { function addAllNetworkHandlers() { logToConsole(LOG_DEBUG, "[VRR.Server]: Adding network handlers ..."); - addNetworkHandler("vrr.smallGameMessage", showSmallGameMessage); - addNetworkHandler("vrr.working", setLocalPlayerWorkingState); - addNetworkHandler("vrr.jobType", setLocalPlayerJobType); - addNetworkHandler("vrr.passenger", enterVehicleAsPassenger); + addNetworkEventHandler("vrr.smallGameMessage", showSmallGameMessage); + addNetworkEventHandler("vrr.working", setLocalPlayerWorkingState); + addNetworkEventHandler("vrr.jobType", setLocalPlayerJobType); + addNetworkEventHandler("vrr.passenger", enterVehicleAsPassenger); - addNetworkHandler("vrr.freeze", setLocalPlayerFrozenState); - addNetworkHandler("vrr.control", setLocalPlayerControlState); - addNetworkHandler("vrr.fadeCamera", fadeLocalCamera); - addNetworkHandler("vrr.removeFromVehicle", removeLocalPlayerFromVehicle); - addNetworkHandler("vrr.clearPeds", clearLocalPlayerOwnedPeds); - addNetworkHandler("vrr.restoreCamera", restoreLocalCamera); - addNetworkHandler("vrr.cameraLookAt", setLocalCameraLookAt); - addNetworkHandler("vrr.logo", setServerLogoRenderState); - addNetworkHandler("vrr.ambience", setCityAmbienceState); - addNetworkHandler("vrr.runCode", runClientCode); - addNetworkHandler("vrr.clearWeapons", clearLocalPlayerWeapons); - addNetworkHandler("vrr.giveWeapon", giveLocalPlayerWeapon); - addNetworkHandler("vrr.position", setLocalPlayerPosition); - addNetworkHandler("vrr.heading", setLocalPlayerHeading); - addNetworkHandler("vrr.interior", setLocalPlayerInterior); - addNetworkHandler("vrr.minuteDuration", setMinuteDuration); - addNetworkHandler("vrr.showJobRouteStop", showJobRouteStop); - addNetworkHandler("vrr.snow", setSnowState); - addNetworkHandler("vrr.health", setLocalPlayerHealth); - addNetworkHandler("vrr.enterPropertyKey", setEnterPropertyKey); - addNetworkHandler("vrr.skinSelect", toggleSkinSelect); - addNetworkHandler("vrr.hotbar", updatePlayerHotBar); - addNetworkHandler("vrr.pedSpeech", playPedSpeech); - addNetworkHandler("vrr.clearPedState", clearLocalPedState); - addNetworkHandler("vrr.drunkEffect", setLocalPlayerDrunkEffect); - addNetworkHandler("vrr.showItemActionDelay", showItemActionDelay); - addNetworkHandler("vrr.set2DRendering", setPlayer2DRendering); - addNetworkHandler("vrr.mouseCursor", toggleMouseCursor); - addNetworkHandler("vrr.mouseCamera", toggleMouseCamera); - addNetworkHandler("vrr.mouseCameraForce", setMouseCameraState); - addNetworkHandler("vrr.weaponDamageEnabled", setPlayerWeaponDamageEnabled); - addNetworkHandler("vrr.weaponDamageEvent", setPlayerWeaponDamageEvent); - addNetworkHandler("vrr.spawned", onServerSpawnedPlayer); - addNetworkHandler("vrr.money", setLocalPlayerCash); - addNetworkHandler("vrr.armour", setLocalPlayerArmour); - addNetworkHandler("vrr.wantedLevel", forceLocalPlayerWantedLevel); + addNetworkEventHandler("vrr.freeze", setLocalPlayerFrozenState); + addNetworkEventHandler("vrr.control", setLocalPlayerControlState); + addNetworkEventHandler("vrr.fadeCamera", fadeLocalCamera); + addNetworkEventHandler("vrr.removeFromVehicle", removeLocalPlayerFromVehicle); + addNetworkEventHandler("vrr.clearPeds", clearLocalPlayerOwnedPeds); + addNetworkEventHandler("vrr.restoreCamera", restoreLocalCamera); + addNetworkEventHandler("vrr.cameraLookAt", setLocalCameraLookAt); + addNetworkEventHandler("vrr.logo", setServerLogoRenderState); + addNetworkEventHandler("vrr.ambience", setCityAmbienceState); + addNetworkEventHandler("vrr.runCode", runClientCode); + addNetworkEventHandler("vrr.clearWeapons", clearLocalPlayerWeapons); + addNetworkEventHandler("vrr.giveWeapon", giveLocalPlayerWeapon); + addNetworkEventHandler("vrr.position", setLocalPlayerPosition); + addNetworkEventHandler("vrr.heading", setLocalPlayerHeading); + addNetworkEventHandler("vrr.interior", setLocalPlayerInterior); + addNetworkEventHandler("vrr.minuteDuration", setMinuteDuration); + addNetworkEventHandler("vrr.showJobRouteStop", showJobRouteStop); + addNetworkEventHandler("vrr.snow", setSnowState); + addNetworkEventHandler("vrr.health", setLocalPlayerHealth); + addNetworkEventHandler("vrr.enterPropertyKey", setEnterPropertyKey); + addNetworkEventHandler("vrr.skinSelect", toggleSkinSelect); + addNetworkEventHandler("vrr.hotbar", updatePlayerHotBar); + addNetworkEventHandler("vrr.pedSpeech", playPedSpeech); + addNetworkEventHandler("vrr.clearPedState", clearLocalPedState); + addNetworkEventHandler("vrr.drunkEffect", setLocalPlayerDrunkEffect); + addNetworkEventHandler("vrr.showItemActionDelay", showItemActionDelay); + addNetworkEventHandler("vrr.set2DRendering", setPlayer2DRendering); + addNetworkEventHandler("vrr.mouseCursor", toggleMouseCursor); + addNetworkEventHandler("vrr.mouseCamera", toggleMouseCamera); + addNetworkEventHandler("vrr.mouseCameraForce", setMouseCameraState); + addNetworkEventHandler("vrr.weaponDamageEnabled", setPlayerWeaponDamageEnabled); + addNetworkEventHandler("vrr.weaponDamageEvent", setPlayerWeaponDamageEvent); + addNetworkEventHandler("vrr.spawned", onServerSpawnedPlayer); + addNetworkEventHandler("vrr.money", setLocalPlayerCash); + addNetworkEventHandler("vrr.armour", setLocalPlayerArmour); + addNetworkEventHandler("vrr.wantedLevel", forceLocalPlayerWantedLevel); - addNetworkHandler("vrr.delKeyBind", unBindAccountKey); - addNetworkHandler("vrr.addKeyBind", bindAccountKey); - addNetworkHandler("vrr.clearKeyBinds", clearKeyBinds); + addNetworkEventHandler("vrr.delKeyBind", unBindAccountKey); + addNetworkEventHandler("vrr.addKeyBind", bindAccountKey); + addNetworkEventHandler("vrr.clearKeyBinds", clearKeyBinds); - addNetworkHandler("vrr.nametag", updatePlayerNameTag); - addNetworkHandler("vrr.ping", updatePlayerPing); + addNetworkEventHandler("vrr.nametag", updatePlayerNameTag); + addNetworkEventHandler("vrr.ping", updatePlayerPing); - addNetworkHandler("vrr.m", receiveChatBoxMessageFromServer); - addNetworkHandler("vrr.chatScrollLines", setChatScrollLines); + addNetworkEventHandler("vrr.m", receiveChatBoxMessageFromServer); + addNetworkEventHandler("vrr.chatScrollLines", setChatScrollLines); - addNetworkHandler("vrr.radioStream", playStreamingRadio); - addNetworkHandler("vrr.audioFileStream", playAudioFile); - addNetworkHandler("vrr.stopRadioStream", stopStreamingRadio); - addNetworkHandler("vrr.radioVolume", setStreamingRadioVolume); + addNetworkEventHandler("vrr.radioStream", playStreamingRadio); + addNetworkEventHandler("vrr.audioFileStream", playAudioFile); + addNetworkEventHandler("vrr.stopRadioStream", stopStreamingRadio); + addNetworkEventHandler("vrr.radioVolume", setStreamingRadioVolume); - addNetworkHandler("vrr.veh.lights", setVehicleLights); - addNetworkHandler("vrr.veh.engine", setVehicleEngine); - addNetworkHandler("vrr.veh.repair", repairVehicle); + addNetworkEventHandler("vrr.veh.lights", setVehicleLights); + addNetworkEventHandler("vrr.veh.engine", setVehicleEngine); + addNetworkEventHandler("vrr.veh.repair", repairVehicle); - addNetworkHandler("vrr.pedAnim", makePedPlayAnimation); - addNetworkHandler("vrr.pedStopAnim", makePedStopAnimation); - addNetworkHandler("vrr.forcePedAnim", forcePedAnimation); - addNetworkHandler("vrr.hideAllGUI", hideAllGUI); - addNetworkHandler("vrr.gameScript", setGameScriptState); - addNetworkHandler("vrr.clientInfo", serverRequestedClientInfo); - addNetworkHandler("vrr.interiorLights", updateInteriorLightsState); + addNetworkEventHandler("vrr.pedAnim", makePedPlayAnimation); + addNetworkEventHandler("vrr.pedStopAnim", makePedStopAnimation); + addNetworkEventHandler("vrr.forcePedAnim", forcePedAnimation); + addNetworkEventHandler("vrr.hideAllGUI", hideAllGUI); + addNetworkEventHandler("vrr.gameScript", setGameScriptState); + addNetworkEventHandler("vrr.clientInfo", serverRequestedClientInfo); + addNetworkEventHandler("vrr.interiorLights", updateInteriorLightsState); - addNetworkHandler("vrr.syncElement", forceSyncElementProperties); - addNetworkHandler("vrr.elementPosition", setElementPosition); - addNetworkHandler("vrr.elementCollisions", setElementCollisionsEnabled); + addNetworkEventHandler("vrr.syncElement", forceSyncElementProperties); + addNetworkEventHandler("vrr.elementPosition", setElementPosition); + addNetworkEventHandler("vrr.elementCollisions", setElementCollisionsEnabled); - addNetworkHandler("vrr.vehBuyState", setVehiclePurchaseState); + addNetworkEventHandler("vrr.vehBuyState", setVehiclePurchaseState); - addNetworkHandler("vrr.showRegistration", showRegistrationGUI); - addNetworkHandler("vrr.showNewCharacter", showNewCharacterGUI); - addNetworkHandler("vrr.showLogin", showLoginGUI); + addNetworkEventHandler("vrr.showRegistration", showRegistrationGUI); + addNetworkEventHandler("vrr.showNewCharacter", showNewCharacterGUI); + addNetworkEventHandler("vrr.showLogin", showLoginGUI); } // =========================================================================== diff --git a/scripts/server/client.js b/scripts/server/client.js index c764dad0..c74dd5ac 100644 --- a/scripts/server/client.js +++ b/scripts/server/client.js @@ -19,61 +19,61 @@ function addAllNetworkHandlers() { logToConsole(LOG_DEBUG, "[VRR.Client]: Adding network handlers ..."); // KeyBind - addNetworkHandler("vrr.useKeyBind", playerUsedKeyBind); + addNetworkEventHandler("vrr.useKeyBind", playerUsedKeyBind); // GUI - addNetworkHandler("vrr.promptAnswerNo", playerPromptAnswerNo); - addNetworkHandler("vrr.promptAnswerYes", playerPromptAnswerYes); - addNetworkHandler("vrr.toggleGUI", playerToggledGUI); + addNetworkEventHandler("vrr.promptAnswerNo", playerPromptAnswerNo); + addNetworkEventHandler("vrr.promptAnswerYes", playerPromptAnswerYes); + addNetworkEventHandler("vrr.toggleGUI", playerToggledGUI); // AFK - addNetworkHandler("vrr.afk", playerChangeAFKState); + addNetworkEventHandler("vrr.afk", playerChangeAFKState); // Event - addNetworkHandler("vrr.pickup", onPlayerNearPickup); - addNetworkHandler("vrr.enteredSphere", onPlayerEnteredSphere); - addNetworkHandler("vrr.exitedSphere", onPlayerExitedSphere); - addNetworkHandler("vrr.playerDeath", onPlayerDeath); - addNetworkHandler("vrr.onPlayerEnterVehicle", onPlayerEnteredVehicle); - addNetworkHandler("vrr.onPlayerExitVehicle", onPlayerExitedVehicle); + addNetworkEventHandler("vrr.pickup", onPlayerNearPickup); + addNetworkEventHandler("vrr.enteredSphere", onPlayerEnteredSphere); + addNetworkEventHandler("vrr.exitedSphere", onPlayerExitedSphere); + addNetworkEventHandler("vrr.playerDeath", onPlayerDeath); + addNetworkEventHandler("vrr.onPlayerEnterVehicle", onPlayerEnteredVehicle); + addNetworkEventHandler("vrr.onPlayerExitVehicle", onPlayerExitedVehicle); // Job - addNetworkHandler("vrr.arrivedAtJobRouteStop", playerArrivedAtJobRouteStop); + addNetworkEventHandler("vrr.arrivedAtJobRouteStop", playerArrivedAtJobRouteStop); // Client - addNetworkHandler("vrr.clientReady", playerClientReady); - addNetworkHandler("vrr.guiReady", playerGUIReady); - addNetworkHandler("vrr.clientStarted", playerClientStarted); - addNetworkHandler("vrr.clientStopped", playerClientStopped); + addNetworkEventHandler("vrr.clientReady", playerClientReady); + addNetworkEventHandler("vrr.guiReady", playerGUIReady); + addNetworkEventHandler("vrr.clientStarted", playerClientStarted); + addNetworkEventHandler("vrr.clientStopped", playerClientStopped); // Account - addNetworkHandler("vrr.checkLogin", checkLogin); - addNetworkHandler("vrr.checkRegistration", checkRegistration); - addNetworkHandler("vrr.checkResetPassword", checkAccountResetPasswordRequest); - addNetworkHandler("vrr.checkChangePassword", checkAccountChangePassword); + addNetworkEventHandler("vrr.checkLogin", checkLogin); + addNetworkEventHandler("vrr.checkRegistration", checkRegistration); + addNetworkEventHandler("vrr.checkResetPassword", checkAccountResetPasswordRequest); + addNetworkEventHandler("vrr.checkChangePassword", checkAccountChangePassword); // Developer - addNetworkHandler("vrr.runCodeSuccess", clientRunCodeSuccess); - addNetworkHandler("vrr.runCodeFail", clientRunCodeFail); + addNetworkEventHandler("vrr.runCodeSuccess", clientRunCodeSuccess); + addNetworkEventHandler("vrr.runCodeFail", clientRunCodeFail); // SubAccount - addNetworkHandler("vrr.checkNewCharacter", checkNewCharacter); - addNetworkHandler("vrr.nextCharacter", checkNextCharacter); - addNetworkHandler("vrr.previousCharacter", checkPreviousCharacter); - addNetworkHandler("vrr.selectCharacter", selectCharacter); + addNetworkEventHandler("vrr.checkNewCharacter", checkNewCharacter); + addNetworkEventHandler("vrr.nextCharacter", checkNextCharacter); + addNetworkEventHandler("vrr.previousCharacter", checkPreviousCharacter); + addNetworkEventHandler("vrr.selectCharacter", selectCharacter); // Item - addNetworkHandler("vrr.itemActionDelayComplete", playerItemActionDelayComplete); + addNetworkEventHandler("vrr.itemActionDelayComplete", playerItemActionDelayComplete); - addNetworkHandler("vrr.weaponDamage", playerDamagedByPlayer); + addNetworkEventHandler("vrr.weaponDamage", playerDamagedByPlayer); - addNetworkHandler("vrr.player.position", updatePositionInPlayerData); - addNetworkHandler("vrr.player.heading", updateHeadingInPlayerData); - addNetworkHandler("vrr.player.lookat", setPlayerHeadLookPosition); + addNetworkEventHandler("vrr.player.position", updatePositionInPlayerData); + addNetworkEventHandler("vrr.player.heading", updateHeadingInPlayerData); + addNetworkEventHandler("vrr.player.lookat", setPlayerHeadLookPosition); - addNetworkHandler("vrr.skinSelected", playerFinishedSkinSelection); + addNetworkEventHandler("vrr.skinSelected", playerFinishedSkinSelection); - addNetworkHandler("vrr.clientInfo", updateConnectionLogOnClientInfoReceive); + addNetworkEventHandler("vrr.clientInfo", updateConnectionLogOnClientInfoReceive); } // =========================================================================== diff --git a/scripts/server/native/connected.js b/scripts/server/native/connected.js index a68c4cff..218dcced 100644 --- a/scripts/server/native/connected.js +++ b/scripts/server/native/connected.js @@ -892,4 +892,10 @@ function sendNetworkEventToPlayer(networkEvent, client, ...args) { triggerNetworkEvent.apply(null, networkEvent, client, args); } +// =========================================================================== + +function addNetworkEventHandler(eventName, handlerFunction) { + addNetworkHandler(eventName, handlerFunction); +} + // =========================================================================== \ No newline at end of file From d6836a70646c03f84616ed2636c47dfbd5a6d248 Mon Sep 17 00:00:00 2001 From: Vortrex <3858226+VortrexFTW@users.noreply.github.com> Date: Sun, 9 Jan 2022 17:18:23 -0600 Subject: [PATCH 100/337] Update JS config files --- scripts/client/jsconfig.json | 9 ++++++--- scripts/server/jsconfig.json | 5 +++-- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/scripts/client/jsconfig.json b/scripts/client/jsconfig.json index 9c32b246..a5e369f2 100644 --- a/scripts/client/jsconfig.json +++ b/scripts/client/jsconfig.json @@ -1,11 +1,14 @@ { "compilerOptions": { "module": "commonjs", - "target": "ES6", + "target": "es6", "moduleResolution": "classic" }, "include": [ - "./*.js", - "../shared/*.js" + "*.js", + "gui/*.js", + "native/*.js", + "../shared/*.js", + "../third-party/mexui/*" ] } \ No newline at end of file diff --git a/scripts/server/jsconfig.json b/scripts/server/jsconfig.json index 447ac942..f0347317 100644 --- a/scripts/server/jsconfig.json +++ b/scripts/server/jsconfig.json @@ -1,15 +1,16 @@ { "compilerOptions": { "module": "commonjs", - "target": "ES6", + "target": "es6", "moduleResolution": "classic" }, "include": [ - "./*.js", + "*.js", "job/*.js", "business/*.js", "item/*.js", "npc/*.js", + "native/*.js", "../shared/*.js" ] } \ No newline at end of file From 2684ffae7dfdf22b9436a952062470173106a56b Mon Sep 17 00:00:00 2001 From: Vortrex <3858226+VortrexFTW@users.noreply.github.com> Date: Sun, 9 Jan 2022 17:18:38 -0600 Subject: [PATCH 101/337] Move moderation stuff to generic staff script --- scripts/server/{moderation.js => staff.js} | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) rename scripts/server/{moderation.js => staff.js} (99%) diff --git a/scripts/server/moderation.js b/scripts/server/staff.js similarity index 99% rename from scripts/server/moderation.js rename to scripts/server/staff.js index b1f42c97..a736d516 100644 --- a/scripts/server/moderation.js +++ b/scripts/server/staff.js @@ -2,14 +2,14 @@ // Vortrex's Roleplay Resource // https://github.com/VortrexFTW/gtac_roleplay // =========================================================================== -// FILE: moderation.js -// DESC: Provides moderation commands, functions and usage +// FILE: staff.js +// DESC: Provides staff commands, functions and usage // TYPE: Server (JavaScript) // =========================================================================== -function initModerationScript() { - logToConsole(LOG_INFO, "[VRR.Moderation]: Initializing moderation script ..."); - logToConsole(LOG_INFO, "[VRR.Moderation]: Moderation script initialized successfully!"); +function initStaffScript() { + logToConsole(LOG_INFO, "[VRR.Staff]: Initializing staff script ..."); + logToConsole(LOG_INFO, "[VRR.Staff]: Staff script initialized successfully!"); } // =========================================================================== From 5dfe47a3e86d0d71b17873ffcded615a9e9ca8de Mon Sep 17 00:00:00 2001 From: Vortrex <3858226+VortrexFTW@users.noreply.github.com> Date: Sun, 9 Jan 2022 17:19:53 -0600 Subject: [PATCH 102/337] Organize a lot of utils --- scripts/client/native/connected.js | 72 ++ scripts/server/accent.js | 18 + scripts/server/animation.js | 20 +- scripts/server/anticheat.js | 40 ++ scripts/server/business.js | 19 +- scripts/server/clan.js | 40 +- scripts/server/command.js | 42 ++ scripts/server/house.js | 19 +- scripts/server/item.js | 21 +- scripts/server/job.js | 42 +- scripts/server/locale.js | 15 + scripts/server/messaging.js | 28 + scripts/server/native/connected.js | 65 ++ scripts/server/utilities.js | 1063 ---------------------------- scripts/server/vehicle.js | 6 + scripts/shared/utilities.js | 464 ++++++++++++ 16 files changed, 905 insertions(+), 1069 deletions(-) diff --git a/scripts/client/native/connected.js b/scripts/client/native/connected.js index 8215fa01..ac2e2b90 100644 --- a/scripts/client/native/connected.js +++ b/scripts/client/native/connected.js @@ -67,4 +67,76 @@ function sendNetworkEventToServer(eventName, ...args) { triggerNetworkEvent.apply(null, eventName, args); } +// =========================================================================== + +function getElementId(element) { + return element.id; +} + +// =========================================================================== + +function getClientFromIndex(index) { + let clients = getClients(); + for(let i in clients) { + if(clients[i].index == index) { + return clients[i]; + } + } +} + +// =========================================================================== + +function getVehiclesInRange(position, distance) { + return getElementsByType(ELEMENT_VEHICLE).filter(x => x.player && x.position.distance(position) <= distance); +} + +// =========================================================================== + +function getClientsInRange(position, distance) { + return getPlayersInRange(position, distance); +} + +// =========================================================================== + +function getCiviliansInRange(position, distance) { + return getElementsByType(ELEMENT_PED).filter(x => !x.isType(ELEMENT_PLAYER) && getElementPosition(x).position.distance(position) <= distance); +} + +// =========================================================================== + +function getPlayersInRange(position, distance) { + return getClients().filter(x => getPlayerPosition(x).distance(position) <= distance); +} + +// =========================================================================== + +function getElementsByTypeInRange(elementType, position, distance) { + return getElementsByType(elementType).filter(x => getElementPosition(x).position.distance(position) <= distance); +} + +// =========================================================================== + +function getClosestCivilian(position) { + return getElementsByType(ELEMENT_PED).reduce((i, j) => ((i.position.distance(position) <= j.position.distance(position)) ? i : j)); +} + +// =========================================================================== + +function is2dPositionOnScreen(pos2d) { + return pos2d.x >= 0 && pos2d.y >= 0 && pos2d.x <= game.width && pos2d.y <= game.height; +} + +// =========================================================================== + +function getVehiclesInRange(position, range) { + let vehicles = getElementsByType(ELEMENT_VEHICLE); + let inRangeVehicles = []; + for(let i in vehicles) { + if(getDistance(position, vehicles[i].position) <= range) { + inRangeVehicles.push(vehicles[i]); + } + } + return inRangeVehicles; +} + // =========================================================================== \ No newline at end of file diff --git a/scripts/server/accent.js b/scripts/server/accent.js index 404c14b0..8ddafb52 100644 --- a/scripts/server/accent.js +++ b/scripts/server/accent.js @@ -70,4 +70,22 @@ function listAccentsCommand(command, params, client) { } } +// =========================================================================== + +function getAccentFromParams(params) { + if(isNaN(params)) { + for(let i in getGlobalConfig().accents) { + if(toLowerCase(getGlobalConfig().accents[i]).indexOf(toLowerCase(params)) != -1) { + return i; + } + } + } else { + if(typeof getGlobalConfig().accents[params] != "undefined") { + return toInteger(params); + } + } + + return false; +} + // =========================================================================== \ No newline at end of file diff --git a/scripts/server/animation.js b/scripts/server/animation.js index 2a367db5..583f6935 100644 --- a/scripts/server/animation.js +++ b/scripts/server/animation.js @@ -75,7 +75,7 @@ function showAnimationListCommand(command, params, client) { let chunkedList = splitArrayIntoChunks(animList, 10); - messagePlayerInfo(client, makeChatSectionHeader(getLocaleString(client, "HeaderAnimationsList"))); + messagePlayerInfo(client, makeChatBoxSectionHeader(getLocaleString(client, "HeaderAnimationsList"))); for(let i in chunkedList) { messagePlayerNormal(client, chunkedList[i].join(", ")); @@ -138,4 +138,22 @@ function makePlayerStopAnimation(client) { getPlayerData(client).animationForced = false; } +// =========================================================================== + +function getAnimationFromParams(params) { + if(isNaN(params)) { + for(let i in getGameData().animations[getServerGame()]) { + if(toLowerCase(getGameData().animations[getServerGame()][i][0]).indexOf(toLowerCase(params)) != -1) { + return i; + } + } + } else { + if(typeof getGameData().animations[getServerGame()][params] != "undefined") { + return toInteger(params); + } + } + + return false; +} + // =========================================================================== \ No newline at end of file diff --git a/scripts/server/anticheat.js b/scripts/server/anticheat.js index bebfe6bf..e82b5079 100644 --- a/scripts/server/anticheat.js +++ b/scripts/server/anticheat.js @@ -248,4 +248,44 @@ function isPlayerExemptFromAntiCheat(client) { return false; } +// =========================================================================== + +function canPlayerUsePoliceJob(client) { + if(getPlayerData(client).accountData.flags.moderation & getServerBitFlags().moderationFlags.policeBanned) { + return false; + } + + return true; +} + +// =========================================================================== + +function canClientUseFireJob(client) { + if(getPlayerData(client).accountData.flags.moderation & getServerBitFlags().moderationFlags.fireBanned) { + return false; + } + + return true; +} + +// =========================================================================== + +function canClientUseAmmunations(client) { + if(getPlayerData(client).accountData.flags.moderation & getServerBitFlags().moderationFlags.AmmuBanned) { + return false; + } + + return true; +} + +// =========================================================================== + +function canClientUseGuns(client) { + if(getPlayerData(client).accountData.flags.moderation & getServerBitFlags().moderationFlags.GunBanned) { + return false; + } + + return true; +} + // =========================================================================== \ No newline at end of file diff --git a/scripts/server/business.js b/scripts/server/business.js index 45dfe3f8..0d921f53 100644 --- a/scripts/server/business.js +++ b/scripts/server/business.js @@ -517,7 +517,7 @@ function lockUnlockBusinessCommand(command, params, client) { setEntityData(getBusinessData(businessId).entrancePickup, "vrr.label.locked", getBusinessData(businessId).locked, true); getBusinessData(businessId).needsSaved = true; - messagePlayerSuccess(client, `${getLockedUnlockedEmojiFromBool((getBusinessData(businessId).locked))} Business {businessBlue}${getBusinessData(businessId).name} {MAINCOLOUR}${getLockedUnlockedTextFromBool((getBusinessData(businessId).locked))}!`); + messagePlayerSuccess(client, `${getLockedUnlockedEmojiFromBool((getBusinessData(businessId).locked))} Business {businessBlue}${getBusinessData(businessId).name} {MAINCOLOUR}${getLockedUnlockedFromBool((getBusinessData(businessId).locked))}!`); } // =========================================================================== @@ -2126,3 +2126,20 @@ function deleteBusinessPickups(business) { // =========================================================================== +function getBusinessFromParams(params) { + if(isNaN(params)) { + for(let i in getServerData().businesses) { + if(toLowerCase(getServerData().businesses[i].name).indexOf(toLowerCase(params)) != -1) { + return i; + } + } + } else { + if(typeof getServerData().businesses[params] != "undefined") { + return toInteger(params); + } + } + return false; +} + +// =========================================================================== + diff --git a/scripts/server/clan.js b/scripts/server/clan.js index 0938b0d3..0e58a962 100644 --- a/scripts/server/clan.js +++ b/scripts/server/clan.js @@ -1215,4 +1215,42 @@ function showClanFlagListCommand(command, params, client) { messagePlayerInfo(client, chunkedList[i].join(", ")); } } -*/ \ No newline at end of file +*/ + +function getClanFromParams(params) { + if(isNaN(params)) { + for(let i in getServerData().clans) { + if(toLowerCase(getServerData().clans[i].name).indexOf(toLowerCase(params)) != -1) { + return i; + } + } + } else { + if(typeof getServerData().clans[params] != "undefined") { + return toInteger(params); + } + } + + return false; +} + +// =========================================================================== + +function getClanRankFromParams(clanId, params) { + if(isNaN(params)) { + for(let i in getClanData(clanId).ranks) { + if((toLowerCase(getClanData(clanId).ranks[i].name).indexOf(toLowerCase(params)) != -1)) { + return i; + } + } + } else { + for(let i in getClanData(clanId).ranks) { + if(getClanData(clanId).ranks[i].level == toInteger(params)) { + return i; + } + } + } + + return false; +} + +// =========================================================================== \ No newline at end of file diff --git a/scripts/server/command.js b/scripts/server/command.js index 5c81bb46..1815ec37 100644 --- a/scripts/server/command.js +++ b/scripts/server/command.js @@ -765,4 +765,46 @@ function getCommandAliasesNames(command) { return commandAliases; } +// =========================================================================== + +function areParamsEmpty(params) { + if(!params || params == "" || params.length == 0 || typeof params == "undefined") { + return true; + } + + return false; +} + +// =========================================================================== + +function getParamsCount(params, delimiter = " ") { + return params.split(delimiter).length; +} + +// =========================================================================== + +function areThereEnoughParams(params, requiredAmount, delimiter = " ") { + return (params.split(delimiter).length >= requiredAmount); +} + +// =========================================================================== + +function getParam(params, delimiter, index) { + return params.split(delimiter)[index]; +} + +// =========================================================================== + +function getCommandFromParams(params) { + for(let i in serverCommands) { + for(let j in serverCommands[i]) { + if(toLowerCase(serverCommands[i][j].command).indexOf(toLowerCase(params)) != -1) { + return serverCommands[i][j]; + } + } + } + + return false; +} + // =========================================================================== \ No newline at end of file diff --git a/scripts/server/house.js b/scripts/server/house.js index 969e9fd0..b690dc9c 100644 --- a/scripts/server/house.js +++ b/scripts/server/house.js @@ -125,7 +125,7 @@ function lockUnlockHouseCommand(command, params, client) { setEntityData(getHouseData(houseId).entrancePickup, "vrr.label.locked", getHouseData(houseId).locked, true); getHouseData(houseId).needsSaved = true; - messagePlayerSuccess(client, `House {houseGreen}${getHouseData(houseId).description} {MAINCOLOUR}${getLockedUnlockedTextFromBool((getHouseData(houseId).locked))}!`); + messagePlayerSuccess(client, `House {houseGreen}${getHouseData(houseId).description} {MAINCOLOUR}${getLockedUnlockedFromBool((getHouseData(houseId).locked))}!`); } // =========================================================================== @@ -1380,4 +1380,21 @@ function canPlayerManageHouse(client, houseId) { return false; } +// =========================================================================== + +function getHouseFromParams(params) { + if(isNaN(params)) { + for(let i in getServerData().houses) { + if(toLowerCase(getServerData().houses[i].description).indexOf(toLowerCase(params)) != -1) { + return i; + } + } + } else { + if(typeof getServerData().houses[params] != "undefined") { + return toInteger(params); + } + } + return false; +} + // =========================================================================== \ No newline at end of file diff --git a/scripts/server/item.js b/scripts/server/item.js index aadad5b8..c6a2c074 100644 --- a/scripts/server/item.js +++ b/scripts/server/item.js @@ -2020,4 +2020,23 @@ function createGroundPlant(itemId) { groundPlantCache.push(itemId); groundItemCache.push(itemId); -} \ No newline at end of file +} + +// =========================================================================== + +function getItemTypeFromParams(params) { + if(isNaN(params)) { + for(let i in getServerData().itemTypes) { + if(toLowerCase(getServerData().itemTypes[i].name).indexOf(toLowerCase(params)) != -1) { + return i; + } + } + } else { + if(typeof getServerData().itemTypes[params] != "undefined") { + return toInteger(params); + } + } + return false; +} + +// =========================================================================== \ No newline at end of file diff --git a/scripts/server/job.js b/scripts/server/job.js index ecb2396c..7668ee65 100644 --- a/scripts/server/job.js +++ b/scripts/server/job.js @@ -2083,4 +2083,44 @@ function setAllJobIndexes() { } } } -} \ No newline at end of file +} + +// =========================================================================== + +function getJobFromParams(params) { + if(isNaN(params)) { + for(let i in getServerData().jobs) { + if(toLowerCase(getServerData().jobs[i].name).indexOf(toLowerCase(params)) != -1) { + return i; + } + } + } else { + if(typeof getServerData().jobs[params] != "undefined") { + return params; + } + } + + return false; +} + +// =========================================================================== + +function getClosestJobLocation(position) { + let closestJobLocation = false; + for(let i in getServerData().jobs) { + for(let j in getServerData().jobs[i].locations) { + if(!closestJobLocation || getServerData().jobs[i].locations[j].position.distance(position) < closestJobLocation.position.distance(position)) { + closestJobLocation = getServerData().jobs[i].locations[j]; + } + } + } + return closestJobLocation; +} + +// =========================================================================== + +function getJobPointsInRange(position, distance) { + return getServerData().jobs[getServerGame()].filter(x => x.position.distance(position) <= distance); +} + +// =========================================================================== \ No newline at end of file diff --git a/scripts/server/locale.js b/scripts/server/locale.js index 59dfce4d..4ae80449 100644 --- a/scripts/server/locale.js +++ b/scripts/server/locale.js @@ -68,4 +68,19 @@ function getLocaleStrings() { return getServerData().localeStrings; } +// =========================================================================== + +function getLocaleNameFromParams(params) { + let locales = getLocales(); + if(isNaN(params)) { + for(let i in locales) { + if(toLowerCase(i).indexOf(toLowerCase(params)) != -1) { + return locales[i]; + } + } + } + + return false; +} + // =========================================================================== \ No newline at end of file diff --git a/scripts/server/messaging.js b/scripts/server/messaging.js index 373e8bc8..790cf72b 100644 --- a/scripts/server/messaging.js +++ b/scripts/server/messaging.js @@ -211,4 +211,32 @@ function messagePlayerTimedRandomTip(client, message) { } } +// =========================================================================== + +function makeChatBoxSectionHeader(name) { + let resultString = `== ${name} `; + let endFiller = fillStringWithCharacter("=", getGlobalConfig().chatSectionHeaderLength-resultString.length); + return `${resultString} ${endFiller}`; +} + +// =========================================================================== + +function clearChatBox(client) { + //game.messages.clear(); + for(let i = 0; i <= 20; i++) { + messageClient(" ", client, COLOUR_WHITE); + } +} + +// =========================================================================== + +function replaceEmojiIntoString(message) { + for(let i in emojiReplaceString) { + while(message.indexOf(emojiReplaceString[i][0]) != -1) { + message = message.replace(emojiReplaceString[i][0], emojiReplaceString[i][1]); + } + } + return message; +} + // =========================================================================== \ No newline at end of file diff --git a/scripts/server/native/connected.js b/scripts/server/native/connected.js index 218dcced..1ce9a32c 100644 --- a/scripts/server/native/connected.js +++ b/scripts/server/native/connected.js @@ -898,4 +898,69 @@ function addNetworkEventHandler(eventName, handlerFunction) { addNetworkHandler(eventName, handlerFunction); } +// =========================================================================== + +function getElementId(element) { + return element.id; +} + +// =========================================================================== + +function getClientFromIndex(index) { + let clients = getClients(); + for(let i in clients) { + if(clients[i].index == index) { + return clients[i]; + } + } +} + +// =========================================================================== + +function getClientsInRange(position, distance) { + return getPlayersInRange(position, distance); +} + +// =========================================================================== + +function getCiviliansInRange(position, distance) { + return getElementsByTypeInRange(ELEMENT_PED, position, distance).filter(x => !x.isType(ELEMENT_PLAYER)); +} + +// =========================================================================== + +function getPlayersInRange(position, distance) { + return getClients().filter(x => getDistance(position, getPlayerPosition(x)) <= distance); +} + +// =========================================================================== + +function getElementsByTypeInRange(elementType, position, distance) { + return getElementsByType(elementType).filter(x => getDistance(position, getElementPosition(x)) <= distance); +} + +// =========================================================================== + +function getClosestCivilian(position) { + return getClosestElementByType(ELEMENT_PED, position).filter(ped => !ped.isType(ELEMENT_PLAYER)); +} + +// =========================================================================== + +function getVehiclesInRange(position, range) { + return getElementsByTypeInRange(ELEMENT_VEHICLE, position, range); +} + +// =========================================================================== + +function getClosestVehicle(position) { + return getClosestElementByType(ELEMENT_VEHICLE, position); +} + +// =========================================================================== + +function getClosestElementByType(elementType, position) { + return getElementsByType(elementType).reduce((i, j) => (getDistance(position, getElementPosition(i)) <= getDistance(position, getElementPosition(j))) ? i : j); +} + // =========================================================================== \ No newline at end of file diff --git a/scripts/server/utilities.js b/scripts/server/utilities.js index 34352b41..dca6eca1 100644 --- a/scripts/server/utilities.js +++ b/scripts/server/utilities.js @@ -23,420 +23,6 @@ let disconnectReasons = [ // =========================================================================== -let weekDays = [ - "Sunday", - "Monday", - "Tuesday", - "Wednesday", - "Thursday", - "Friday", - "Saturday" -]; - -// =========================================================================== - -let months = [ - "January", - "February", - "March", - "April", - "May", - "June", - "July", - "August", - "September", - "October", - "November", - "December" -]; - -// =========================================================================== - -let cardinalDirections = [ - "North", - "Northeast", - "East", - "Southeast", - "South", - "Southwest", - "West", - "Northwest", - "Unknown" -]; - -// =========================================================================== - -function getCardinalDirectionName(cardinalDirectionId) { - let cardinalDirections = ["North", "Northeast", "East", "Southeast", "South", "Southwest", "West", "Northwest", "Unknown" ]; - return cardinalDirections[cardinalDirectionId]; -} - -// =========================================================================== - -function getWeekDayName(weekdayId) { - let weekdayNames = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" ]; - return weekdayNames[weekdayId]; -} - -// =========================================================================== - -function getMonthName(monthId) { - let monthNames = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"]; - return monthNames[monthId]; -} - -// =========================================================================== - -function openAllGarages() { - -} - -// =========================================================================== - -function closeAllGarages() { - -} - -// =========================================================================== - -function replaceEmojiIntoString(message) { - for(let i in emojiReplaceString) { - message = message.replace(emojiReplaceString[i][0], emojiReplaceString[i][1]); - } - return message; -} - -// =========================================================================== - -function makeReadableTime(hour, minute) { - let hourStr = toString(hour); - let minuteStr = toString(minute); - let meridianStr = "AM"; - - if(hour < 10) { - hourStr = "0" + toString(hour); - meridianStr = "AM"; - } - - if(hour > 11) { - let actualHour = hour-12; - if(actualHour < 10) { - hourStr = "0" + toString(hour-12); - } else { - hourStr = toString(hour-12); - } - meridianStr = "PM"; - } - - if(minute < 10) { - minuteStr = "0" + toString(minute); - } - - return hourStr + ":" + minuteStr + " " + meridianStr; -} - -// =========================================================================== - -function getClosestVehicle(position) { - //let vehicles = getServerData().vehicles; - //let closest = 0; - //for(let i in vehicles) { - // if(vehicles[i] != null) { - // if(vehicles[closest] == null || getDistance(getVehiclePosition(vehicles[i].vehicle), position) < getDistance(getVehiclePosition(vehicles[closest].vehicle), position)) { - // closest = i; - // } - // } - //} - //return vehicles[closest].vehicle; - return getClosestElementByType(ELEMENT_VEHICLE, position); -} - -// =========================================================================== - -function getClosestElementByType(elementType, position) { - return getElementsByType(elementType).reduce((i, j) => ((i.position.distance(position) <= j.position.distance(position)) ? i : j)); -} - -// =========================================================================== - -function getClosestJobLocation(position) { - let closestJobLocation = false; - for(let i in getServerData().jobs) { - for(let j in getServerData().jobs[i].locations) { - if(!closestJobLocation || getServerData().jobs[i].locations[j].position.distance(position) < closestJobLocation.position.distance(position)) { - closestJobLocation = getServerData().jobs[i].locations[j]; - } - } - } - return closestJobLocation; -} - -// =========================================================================== - -function getJobIndex(jobData) { - return getServerData().jobs.indexOf(jobData); -} - -// =========================================================================== - -function getJobPointsInRange(position, distance) { - return getServerData().jobs[getServerGame()].filter(x => x.position.distance(position) <= distance); -} - -// =========================================================================== - -function getWeaponName(weapon) { - return weaponNames[getServerGame()][weapon]; -} - -// =========================================================================== - -function isParamsInvalid(params) { - if(params == null) { - return true; - } - - if(params == "") { - return true; - } - - if(params.length == 0) { - return true; - } - - return false; -} - -// =========================================================================== - -function doesWordStartWithVowel(word) { - switch(toLowerCase(word.substr(0,1))) { - case "a": - case "e": - case "i": - case "o": - case "u": - return true; - - default: - return false; - } - - return false; -} - -// =========================================================================== - -function replaceEmojiIntoString(message) { - for(let i in emojiReplaceString) { - while(message.indexOf(emojiReplaceString[i][0]) != -1) { - message = message.replace(emojiReplaceString[i][0], emojiReplaceString[i][1]); - } - } - return message; -} - -// =========================================================================== - -function getClientFromName(clientName) { - let clients = getClients(); - for(let i in clients) { - if(toLowerCase(clients[i].name).indexOf(toLowerCase(clientName)) != -1) { - return clients[i]; - } - - let charName = `${getPlayerCurrentSubAccount(clients[i]).firstName} ${getPlayerCurrentSubAccount(clients[i]).lastName}`; - if(toLowerCase(charName).indexOf(toLowerCase(clientName)) != -1) { - return clients[i]; - } - } - - return false; -} - -// =========================================================================== - -function getClientFromPlayer(player) { - let clients = getClients(); - for(let i in clients) { - if(clients[i].player == player) { - return clients[i]; - } - } - - return false; -} - -// =========================================================================== - -function killDeathRatio(kills, deaths) { - if(deaths == 0 || kills == 0) { - return 0.0; - } - return Float((iKills*100/iDeaths) * 0.01); -} - -// =========================================================================== - -function getCardinalDirection(pos1, pos2) { - let a = pos1.x - pos2.x; - let b = pos1.y - pos2.y; - let c = pos1.z - pos2.z; - - let x = Math.abs(a); - let y = Math.abs(b); - let z = Math.abs(c); - - let no = 0; - let ne = 1; - let ea = 2; - let se = 3; - let so = 4; - let sw = 5; - let we = 6; - let nw = 7; - let na = 8; - - if(b < 0 && a < 0){ - if(x < (y/2)){ - return no; - } else if(y < (x/2)){ - return ea; - } else { - return ne; - } - } else if(b < 0 && a >= 0){ - if(x < (y/2)){ - return no; - } else if(y < (x/2)){ - return we; - } else { - return nw; - } - } else if(b >= 0 && a >= 0){ - if(x < (y/2)){ - return so; - } else if(y < (x/2)){ - return we; - } else { - return sw; - } - } else if(b >= 0 && a < 0){ - if(x < (y/2)){ - return so; - } else if(y < (x/2)){ - return ea; - } else { - return se; - } - } else { - return na; - } - return na; -} - -// =========================================================================== - -function getTimeDifferenceDisplay(timeStamp2, timeStamp1) { - timeStamp1 = timeStamp1 * 1000; - timeStamp2 = timeStamp2 * 1000; - if(isNaN(timeStamp1) || isNaN(timeStamp2)) { - return "Unknown"; - } - - let millisecondDiff = timeStamp2 - timeStamp1; - - let days = Math.floor(millisecondDiff / 1000 / 60 / (60 * 24)); - let diffDate = new Date(millisecondDiff); - - return `${days} days, ${diffDate.getHours()} hours, ${diffDate.getMinutes()} minutes`; -} - -// =========================================================================== - -function getVehiclesInRange(position, range) { - let vehicles = getElementsByType(ELEMENT_VEHICLE); - let inRangeVehicles = []; - for(let i in vehicles) { - if(getDistance(position, vehicles[i].position) <= range) { - inRangeVehicles.push(vehicles[i]); - } - } - return inRangeVehicles; -} - -// =========================================================================== - -function getFileData(filePath) { - let file = openFile(filePath, false); - if(!file) { - return false; - } - let fileData = file.readBytes(file.length); - file.close(); - return fileData; -} - -// =========================================================================== - -function setFileData(filePath, fileData) { - let file = openFile(filePath, true); - if(!file) { - return false; - } - file.writeBytes(fileData, fileData.length); - file.close(); - return true; -} - -// =========================================================================== - -function is2dPositionOnScreen(pos2d) { - return pos2d.x >= 0 && pos2d.y >= 0 && pos2d.x <= game.width && pos2d.y <= game.height; -} - -// =========================================================================== - -function breakText(text, maxLength) { - let lines = []; - let j = Math.floor(text.length / maxLength); - - for(let i = 0; i < j; i++) { - lines.push(text.substr(i*maxLength,maxLength)); - } - - let line = text.substr(j*maxLength, text.length % maxLength); - if(line.length > 0) { - lines.push(line); - } - - return lines; -} - -// =========================================================================== - -function getSpeedFromVelocity(vel) { - return Math.sqrt(vel.x*vel.x + vel.y*vel.y + vel.z*vel.z); -} - -// =========================================================================== - -function isValidSkin(skin, game = VRR_GAME_GTA_III) { - if(game == VRR_GAME_GTA_III) { - return true; - } else if(game == VRR_GAME_GTA_VC) { - switch(skin) { - case 111: - return false; - - default: - return true; - } - } -} - -// =========================================================================== - function getPositionArea(position) { if(typeof position == "Vec3") { position = vec3ToVec2(position); @@ -480,130 +66,6 @@ function getPlayerData(client) { // =========================================================================== -function createAllPoliceStationBlips() { - if(getGameConfig().blipSprites[getServerGame()].policeStation != -1) { - for(let i in getServerData().policeStations[getServerGame()]) { - getServerData().policeStations[getServerGame()][i].blip = createBlip(getGameConfig().blipSprites[getServerGame()].policeStation, getServerData().policeStations[getServerGame()][i].position); - } - } -} - -// =========================================================================== - -function createAllFireStationBlips() { - if(getGameConfig().blipSprites[getServerGame()].fireStation != -1) { - for(let i in getServerData().fireStations[getServerGame()]) { - getServerData().fireStations[getServerGame()][i].blip = createBlip(getGameConfig().blipSprites[getServerGame()].fireStation, getServerData().fireStations[getServerGame()][i].position); - } - } -} - -// =========================================================================== - -function createAllHospitalBlips() { - if(getGameConfig().blipSprites[getServerGame()].hospital != -1) { - for(let i in getServerData().hospitals[getServerGame()]) { - getServerData().hospitals[getServerGame()][i].blip = createBlip(getGameConfig().blipSprites[getServerGame()].hospital, getServerData().hospitals[getServerGame()][i].position); - } - } -} - -// =========================================================================== - -function createAllAmmunationBlips() { - if(getGameConfig().blipSprites[getServerGame()].ammunation != -1) { - for(let i in getServerData().ammunations[getServerGame()]) { - getServerData().ammunations[getServerGame()][i].blip = createBlip(getGameConfig().blipSprites[getServerGame()].ammunation, getServerData().ammunations[getServerGame()][i].position); - } - } -} - -// =========================================================================== - -function createAllPayAndSprayBlips() { - if(getGameConfig().blipSprites[getServerGame()].payAndSpray != -1) { - for(let i in getServerData().payAndSprays[getServerGame()]) { - getServerData().payAndSprays[getServerGame()][i].blip = createBlip(getGameConfig().blipSprites[getServerGame()].payAndSpray, getServerData().payAndSprays[getServerGame()][i].position); - } - } -} - -// =========================================================================== - -function createAllFuelStationBlips() { - if(getGameConfig().blipSprites[getServerGame()].fuelStation != -1) { - for(let i in getServerData().fuelStations[getServerGame()]) { - getServerData().fuelStations[getServerGame()][i].blip = createBlip(getGameConfig().blipSprites[getServerGame()].fuelStation, getServerData().fuelStations[getServerGame()][i].position, 2, getColourByName("burntOrange")); - } - } -} - -// =========================================================================== - -function getPickupOwnerType(pickup) { - return pickup.getData("vrr.ownerType"); -} - -// =========================================================================== - -function getPickupOwnerId(pickup) { - return pickup.getData("vrr.ownerId"); -} - -// =========================================================================== - -function canPlayerUsePoliceJob(client) { - if(getPlayerData(client).accountData.flags.moderation & getServerBitFlags().moderationFlags.policeBanned) { - return false; - } - - return true; -} - -// =========================================================================== - -function canClientUseFireJob(client) { - if(getPlayerData(client).accountData.flags.moderation & getServerBitFlags().moderationFlags.fireBanned) { - return false; - } - - return true; -} - -// =========================================================================== - -function canClientUseAmmunations(client) { - if(getPlayerData(client).accountData.flags.moderation & getServerBitFlags().moderationFlags.AmmuBanned) { - return false; - } - - return true; -} - -// =========================================================================== - -function canClientUseGuns(client) { - if(getPlayerData(client).accountData.flags.moderation & getServerBitFlags().moderationFlags.GunBanned) { - return false; - } - - return true; -} - -// =========================================================================== - -function sendAllBlips(client) { - sendAllPoliceStationBlips(client); - sendAllFireStationBlips(client); - sendAllHospitalBlips(client); - sendAllPayAndSprayBlips(client); - sendAllAmmunationBlips(client); - sendAllFuelStationBlips(client); - sendAllJobBlips(client); -} - -// =========================================================================== - function initAllClients() { getClients().forEach(function(client) { initClient(client); @@ -612,36 +74,6 @@ function initAllClients() { // =========================================================================== -function getYesNoFromBool(boolVal) { - return (boolVal) ? "Yes" : "No"; -} - -// =========================================================================== - -function getOnOffFromBool(boolVal) { - return (boolVal) ? "On" : "Off"; -} - -// =========================================================================== - -function getEnabledDisabledFromBool(boolVal) { - return (boolVal) ? "Enabled" : "Disabled"; -} - -// =========================================================================== - -function getLockedUnlockedFromBool(boolVal) { - return (boolVal) ? "Locked" : "Unlocked"; -} - -// =========================================================================== - -function getOpenedClosedFromBool(boolVal) { - return (boolVal) ? "Opened" : "Closed"; -} - -// =========================================================================== - function updateServerRules() { if(isTimeSupported()) { server.setRule("Time", makeReadableTime(getServerConfig().hour, getServerConfig().minute)); @@ -658,53 +90,6 @@ function updateServerRules() { // =========================================================================== -function getAccentFromParams(params) { - if(isNaN(params)) { - for(let i in getGlobalConfig().accents) { - if(toLowerCase(getGlobalConfig().accents[i]).indexOf(toLowerCase(params)) != -1) { - return i; - } - } - } else { - if(typeof getGlobalConfig().accents[params] != "undefined") { - return toInteger(params); - } - } - - return false; -} - -// =========================================================================== - -function getCommandFromParams(params) { - for(let i in serverCommands) { - for(let j in serverCommands[i]) { - if(toLowerCase(serverCommands[i][j].command).indexOf(toLowerCase(params)) != -1) { - return serverCommands[i][j]; - } - } - } - - return false; -} - -// =========================================================================== - -function getLocaleNameFromParams(params) { - let locales = getLocales(); - if(isNaN(params)) { - for(let i in locales) { - if(toLowerCase(i).indexOf(toLowerCase(params)) != -1) { - return locales[i]; - } - } - } - - return false; -} - -// =========================================================================== - function getWeatherFromParams(params) { if(isNaN(params)) { for(let i in getGameData().weatherNames[getServerGame()]) { @@ -741,158 +126,6 @@ function getFightStyleFromParams(params) { // =========================================================================== -function getAnimationFromParams(params) { - if(isNaN(params)) { - for(let i in getGameData().animations[getServerGame()]) { - if(toLowerCase(getGameData().animations[getServerGame()][i][0]).indexOf(toLowerCase(params)) != -1) { - return i; - } - } - } else { - if(typeof getGameData().animations[getServerGame()][params] != "undefined") { - return toInteger(params); - } - } - - return false; -} - -// =========================================================================== - -function getClanFromParams(params) { - if(isNaN(params)) { - for(let i in getServerData().clans) { - if(toLowerCase(getServerData().clans[i].name).indexOf(toLowerCase(params)) != -1) { - return i; - } - } - } else { - if(typeof getServerData().clans[params] != "undefined") { - return toInteger(params); - } - } - - return false; -} - -// =========================================================================== - -function getClanRankFromParams(clanId, params) { - if(isNaN(params)) { - for(let i in getClanData(clanId).ranks) { - if((toLowerCase(getClanData(clanId).ranks[i].name).indexOf(toLowerCase(params)) != -1)) { - return i; - } - } - } else { - for(let i in getClanData(clanId).ranks) { - if(getClanData(clanId).ranks[i].level == toInteger(params)) { - return i; - } - } - } - - return false; -} - -// =========================================================================== - -function getJobFromParams(params) { - if(isNaN(params)) { - for(let i in getServerData().jobs) { - if(toLowerCase(getServerData().jobs[i].name).indexOf(toLowerCase(params)) != -1) { - return i; - } - } - } else { - if(typeof getServerData().jobs[params] != "undefined") { - return params; - } - } - - return false; -} - -// =========================================================================== - -function getBusinessFromParams(params) { - if(isNaN(params)) { - for(let i in getServerData().businesses) { - if(toLowerCase(getServerData().businesses[i].name).indexOf(toLowerCase(params)) != -1) { - return i; - } - } - } else { - if(typeof getServerData().businesses[params] != "undefined") { - return toInteger(params); - } - } - return false; -} - -// =========================================================================== - -function getGameLocationFromParams(params) { - if(isNaN(params)) { - for(let i in getGameData().locations[getServerGame()]) { - if(toLowerCase(getGameData().locations[getServerGame()][i][0]).indexOf(toLowerCase(params)) != -1) { - return i; - } - } - } else { - if(typeof getGameData().locations[getServerGame()][params] != "undefined") { - return toInteger(params); - } - } - return false; -} - -// =========================================================================== - -function getHouseFromParams(params) { - if(isNaN(params)) { - for(let i in getServerData().houses) { - if(toLowerCase(getServerData().houses[i].description).indexOf(toLowerCase(params)) != -1) { - return i; - } - } - } else { - if(typeof getServerData().houses[params] != "undefined") { - return toInteger(params); - } - } - return false; -} - -// =========================================================================== - -function getItemTypeFromParams(params) { - if(isNaN(params)) { - for(let i in getServerData().itemTypes) { - if(toLowerCase(getServerData().itemTypes[i].name).indexOf(toLowerCase(params)) != -1) { - return i; - } - } - } else { - if(typeof getServerData().itemTypes[params] != "undefined") { - return toInteger(params); - } - } - return false; -} - - -// =========================================================================== - -function clearChatBox(client) { - //game.messages.clear(); - for(let i = 0; i <= 20; i++) { - messageClient(" ", client, COLOUR_WHITE); - } -} - -// =========================================================================== - function getClosestHospital(position) { let closest = 0; for(let i in getGameData().hospitals[getServerGame()]) { @@ -946,18 +179,6 @@ function isPlayerSpawned(client) { // =========================================================================== -function getLockedUnlockedTextFromBool(boolVal) { - return (boolVal) ? "locked" : "unlocked"; -} - -// =========================================================================== - -function getLockedUnlockedEmojiFromBool(boolVal) { - return (boolVal) ? "🔒" : "🔓"; -} - -// =========================================================================== - function getPlayerIsland(client) { return getIsland(getPlayerPosition(client)); } @@ -976,21 +197,6 @@ function isAtPayAndSpray(position) { // =========================================================================== -async function waitUntil(condition) { - return new Promise((resolve) => { - let interval = setInterval(() => { - if (!condition()) { - return - } - - clearInterval(interval); - resolve(); - }, 1); - }); -} - -// =========================================================================== - function resetClientStuff(client) { logToConsole(LOG_DEBUG, `[VRR.Utilities] Resetting client data for ${getPlayerDisplayForConsole(client)}`); @@ -1028,57 +234,6 @@ function getPlayerFromCharacterId(subAccountId) { // =========================================================================== -function doesWordStartWithVowel(word) { - switch(word.substr(0,1).toLowerCase()) { - case "a": - case "e": - case "i": - case "o": - case "u": - return true; - - default: - return false; - } - - return false; -} - -// =========================================================================== - -function getProperDeterminerForName(word) { - switch(word.substr(0,1).toLowerCase()) { - case "a": - case "e": - case "i": - case "o": - return "an"; - - default: - return "a"; - } -} - -// =========================================================================== - -function getPluralForm(name) { - return name; -} - -// =========================================================================== - -function removeHexColoursFromString(str) { - let matchRegex = /#([a-f0-9]{3}|[a-f0-9]{4}(?:[a-f0-9]{2}){0,2})\b/gi; - let matchedHexes = str.match(matchRegex); - for(let i in matchHex) { - str.replace(matchedHexes, `{${i}}`); - } - - return [str, matchedHexes]; -} - -// =========================================================================== - function checkPlayerPedStates() { let clients = getClients(); for(let i in clients) { @@ -1116,54 +271,6 @@ function showCharacterSelectCameraToPlayer(client) { // =========================================================================== -function generateRandomString(length) { - var result = ''; - var characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; - var charactersLength = characters.length; - for ( var i = 0; i < length; i++ ) { - result += characters.charAt(Math.floor(Math.random() * charactersLength)); - } - return result; -} - -// =========================================================================== - -function getVehiclesInRange(position, distance) { - return getElementsByType(ELEMENT_VEHICLE).filter(x => x.player && x.position.distance(position) <= distance); -} - -// =========================================================================== - -function getClientsInRange(position, distance) { - return getPlayersInRange(position, distance); -} - -// =========================================================================== - -function getCiviliansInRange(position, distance) { - return getElementsByType(ELEMENT_PED).filter(x => !x.isType(ELEMENT_PLAYER) && getElementPosition(x).position.distance(position) <= distance); -} - -// =========================================================================== - -function getPlayersInRange(position, distance) { - return getClients().filter(x => getPlayerPosition(x).distance(position) <= distance); -} - -// =========================================================================== - -function getElementsByTypeInRange(elementType, position, distance) { - return getElementsByType(elementType).filter(x => getElementPosition(x).position.distance(position) <= distance); -} - -// =========================================================================== - -function getClosestCivilian(position) { - return getElementsByType(ELEMENT_PED).reduce((i, j) => ((i.position.distance(position) <= j.position.distance(position)) ? i : j)); -} - -// =========================================================================== - function getClosestPlayer(position, exemptClient) { //let clients = getClients(); //let closest = 0; @@ -1188,49 +295,12 @@ function isPlayerMuted(client) { // =========================================================================== -function getCurrentUnixTimestamp() { - return new Date().getTime()/1000; -} - -// =========================================================================== - -function msToTime(duration) { - let milliseconds = Math.floor(toInteger((duration % 1000) / 100)); - let seconds = Math.floor(toInteger((duration / 1000) % 60)); - let minutes = Math.floor(toInteger((duration / (1000 * 60)) % 60)); - let hours = Math.floor(toInteger((duration / (1000 * 60 * 60)) % 24)); - let days = Math.floor(toInteger((duration / (1000 * 60 * 60 * 24)) % 365)); - - //hours = (hours < 10) ? "0" + hours : hours; - //minutes = (minutes < 10) ? "0" + minutes : minutes; - //seconds = (seconds < 10) ? "0" + seconds : seconds; - - if (days !== 0) { - return `${days} days, ${hours} hours, ${minutes} minutes`; - } else { - return `${hours} hours, ${minutes} minutes`; - } -} - -// =========================================================================== - function isSamePlayer(client1, client2) { return (client1 == client2); } // =========================================================================== -function getClientFromIndex(index) { - let clients = getClients(); - for(let i in clients) { - if(clients[i].index == index) { - return clients[i]; - } - } -} - -// =========================================================================== - function getConsoleClient() { let clients = getClients(); for(let i in clients) { @@ -1265,16 +335,6 @@ function getPlayerFromParams(params) { return false; } -// =========================================================================== - -function getArrayOfElementId(elements) { - let tempArray = []; - for(let i in elements) { - tempArray.push(elements[i].id); - } - - return tempArray; -} // =========================================================================== @@ -1285,93 +345,6 @@ function getSyncerFromId(syncerId) { // =========================================================================== -function arrayBufferToString(arrayBuffer) { - return String.fromCharCode.apply(null, new Uint8Array(arrayBuffer)); -} - -// =========================================================================== - -function vec3ToVec2(pos) { - return toVector2(pos[0], pos[1]); -} - -// =========================================================================== - -function vec2ToVec3(pos, z) { - return toVector3(pos[0], pos[1], z); -} - -// =========================================================================== - -function degToRad(deg) { - return deg * Math.PI / 180; -} - -// =========================================================================== - -function radToDeg(rad) { - return rad * 180 / Math.PI; -} - -// =========================================================================== - -function getHeadingFromPosToPos(pos1, pos2) { - let x = pos2.x-pos1.x; - let y = pos2.y-pos1.y; - let rad = Math.atan2(y, x); - let deg = radToDeg(rad); - deg -= 90; - deg = deg % 360; - return degToRad(deg); -} - -// =========================================================================== - -function getAngleInCircleFromCenter(center, total, current) { - let gap = 360 / total; - let deg = Math.floor(gap*current); - - if(deg <= 0) { - deg = 1; - } else { - if(deg >= 360) { - deg = 359; - } - } - - return degToRad(deg); -} - -// =========================================================================== - -function areParamsEmpty(params) { - if(!params || params == "" || params.length == 0 || typeof params == "undefined") { - return true; - } - - return false; -} - -// =========================================================================== - -function getParamsCount(params, delimiter = " ") { - return params.split(delimiter).length; -} - -// =========================================================================== - -function areThereEnoughParams(params, requiredAmount, delimiter = " ") { - return (params.split(delimiter).length >= requiredAmount); -} - -// =========================================================================== - -function getParams(params, delimiter, index) { - return params.split(delimiter)[index]; -} - -// =========================================================================== - function isConsole(client) { if(client == null) { return false; @@ -1434,12 +407,6 @@ function fixCharacterName(name) { // =========================================================================== -function addPositiveNegativeSymbol(value) { - return (value >= 0) ? `+${value}` : `${value}`; -} - -// =========================================================================== - function getCurrentTimeStampWithTimeZone(timeZone) { let date = new Date(); @@ -1454,30 +421,12 @@ function getCurrentTimeStampWithTimeZone(timeZone) { // =========================================================================== -function getElementId(element) { - return element.id; -} - -// =========================================================================== - function getClientFromSyncerId(syncerId) { return getClients().filter(c => c.index == syncerId)[0]; } // =========================================================================== -function fixAngle(angle) { - angle = radToDeg(angle); - if(angle < 0) - { - angle = Math.abs(angle); - angle = ((180-angle+1)+180); - } - return degToRad(angle); -} - -// =========================================================================== - async function triggerWebHook(webHookURL, payloadData) { return new Promise(resolve => { //console.warn(webHookURL); @@ -1493,11 +442,7 @@ async function triggerWebHook(webHookURL, payloadData) { }); } -// =========================================================================== -function getVehicleTrunkPosition(vehicle) { - return getPosBehindPos(getVehiclePosition(vehicle), getVehicleHeading(vehicle), getGlobalConfig().vehicleTrunkRearDistance); -} // =========================================================================== @@ -1531,12 +476,4 @@ function clearTemporaryPeds() { } } -// =========================================================================== - -function makeChatSectionHeader(name) { - let resultString = `== ${name} `; - let endFiller = fillStringWithCharacter("=", getGlobalConfig().chatSectionHeaderLength-resultString.length); - return `${resultString} ${endFiller}`; -} - // =========================================================================== \ No newline at end of file diff --git a/scripts/server/vehicle.js b/scripts/server/vehicle.js index 1560c1f9..d74e0d3e 100644 --- a/scripts/server/vehicle.js +++ b/scripts/server/vehicle.js @@ -1496,4 +1496,10 @@ function getClosestTaxi(position) { .reduce((i, j) => ((i.position.distance(position) <= j.position.distance(position)) ? i : j)); } +// =========================================================================== + +function getVehicleTrunkPosition(vehicle) { + return getPosBehindPos(getVehiclePosition(vehicle), getVehicleHeading(vehicle), getGlobalConfig().vehicleTrunkRearDistance); +} + // =========================================================================== \ No newline at end of file diff --git a/scripts/shared/utilities.js b/scripts/shared/utilities.js index 00eb2350..6773c17d 100644 --- a/scripts/shared/utilities.js +++ b/scripts/shared/utilities.js @@ -127,6 +127,49 @@ let bindableKeys = { // =========================================================================== +let weekDays = [ + "Sunday", + "Monday", + "Tuesday", + "Wednesday", + "Thursday", + "Friday", + "Saturday" +]; + +// =========================================================================== + +let months = [ + "January", + "February", + "March", + "April", + "May", + "June", + "July", + "August", + "September", + "October", + "November", + "December" +]; + +// =========================================================================== + +let cardinalDirections = [ + "North", + "Northeast", + "East", + "Southeast", + "South", + "Southwest", + "West", + "Northwest", + "Unknown" +]; + +// =========================================================================== + function makeLargeNumberReadable(num) { return new Number(num).toLocaleString("en-US"); } @@ -877,4 +920,425 @@ function boolToInt(boolVal) { return (boolVal) ? 1 : 0; } +// =========================================================================== + +function fixAngle(angle) { + angle = radToDeg(angle); + if(angle < 0) + { + angle = Math.abs(angle); + angle = ((180-angle+1)+180); + } + return degToRad(angle); +} + +// =========================================================================== + +function addPositiveNegativeSymbol(value) { + return (value >= 0) ? `+${value}` : `${value}`; +} + +// =========================================================================== + +function arrayBufferToString(arrayBuffer) { + return String.fromCharCode.apply(null, new Uint8Array(arrayBuffer)); +} + +// =========================================================================== + +function vec3ToVec2(pos) { + return toVector2(pos[0], pos[1]); +} + +// =========================================================================== + +function vec2ToVec3(pos, z) { + return toVector3(pos[0], pos[1], z); +} + +// =========================================================================== + +function degToRad(deg) { + return deg * Math.PI / 180; +} + +// =========================================================================== + +function radToDeg(rad) { + return rad * 180 / Math.PI; +} + +// =========================================================================== + +function getHeadingFromPosToPos(pos1, pos2) { + let x = pos2.x-pos1.x; + let y = pos2.y-pos1.y; + let rad = Math.atan2(y, x); + let deg = radToDeg(rad); + deg -= 90; + deg = deg % 360; + return degToRad(deg); +} + +// =========================================================================== + +function getAngleInCircleFromCenter(center, total, current) { + let gap = 360 / total; + let deg = Math.floor(gap*current); + + if(deg <= 0) { + deg = 1; + } else { + if(deg >= 360) { + deg = 359; + } + } + + return degToRad(deg); +} + +// =========================================================================== + +function getArrayOfElementId(elements) { + let tempArray = []; + for(let i in elements) { + tempArray.push(elements[i].id); + } + + return tempArray; +} + +// =========================================================================== + +function getCurrentUnixTimestamp() { + return new Date().getTime()/1000; +} + +// =========================================================================== + +function msToTime(duration) { + let milliseconds = Math.floor(toInteger((duration % 1000) / 100)); + let seconds = Math.floor(toInteger((duration / 1000) % 60)); + let minutes = Math.floor(toInteger((duration / (1000 * 60)) % 60)); + let hours = Math.floor(toInteger((duration / (1000 * 60 * 60)) % 24)); + let days = Math.floor(toInteger((duration / (1000 * 60 * 60 * 24)) % 365)); + + //hours = (hours < 10) ? "0" + hours : hours; + //minutes = (minutes < 10) ? "0" + minutes : minutes; + //seconds = (seconds < 10) ? "0" + seconds : seconds; + + if (days !== 0) { + return `${days} days, ${hours} hours, ${minutes} minutes`; + } else { + return `${hours} hours, ${minutes} minutes`; + } +} + +// =========================================================================== + +function generateRandomString(length, characters = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789") { + var result = ''; + var charactersLength = characters.length; + for ( var i = 0; i < length; i++ ) { + result += characters.charAt(Math.floor(Math.random() * charactersLength)); + } + return result; +} + +// =========================================================================== + +function doesWordStartWithVowel(word) { + switch(word.substr(0,1).toLowerCase()) { + case "a": + case "e": + case "i": + case "o": + case "u": + return true; + + default: + return false; + } + + return false; +} + +// =========================================================================== + +function getProperDeterminerForName(word) { + switch(word.substr(0,1).toLowerCase()) { + case "a": + case "e": + case "i": + case "o": + return "an"; + + default: + return "a"; + } +} + +// =========================================================================== + +function getPluralForm(name) { + return name; +} + +// =========================================================================== + +function removeHexColoursFromString(str) { + let matchRegex = /#([a-f0-9]{3}|[a-f0-9]{4}(?:[a-f0-9]{2}){0,2})\b/gi; + let matchedHexes = str.match(matchRegex); + for(let i in matchHex) { + str.replace(matchedHexes, `{${i}}`); + } + + return [str, matchedHexes]; +} + +// =========================================================================== + +async function waitUntil(condition) { + return new Promise((resolve) => { + let interval = setInterval(() => { + if (!condition()) { + return + } + + clearInterval(interval); + resolve(); + }, 1); + }); +} + +// =========================================================================== + +function getGameLocationFromParams(params) { + if(isNaN(params)) { + for(let i in getGameData().locations[getServerGame()]) { + if(toLowerCase(getGameData().locations[getServerGame()][i][0]).indexOf(toLowerCase(params)) != -1) { + return i; + } + } + } else { + if(typeof getGameData().locations[getServerGame()][params] != "undefined") { + return toInteger(params); + } + } + return false; +} + +// =========================================================================== + +function getYesNoFromBool(boolVal) { + return (boolVal) ? "Yes" : "No"; +} + +// =========================================================================== + +function getOnOffFromBool(boolVal) { + return (boolVal) ? "On" : "Off"; +} + +// =========================================================================== + +function getEnabledDisabledFromBool(boolVal) { + return (boolVal) ? "Enabled" : "Disabled"; +} + +// =========================================================================== + +function getLockedUnlockedFromBool(boolVal) { + return (boolVal) ? "Locked" : "Unlocked"; +} + +// =========================================================================== + +function getOpenedClosedFromBool(boolVal) { + return (boolVal) ? "Opened" : "Closed"; +} + +// =========================================================================== + +function breakText(text, maxLength) { + let lines = []; + let j = Math.floor(text.length / maxLength); + + for(let i = 0; i < j; i++) { + lines.push(text.substr(i*maxLength,maxLength)); + } + + let line = text.substr(j*maxLength, text.length % maxLength); + if(line.length > 0) { + lines.push(line); + } + + return lines; +} + +// =========================================================================== + +function getSpeedFromVelocity(vel) { + return Math.sqrt(vel.x*vel.x + vel.y*vel.y + vel.z*vel.z); +} + +// =========================================================================== + +function getCardinalDirection(pos1, pos2) { + let a = pos1.x - pos2.x; + let b = pos1.y - pos2.y; + let c = pos1.z - pos2.z; + + let x = Math.abs(a); + let y = Math.abs(b); + let z = Math.abs(c); + + let no = 0; + let ne = 1; + let ea = 2; + let se = 3; + let so = 4; + let sw = 5; + let we = 6; + let nw = 7; + let na = 8; + + if(b < 0 && a < 0){ + if(x < (y/2)){ + return no; + } else if(y < (x/2)){ + return ea; + } else { + return ne; + } + } else if(b < 0 && a >= 0){ + if(x < (y/2)){ + return no; + } else if(y < (x/2)){ + return we; + } else { + return nw; + } + } else if(b >= 0 && a >= 0){ + if(x < (y/2)){ + return so; + } else if(y < (x/2)){ + return we; + } else { + return sw; + } + } else if(b >= 0 && a < 0){ + if(x < (y/2)){ + return so; + } else if(y < (x/2)){ + return ea; + } else { + return se; + } + } else { + return na; + } + return na; +} + +// =========================================================================== + +function getTimeDifferenceDisplay(timeStamp2, timeStamp1) { + timeStamp1 = timeStamp1 * 1000; + timeStamp2 = timeStamp2 * 1000; + if(isNaN(timeStamp1) || isNaN(timeStamp2)) { + return "Unknown"; + } + + let millisecondDiff = timeStamp2 - timeStamp1; + + let days = Math.floor(millisecondDiff / 1000 / 60 / (60 * 24)); + let diffDate = new Date(millisecondDiff); + + return `${days} days, ${diffDate.getHours()} hours, ${diffDate.getMinutes()} minutes`; +} + +// =========================================================================== + +function doesWordStartWithVowel(word) { + switch(toLowerCase(word.substr(0,1))) { + case "a": + case "e": + case "i": + case "o": + case "u": + return true; + + default: + return false; + } + + return false; +} + +// =========================================================================== + +function replaceEmojiIntoString(message) { + for(let i in emojiReplaceString) { + message = message.replace(emojiReplaceString[i][0], emojiReplaceString[i][1]); + } + return message; +} + +// =========================================================================== + +function makeReadableTime(hour, minute) { + let hourStr = toString(hour); + let minuteStr = toString(minute); + let meridianStr = "AM"; + + if(hour < 10) { + hourStr = "0" + toString(hour); + meridianStr = "AM"; + } + + if(hour > 11) { + let actualHour = hour-12; + if(actualHour < 10) { + hourStr = "0" + toString(hour-12); + } else { + hourStr = toString(hour-12); + } + meridianStr = "PM"; + } + + if(minute < 10) { + minuteStr = "0" + toString(minute); + } + + return hourStr + ":" + minuteStr + " " + meridianStr; +} + +// =========================================================================== + +function getCardinalDirectionName(cardinalDirectionId) { + let cardinalDirections = ["North", "Northeast", "East", "Southeast", "South", "Southwest", "West", "Northwest", "Unknown" ]; + return cardinalDirections[cardinalDirectionId]; +} + +// =========================================================================== + +function getWeekDayName(weekdayId) { + let weekdayNames = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" ]; + return weekdayNames[weekdayId]; +} + +// =========================================================================== + +function getMonthName(monthId) { + let monthNames = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"]; + return monthNames[monthId]; +} + +// =========================================================================== + +function getLockedUnlockedEmojiFromBool(boolVal) { + return (boolVal) ? "🔒" : "🔓"; +} + // =========================================================================== \ No newline at end of file From 8f0147ff49bc2c50f9f363cbb9b4154f9e997ded Mon Sep 17 00:00:00 2001 From: Vortrex <3858226+VortrexFTW@users.noreply.github.com> Date: Sun, 9 Jan 2022 17:20:17 -0600 Subject: [PATCH 103/337] Rename chatbox section header util --- scripts/server/help.js | 36 ++++++++++++++++++------------------ scripts/server/radio.js | 2 +- 2 files changed, 19 insertions(+), 19 deletions(-) diff --git a/scripts/server/help.js b/scripts/server/help.js index 7562501f..91e929a1 100644 --- a/scripts/server/help.js +++ b/scripts/server/help.js @@ -190,7 +190,7 @@ function helpCommand(command, params, client) { // =========================================================================== function showMainHelpMessage(client) { - messagePlayerInfo(client, makeChatSectionHeader(getLocaleString(client, "HeaderHelp"))); + messagePlayerInfo(client, makeChatBoxSectionHeader(getLocaleString(client, "HeaderHelp"))); messagePlayerNormal(client, `{clanOrange}• {MAINCOLOUR}Use /help for commands and info. Example: {ALTCOLOUR}/help vehicle`); messagePlayerNormal(client, `{clanOrange}• {MAINCOLOUR}Help Categories: [#A9A9A9]account, command, vehicle, job, chat, rules, website, anim`); messagePlayerNormal(client, `{clanOrange}• [#A9A9A9]ammunation, skins, mechanic, dealership, discord, colours, keys`); @@ -199,7 +199,7 @@ function showMainHelpMessage(client) { // =========================================================================== function showAccountHelpMessage(client) { - messagePlayerInfo(client, makeChatSectionHeader(getLocaleString(client, "HeaderAccountHelp"))); + messagePlayerInfo(client, makeChatBoxSectionHeader(getLocaleString(client, "HeaderAccountHelp"))); messagePlayerNormal(client, `{clanOrange}• {MAINCOLOUR}Do not share your password with anybody else.`); messagePlayerNormal(client, `{clanOrange}• {MAINCOLOUR}Use {ALTCOLOUR}/changepass{MAINCOLOUR} to change your password.`); messagePlayerNormal(client, `{clanOrange}• {MAINCOLOUR}Some settings you can use: {ALTCOLOUR}/gui, /logo, /iplogin, /autolastchar, /2fa, /loginalert`); @@ -208,7 +208,7 @@ function showAccountHelpMessage(client) { // =========================================================================== function showVehicleHelpMessage(client) { - messagePlayerInfo(client, makeChatSectionHeader(getLocaleString(client, "HeaderVehicleHelp"))); + messagePlayerInfo(client, makeChatBoxSectionHeader(getLocaleString(client, "HeaderVehicleHelp"))); messagePlayerNormal(client, `{clanOrange}• {MAINCOLOUR}Visit dealerships to buy new vehicles (Use {ALTCOLOUR}/help dealership {MAINCOLOUR}for more info.)`); messagePlayerNormal(client, `{clanOrange}• {MAINCOLOUR}Some commands: {ALTCOLOUR}/lock, /engine, /lights, /trunk, /rentveh, /buyveh, /rentprice, /buyprice`); messagePlayerNormal(client, `{clanOrange}• {MAINCOLOUR}Your personal vehicles will save wherever you or somebody else leaves them!`); @@ -219,7 +219,7 @@ function showVehicleHelpMessage(client) { // =========================================================================== function showVehicleDealershipHelpMessage(client) { - messagePlayerInfo(client, makeChatSectionHeader(getLocaleString(client, "HeaderVehicleDealershipHelp"))); + messagePlayerInfo(client, makeChatBoxSectionHeader(getLocaleString(client, "HeaderVehicleDealershipHelp"))); messagePlayerNormal(client, `{clanOrange}• {MAINCOLOUR}Visit a vehicle dealer to buy new vehicles. Use {ALTCOLOUR}/gps {MAINCOLOUR}to find one.`); messagePlayerNormal(client, `{clanOrange}• {MAINCOLOUR}At the dealer, simply enter a car you want to buy, and the price will be shown to you`); messagePlayerNormal(client, `{clanOrange}• {MAINCOLOUR}If you want to buy the vehicle and have enough money, use {ALTCOLOUR}/buyveh {MAINCOLOUR}and you will be given keys`); @@ -229,7 +229,7 @@ function showVehicleDealershipHelpMessage(client) { // =========================================================================== function showJobHelpMessage(client) { - messagePlayerInfo(client, makeChatSectionHeader(getLocaleString(client, "HeaderJobHelp"))); + messagePlayerInfo(client, makeChatBoxSectionHeader(getLocaleString(client, "HeaderJobHelp"))); messagePlayerNormal(client, `{clanOrange}• {MAINCOLOUR}Visit job locations get a job and earn money. Look for yellow spots on the map`); messagePlayerNormal(client, `{clanOrange}• {MAINCOLOUR}At a job location, use {ALTCOLOUR}/takejob {MAINCOLOUR}to get the job. Use {ALTCOLOUR}/quitjob {MAINCOLOUR}to quit your job`); messagePlayerNormal(client, `{clanOrange}• {MAINCOLOUR}Use {ALTCOLOUR}/startwork {MAINCOLOUR}to begin working. You can also get a job {ALTCOLOUR}/uniform and {ALTCOLOUR}/equipment`); @@ -240,7 +240,7 @@ function showJobHelpMessage(client) { // =========================================================================== function showChatHelpMessage(client) { - messagePlayerInfo(client, makeChatSectionHeader(getLocaleString(client, "HeaderChatHelp"))); + messagePlayerInfo(client, makeChatBoxSectionHeader(getLocaleString(client, "HeaderChatHelp"))); messagePlayerNormal(client, `{clanOrange}• {MAINCOLOUR}There are two main types of chat: out-of-character (OOC) and in-character (IC)`); messagePlayerNormal(client, `{clanOrange}• {MAINCOLOUR}Mixing these two types is not proper roleplay. See {ALTCOLOUR}/rules {MAINCOLOUR}for info.`); messagePlayerNormal(client, `{clanOrange}• {MAINCOLOUR}Some chat commands: {ALTCOLOUR}/dm /whisper /talk /shout /me.`); @@ -250,7 +250,7 @@ function showChatHelpMessage(client) { // =========================================================================== function showRulesHelpMessage(client) { - messagePlayerInfo(client, makeChatSectionHeader(getLocaleString(client, "HeaderServerRulesList"))); + messagePlayerInfo(client, makeChatBoxSectionHeader(getLocaleString(client, "HeaderServerRulesList"))); messagePlayerNormal(client, `{clanOrange}• {MAINCOLOUR}Unrealistic actions (powergaming) are not allowed. You aren't superman.`); messagePlayerNormal(client, `{clanOrange}• {MAINCOLOUR}No terrorist or terrorism roleplay is allowed.`); messagePlayerNormal(client, `{clanOrange}• {MAINCOLOUR}Always follow instructions given by moderators and admins.`); @@ -261,21 +261,21 @@ function showRulesHelpMessage(client) { // =========================================================================== function showWebsiteHelpMessage(client) { - messagePlayerInfo(client, makeChatSectionHeader(getLocaleString(client, "HeaderWebsiteInfo"))); + messagePlayerInfo(client, makeChatBoxSectionHeader(getLocaleString(client, "HeaderWebsiteInfo"))); messagePlayerNormal(client, `{clanOrange}• {MAINCOLOUR}${server.getRule("Website")}`); } // =========================================================================== function showDiscordHelpMessage(client) { - messagePlayerInfo(client, makeChatSectionHeader(getLocaleString(client, "HeaderDiscordInfo"))); + messagePlayerInfo(client, makeChatBoxSectionHeader(getLocaleString(client, "HeaderDiscordInfo"))); messagePlayerNormal(client, `{clanOrange}• {MAINCOLOUR}${server.getRule("Website")}`); } // =========================================================================== function showAnimationHelpMessage(client) { - messagePlayerInfo(client, makeChatSectionHeader(getLocaleString(client, "HeaderAnimationHelp"))); + messagePlayerInfo(client, makeChatBoxSectionHeader(getLocaleString(client, "HeaderAnimationHelp"))); messagePlayerNormal(client, `{clanOrange}• {MAINCOLOUR}Animations allow you to enhance roleplay with visual actions`); messagePlayerNormal(client, `{clanOrange}• {MAINCOLOUR}Use {ALTCOLOUR}/an {MAINCOLOUR}or {ALTCOLOUR}/anim {MAINCOLOUR}with a name to use an animation.`); messagePlayerNormal(client, `{clanOrange}• {MAINCOLOUR}To see a list of animations, use {ALTCOLOUR}/animlist`); @@ -284,7 +284,7 @@ function showAnimationHelpMessage(client) { // =========================================================================== function showAmmunationHelpMessage(client) { - messagePlayerInfo(client, makeChatSectionHeader(getLocaleString(client, "HeaderAmmunationHelp"))); + messagePlayerInfo(client, makeChatBoxSectionHeader(getLocaleString(client, "HeaderAmmunationHelp"))); messagePlayerNormal(client, `{clanOrange}• {MAINCOLOUR}Visit an ammunation to buy weapons. Use {ALTCOLOUR}/gps {MAINCOLOUR}to find one.`); messagePlayerNormal(client, `{clanOrange}• {MAINCOLOUR}Buying a weapon requires a weapon license.`); messagePlayerNormal(client, `{clanOrange}• {MAINCOLOUR}Weapon licenses are managed by the police department. Apply there to get one.`); @@ -294,7 +294,7 @@ function showAmmunationHelpMessage(client) { // =========================================================================== function showClothesHelpMessage(client) { - messagePlayerInfo(client, makeChatSectionHeader(getLocaleString(client, "HeaderSkinHelp"))); + messagePlayerInfo(client, makeChatBoxSectionHeader(getLocaleString(client, "HeaderSkinHelp"))); //messagePlayerNormal(client, `{clanOrange}• {MAINCOLOUR}To change your skin, use {ALTCOLOUR}/gps {MAINCOLOUR}to find a clothing store`); messagePlayerNormal(client, `{clanOrange}• {MAINCOLOUR}At a clothing store, use {ALTCOLOUR}/buy {MAINCOLOUR} to purchase clothes`); messagePlayerNormal(client, `{clanOrange}• {MAINCOLOUR}When you have a clothing item, equip and use it like any other item to show the skin selection (check {ALTCOLOUR}/help items {MAINCOLOUR}to learn how to use items)`); @@ -304,7 +304,7 @@ function showClothesHelpMessage(client) { // =========================================================================== function showBindKeysHelpMessage(client) { - messagePlayerInfo(client, makeChatSectionHeader(getLocaleString(client, "HeaderBindableKeysHelp"))); + messagePlayerInfo(client, makeChatBoxSectionHeader(getLocaleString(client, "HeaderBindableKeysHelp"))); messagePlayerNormal(client, `{clanOrange}• {MAINCOLOUR}You can set your own keys binds. Use {ALTCOLOUR}/keybinds {MAINCOLOUR}to see your binded keys.`); messagePlayerNormal(client, `{clanOrange}• {MAINCOLOUR}Use {ALTCOLOUR}/bindkey {MAINCOLOUR}to add a new keybind and /unbindkey to remove one.`); messagePlayerNormal(client, `{clanOrange}• {MAINCOLOUR}Default keys are: [#0066FF]K {MAINCOLOUR}for vehicle engine, [#0066FF]L {MAINCOLOUR}for lights, and [#0066FF]J {MAINCOLOUR}for lock/unlock`); @@ -317,7 +317,7 @@ function showBindKeysHelpMessage(client) { // =========================================================================== function showBusinessHelpMessage(client) { - messagePlayerInfo(client, makeChatSectionHeader(getLocaleString(client, "HeaderBusinessHelp"))); + messagePlayerInfo(client, makeChatBoxSectionHeader(getLocaleString(client, "HeaderBusinessHelp"))); messagePlayerNormal(client, `{clanOrange}• {MAINCOLOUR}Use /buy to purchase items or /bizitems to see a list of what's for sale at any business`); messagePlayerNormal(client, `{clanOrange}• {MAINCOLOUR}Businesses are shown with blue names above the icon at their entrance.`); messagePlayerNormal(client, `{clanOrange}• {MAINCOLOUR}Business owner commands: {ALTCOLOUR}/bizorder, /bizlock, /bizlights, /radiostation, /bizitemprice, /bizbuyprice, /bizfee, /biztill, /bizwithdraw, /bizdeposit`); @@ -327,7 +327,7 @@ function showBusinessHelpMessage(client) { // =========================================================================== function showClanHelpMessage(client) { - messagePlayerInfo(client, makeChatSectionHeader(getLocaleString(client, "HeaderClanHelp"))); + messagePlayerInfo(client, makeChatBoxSectionHeader(getLocaleString(client, "HeaderClanHelp"))); messagePlayerNormal(client, `{clanOrange}• {MAINCOLOUR}Ask an admin to create a clan (Similar to factions/groups/families)`); messagePlayerNormal(client, `{clanOrange}• {MAINCOLOUR}Clan owners have full control over their clan once it's created`); messagePlayerNormal(client, `{clanOrange}• {MAINCOLOUR}Clan commands: {ALTCOLOUR}/clan, /clanmotd, /clanname, /clanowner, /clanhouse, /clanbiz, /claninvite, /clanuninvite, /clansetrank`); @@ -337,7 +337,7 @@ function showClanHelpMessage(client) { // =========================================================================== function showRadioHelpMessage(client) { - messagePlayerInfo(client, makeChatSectionHeader(getLocaleString(client, "HeaderRadioHelp"))); + messagePlayerInfo(client, makeChatBoxSectionHeader(getLocaleString(client, "HeaderRadioHelp"))); messagePlayerNormal(client, `{clanOrange}• {MAINCOLOUR}Use {ALTCOLOUR}/radiostation {MAINCOLOUR}to set the station for your vehicle, house, or business`); messagePlayerNormal(client, `{clanOrange}• {MAINCOLOUR}Use {ALTCOLOUR}/radiostations {MAINCOLOUR}to see a list of stations`); messagePlayerNormal(client, `{clanOrange}• {MAINCOLOUR}You can change your radio streaming volume using {ALTCOLOUR}/radiovolume {MAINCOLOUR}with 0-100 as the percent.`); @@ -346,7 +346,7 @@ function showRadioHelpMessage(client) { // =========================================================================== function showWealthAndTaxHelpMessage(client) { - messagePlayerInfo(client, makeChatSectionHeader(getLocaleString(client, "HeaderWealthAndTax"))); + messagePlayerInfo(client, makeChatBoxSectionHeader(getLocaleString(client, "HeaderWealthAndTax"))); messagePlayerNormal(client, `{clanOrange}• {MAINCOLOUR}Your taxes on payday are ${100*getGlobalConfig().economy.incomeTaxRate}% of your calculated wealth.`); messagePlayerNormal(client, `{clanOrange}• {MAINCOLOUR}Your calculated wealth is a total sum based on how many vehicles, houses, and businesses you have.`); messagePlayerNormal(client, `{clanOrange}• {MAINCOLOUR}Each vehicle is {ALTCOLOUR}${getGlobalConfig().economy.upKeepCosts.upKeepPerVehicle}, {MAINCOLOUR}each house is {ALTCOLOUR}${getGlobalConfig().economy.upKeepCosts.upKeepPerHouse}, {MAINCOLOUR}and each business is {ALTCOLOUR}${getGlobalConfig().economy.upKeepCosts.upKeepPerBusiness}`); @@ -371,7 +371,7 @@ function showCommandHelpMessage(client, commandName) { let command = getCommandData(commandName); let aliases = getCommandAliasesNames(command); - messagePlayerInfo(client, makeChatSectionHeader(getLocaleString(client, "HeaderCommandInfo", commandName))); + messagePlayerInfo(client, makeChatBoxSectionHeader(getLocaleString(client, "HeaderCommandInfo", commandName))); messagePlayerNormal(client, `{clanOrange}• {MAINCOLOUR}Description: ${command.description}`); if(aliases.length > 0) { diff --git a/scripts/server/radio.js b/scripts/server/radio.js index 2b7cc0de..b0d3bade 100644 --- a/scripts/server/radio.js +++ b/scripts/server/radio.js @@ -193,7 +193,7 @@ function showRadioStationListCommand(command, params, client) { let chunkedList = splitArrayIntoChunks(stationList, 4); - messagePlayerNormal(client, makeChatSectionHeader(getLocaleString(client, "HeaderRadioStationsList"))); + messagePlayerNormal(client, makeChatBoxSectionHeader(getLocaleString(client, "HeaderRadioStationsList"))); for(let i in chunkedList) { messagePlayerInfo(client, chunkedList[i].join(", ")); From 8f4c0bfaed5ec233594f9ea8e3468b5ff446a7af Mon Sep 17 00:00:00 2001 From: Vortrex <3858226+VortrexFTW@users.noreply.github.com> Date: Sun, 9 Jan 2022 17:20:48 -0600 Subject: [PATCH 104/337] Move moderation stuff to generic staff script --- scripts/server/{staff.js => moderation.js} | 10 +++++----- scripts/server/startup.js | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) rename scripts/server/{staff.js => moderation.js} (99%) diff --git a/scripts/server/staff.js b/scripts/server/moderation.js similarity index 99% rename from scripts/server/staff.js rename to scripts/server/moderation.js index a736d516..b1f42c97 100644 --- a/scripts/server/staff.js +++ b/scripts/server/moderation.js @@ -2,14 +2,14 @@ // Vortrex's Roleplay Resource // https://github.com/VortrexFTW/gtac_roleplay // =========================================================================== -// FILE: staff.js -// DESC: Provides staff commands, functions and usage +// FILE: moderation.js +// DESC: Provides moderation commands, functions and usage // TYPE: Server (JavaScript) // =========================================================================== -function initStaffScript() { - logToConsole(LOG_INFO, "[VRR.Staff]: Initializing staff script ..."); - logToConsole(LOG_INFO, "[VRR.Staff]: Staff script initialized successfully!"); +function initModerationScript() { + logToConsole(LOG_INFO, "[VRR.Moderation]: Initializing moderation script ..."); + logToConsole(LOG_INFO, "[VRR.Moderation]: Moderation script initialized successfully!"); } // =========================================================================== diff --git a/scripts/server/startup.js b/scripts/server/startup.js index 5442caf3..bed6dc3d 100644 --- a/scripts/server/startup.js +++ b/scripts/server/startup.js @@ -20,7 +20,7 @@ function initServerScripts() { initClanScript(); initHouseScript(); initChatScript(); - initModerationScript(); + initStaffScript(); initAccountScript(); initSubAccountScript(); initChatScript(); From 91e4579c9a246a82ddde0f83682046981500ec60 Mon Sep 17 00:00:00 2001 From: Vortrex <3858226+VortrexFTW@users.noreply.github.com> Date: Sun, 9 Jan 2022 17:21:01 -0600 Subject: [PATCH 105/337] Remove static job rank names and unused factions array --- scripts/server/core.js | 31 ------------------------------- 1 file changed, 31 deletions(-) diff --git a/scripts/server/core.js b/scripts/server/core.js index ef66be52..0e4e6b10 100644 --- a/scripts/server/core.js +++ b/scripts/server/core.js @@ -18,7 +18,6 @@ let serverData = { clients: new Array(128), businesses: [], houses: [], - factions: [], commands: {}, groundItemCache: [], groundPlantCache: [], @@ -30,31 +29,6 @@ let serverData = { blackListedGameScripts: [], }, localeStrings: {}, - jobRankNames: [ - [ - "Police Officer I", - "Detective", - "Sergeant", - "Lieutenant", - "Captain", - "Chief of Police", - ], - [ - "Paramedic", - "Senior Paramedic", - "Lieutenant", - "Lieutenant", - "Captain", - "Chief of Department", - ], - [ - "Firefighter", - "Senior Firefighter", - "Fire Marshal", - "Captain", - "Chief of Department", - ] - ] }; // =========================================================================== @@ -65,11 +39,6 @@ let allowedSkins = getAllowedSkins(getGame()); // =========================================================================== function initServerData() { - // Pre-allocate translation cache language slots - //getServerData().translation.cache = new Array(getServerData().translation.languages.length); - //let translationCacheFrom = new Array(getServerData().translation.languages.length); - //translationCacheFrom.fill([]); - //getServerData().translation.cache.fill(translationCacheFrom); } // =========================================================================== From d934d39663e566bc7daa256a39f02f87ecfc4d87 Mon Sep 17 00:00:00 2001 From: Vortrex <3858226+VortrexFTW@users.noreply.github.com> Date: Sun, 9 Jan 2022 17:21:54 -0600 Subject: [PATCH 106/337] Move moderation stuff to generic staff script --- scripts/server/{moderation.js => staff.js} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename scripts/server/{moderation.js => staff.js} (100%) diff --git a/scripts/server/moderation.js b/scripts/server/staff.js similarity index 100% rename from scripts/server/moderation.js rename to scripts/server/staff.js From b24a591046e8243ce2ccfe5a5685777378fa3ea0 Mon Sep 17 00:00:00 2001 From: Vortrex <3858226+VortrexFTW@users.noreply.github.com> Date: Sun, 9 Jan 2022 17:24:10 -0600 Subject: [PATCH 107/337] Update meta.xml --- meta.xml | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/meta.xml b/meta.xml index 75e6a368..33f8807f 100644 --- a/meta.xml +++ b/meta.xml @@ -9,11 +9,11 @@