From 49d212b9fd799c308499c1f55f914505e295847e Mon Sep 17 00:00:00 2001 From: Vortrex <3858226+VortrexFTW@users.noreply.github.com> Date: Tue, 26 Jul 2022 02:18:13 -0500 Subject: [PATCH] Backup current script state --- scripts/client/netevents.js | 417 ++++++++++++ scripts/server/crime.js | 22 + scripts/server/forensics.js | 20 + scripts/server/gps.js | 148 +++++ scripts/server/insurance.js | 40 ++ scripts/server/netevents.js | 1235 +++++++++++++++++++++++++++++++++++ 6 files changed, 1882 insertions(+) create mode 100644 scripts/client/netevents.js create mode 100644 scripts/server/crime.js create mode 100644 scripts/server/forensics.js create mode 100644 scripts/server/gps.js create mode 100644 scripts/server/insurance.js create mode 100644 scripts/server/netevents.js diff --git a/scripts/client/netevents.js b/scripts/client/netevents.js new file mode 100644 index 00000000..0cadc35a --- /dev/null +++ b/scripts/client/netevents.js @@ -0,0 +1,417 @@ +// =========================================================================== +// Vortrex's Roleplay Resource +// https://github.com/VortrexFTW/gtac_roleplay +// =========================================================================== +// FILE: netevents.js +// DESC: Provides server communication and cross-endpoint network events +// TYPE: Client (JavaScript) +// =========================================================================== + +function initServerScript() { + logToConsole(LOG_DEBUG, "[VRR.Server]: Initializing server script ..."); + addAllNetworkHandlers(); + logToConsole(LOG_DEBUG, "[VRR.Server]: Server script initialized!"); +} + +// =========================================================================== + +function addAllNetworkHandlers() { + logToConsole(LOG_DEBUG, "[VRR.Server]: Adding network handlers ..."); + + // Chat history + addNetworkEventHandler("m", receiveChatBoxMessageFromServer); // Not prefixed with VRR to make it as small as possible + addNetworkEventHandler("vrr.chatScrollLines", setChatScrollLines); + addNetworkEventHandler("vrr.chatAutoHideDelay", setChatAutoHideDelay); + + // Messaging (like textdraws and stuff) + addNetworkEventHandler("vrr.smallGameMessage", showSmallGameMessage); + + // Job + addNetworkEventHandler("vrr.job", receiveJobFromServer); + addNetworkEventHandler("vrr.working", setLocalPlayerWorkingState); + addNetworkEventHandler("vrr.jobType", setLocalPlayerJobType); + addNetworkEventHandler("vrr.showJobRouteLocation", showJobRouteLocation); + addNetworkEventHandler("vrr.hideJobRouteLocation", hideJobRouteLocation); + + // Local player states and values + addNetworkEventHandler("vrr.restoreCamera", restoreLocalCamera); + addNetworkEventHandler("vrr.cameraLookAt", setLocalCameraLookAt); + addNetworkEventHandler("vrr.freeze", setLocalPlayerFrozenState); + addNetworkEventHandler("vrr.control", setLocalPlayerControlState); + addNetworkEventHandler("vrr.fadeCamera", fadeLocalCamera); + addNetworkEventHandler("vrr.removeFromVehicle", removeLocalPlayerFromVehicle); + addNetworkEventHandler("vrr.clearWeapons", clearLocalPlayerWeapons); + addNetworkEventHandler("vrr.giveWeapon", giveLocalPlayerWeapon); + addNetworkEventHandler("vrr.position", setLocalPlayerPosition); + addNetworkEventHandler("vrr.heading", setLocalPlayerHeading); + addNetworkEventHandler("vrr.interior", setLocalPlayerInterior); + addNetworkEventHandler("vrr.spawned", onServerSpawnedLocalPlayer); + addNetworkEventHandler("vrr.money", setLocalPlayerCash); + addNetworkEventHandler("vrr.armour", setLocalPlayerArmour); + addNetworkEventHandler("vrr.localPlayerSkin", setLocalPlayerSkin); + addNetworkEventHandler("vrr.pedSpeak", makeLocalPlayerPedSpeak); + addNetworkEventHandler("vrr.infiniteRun", setLocalPlayerInfiniteRun); + addNetworkEventHandler("vrr.playerCop", setLocalPlayerAsCopState); + addNetworkEventHandler("vrr.health", setLocalPlayerHealth); + addNetworkEventHandler("vrr.wantedLevel", setLocalPlayerWantedLevel); + addNetworkEventHandler("vrr.playerPedId", sendLocalPlayerNetworkIdToServer); + addNetworkEventHandler("vrr.ped", setLocalPlayerPedPartsAndProps); + addNetworkEventHandler("vrr.spawn", serverRequestedLocalPlayerSpawn); + addNetworkEventHandler("vrr.clearPedState", clearLocalPedState); + addNetworkEventHandler("vrr.drunkEffect", setLocalPlayerDrunkEffect); + addNetworkEventHandler("vrr.deleteLocalPlayerPed", deleteLocalPlayerPed); + + // Vehicle + addNetworkEventHandler("vrr.vehicle", receiveVehicleFromServer); + addNetworkEventHandler("vrr.veh.lights", setVehicleLights); + addNetworkEventHandler("vrr.veh.engine", setVehicleEngine); + addNetworkEventHandler("vrr.veh.repair", repairVehicle); + + // Radio + addNetworkEventHandler("vrr.radioStream", playStreamingRadio); + addNetworkEventHandler("vrr.audioFileStream", playAudioFile); + addNetworkEventHandler("vrr.stopRadioStream", stopStreamingRadio); + addNetworkEventHandler("vrr.radioVolume", setStreamingRadioVolume); + + // Key Bindings + addNetworkEventHandler("vrr.delKeyBind", unBindAccountKey); + addNetworkEventHandler("vrr.addKeyBind", bindAccountKey); + addNetworkEventHandler("vrr.clearKeyBinds", clearKeyBinds); + + // Weapon Damage + addNetworkEventHandler("vrr.weaponDamageEnabled", setPlayerWeaponDamageEnabled); + addNetworkEventHandler("vrr.weaponDamageEvent", setPlayerWeaponDamageEvent); + + // GUI + addNetworkEventHandler("vrr.showRegistration", showRegistrationGUI); + addNetworkEventHandler("vrr.showNewCharacter", showNewCharacterGUI); + addNetworkEventHandler("vrr.showLogin", showLoginGUI); + addNetworkEventHandler("vrr.2fa", showTwoFactorAuthGUI); + addNetworkEventHandler("vrr.showResetPasswordCodeInput", resetPasswordCodeInputGUI); + addNetworkEventHandler("vrr.showResetPasswordEmailInput", resetPasswordEmailInputGUI); + addNetworkEventHandler("vrr.showChangePassword", showChangePasswordGUI); + addNetworkEventHandler("vrr.showCharacterSelect", showCharacterSelectGUI); + addNetworkEventHandler("vrr.switchCharacterSelect", switchCharacterSelectGUI); + addNetworkEventHandler("vrr.showError", showErrorGUI); + addNetworkEventHandler("vrr.showInfo", showInfoGUI); + addNetworkEventHandler("vrr.showPrompt", showYesNoPromptGUI); + addNetworkEventHandler("vrr.loginSuccess", loginSuccess); + addNetworkEventHandler("vrr.characterSelectSuccess", characterSelectSuccess); + addNetworkEventHandler("vrr.loginFailed", loginFailed); + addNetworkEventHandler("vrr.registrationSuccess", registrationSuccess); + addNetworkEventHandler("vrr.registrationFailed", registrationFailed); + addNetworkEventHandler("vrr.newCharacterFailed", newCharacterFailed); + addNetworkEventHandler("vrr.changePassword", showChangePasswordGUI); + addNetworkEventHandler("vrr.showLocaleChooser", showLocaleChooserGUI); + addNetworkEventHandler("vrr.guiColour", setGUIColours); + + // Business + addNetworkEventHandler("vrr.business", receiveBusinessFromServer); + + // House + addNetworkEventHandler("vrr.house", receiveHouseFromServer); + + // GPS + addNetworkEventHandler("vrr.showGPSBlip", showGPSLocation); + + // Locale + addNetworkEventHandler("vrr.locale", setLocale); + addNetworkEventHandler("vrr.localeChooser", toggleLocaleChooserGUI); + + // Misc + addNetworkEventHandler("vrr.mouseCursor", toggleMouseCursor); + addNetworkEventHandler("vrr.mouseCamera", toggleMouseCamera); + addNetworkEventHandler("vrr.clearPeds", clearLocalPlayerOwnedPeds); + addNetworkEventHandler("vrr.passenger", enterVehicleAsPassenger); + addNetworkEventHandler("vrr.logo", setServerLogoRenderState); + addNetworkEventHandler("vrr.ambience", setCityAmbienceState); + addNetworkEventHandler("vrr.runCode", runClientCode); + addNetworkEventHandler("vrr.minuteDuration", setMinuteDuration); + addNetworkEventHandler("vrr.snow", setSnowState); + addNetworkEventHandler("vrr.enterPropertyKey", setEnterPropertyKey); + addNetworkEventHandler("vrr.skinSelect", toggleSkinSelect); + addNetworkEventHandler("vrr.hotbar", updatePlayerHotBar); + addNetworkEventHandler("vrr.showItemActionDelay", showItemActionDelay); + addNetworkEventHandler("vrr.set2DRendering", set2DRendering); + addNetworkEventHandler("vrr.mouseCameraForce", setMouseCameraState); + addNetworkEventHandler("vrr.logLevel", setLogLevel); + addNetworkEventHandler("vrr.hideAllGUI", hideAllGUI); + addNetworkEventHandler("vrr.nametag", updatePlayerNameTag); + addNetworkEventHandler("vrr.nametagDistance", setNameTagDistance); + addNetworkEventHandler("vrr.ping", updatePlayerPing); + addNetworkEventHandler("vrr.anim", makePedPlayAnimation); + addNetworkEventHandler("vrr.stopAnim", makePedStopAnimation); + addNetworkEventHandler("vrr.forceAnim", forcePedAnimation); + addNetworkEventHandler("vrr.clientInfo", serverRequestedClientInfo); + addNetworkEventHandler("vrr.interiorLights", updateInteriorLightsState); + addNetworkEventHandler("vrr.cutsceneInterior", setCutsceneInterior); + addNetworkEventHandler("vrr.syncElement", forceSyncElementProperties); + addNetworkEventHandler("vrr.elementPosition", setElementPosition); + addNetworkEventHandler("vrr.elementCollisions", setElementCollisionsEnabled); + addNetworkEventHandler("vrr.vehBuyState", setVehiclePurchaseState); + addNetworkEventHandler("vrr.holdObject", makePedHoldObject); +} + +// =========================================================================== + +function sendResourceReadySignalToServer() { + sendNetworkEventToServer("vrr.clientReady"); +} + +// =========================================================================== + +function sendResourceStartedSignalToServer() { + sendNetworkEventToServer("vrr.clientStarted"); +} + +// =========================================================================== + +function sendResourceStoppedSignalToServer() { + if (isConnected) { + sendNetworkEventToServer("vrr.clientStopped"); + } +} + +// =========================================================================== + +function set2DRendering(hudState, labelState, smallGameMessageState, scoreboardState, hotBarState, itemActionDelayState) { + logToConsole(LOG_DEBUG, `[VRR.Main] Updating render states (HUD: ${hudState}, Labels: ${labelState}, Bottom Text: ${smallGameMessageState}, Scoreboard: ${scoreboardState}, HotBar: ${hotBarState}, Item Action Delay: ${itemActionDelayState})`); + renderHUD = hudState; + + if (getGame() == VRR_GAME_GTA_IV) { + natives.displayCash(hudState); + natives.displayAmmo(hudState); + natives.displayHud(hudState); + natives.displayRadar(hudState); + natives.displayAreaName(hudState); + } else { + if (typeof setHUDEnabled != "undefined") { + setHUDEnabled(hudState); + } + } + + renderLabels = labelState; + renderSmallGameMessage = smallGameMessageState; + renderScoreBoard = scoreboardState; + renderHotBar = hotBarState; + renderItemActionDelay = itemActionDelayState; +} + +// =========================================================================== + +function onServerSpawnedLocalPlayer(state) { + logToConsole(LOG_DEBUG, `[VRR.Main] Setting spawned state to ${state}`); + isSpawned = state; + setUpInitialGame(); + if (state) { + setTimeout(function () { + calledDeathEvent = false; + }, 1000); + + getElementsByType(ELEMENT_PED).filter(ped => !ped.isType(ELEMENT_PLAYER)).forEach(ped => { + syncCivilianProperties(ped); + }); + + getElementsByType(ELEMENT_PLAYER).forEach(player => { + syncPlayerProperties(player); + }); + + getElementsByType(ELEMENT_VEHICLE).forEach(vehicle => { + syncVehicleProperties(vehicle); + }); + } +} + +// =========================================================================== + +function tellServerPlayerUsedKeyBind(key) { + sendNetworkEventToServer("vrr.useKeyBind", key); +} + +// =========================================================================== + +function tellServerPlayerArrivedAtJobRouteLocation() { + sendNetworkEventToServer("vrr.arrivedAtJobRouteLocation"); +} + +// =========================================================================== + +function tellServerItemActionDelayComplete() { + sendNetworkEventToServer("vrr.itemActionDelayComplete"); +} + +// =========================================================================== + +function sendServerClientInfo() { + let clientVersion = "0.0.0.0"; + if (typeof CLIENT_VERSION_MAJOR != "undefined") { + clientVersion = `${CLIENT_VERSION_MAJOR}.${CLIENT_VERSION_MINOR}.${CLIENT_VERSION_PATCH}.${CLIENT_VERSION_BUILD}`; + } + sendNetworkEventToServer("vrr.clientInfo", clientVersion, game.width, game.height); +} + +// =========================================================================== + +function sendServerNewAFKStatus(state) { + sendNetworkEventToServer("vrr.afk", state); +} + +// =========================================================================== + +function anchorBoat(vehicleId) { + +} + +// =========================================================================== + +function setEnterPropertyKey(key) { + enterPropertyKey = key; +} + +// =========================================================================== + +function serverRequestedClientInfo() { + sendServerClientInfo(); +} + +// =========================================================================== + +function updateInteriorLightsState(state) { + interiorLightsEnabled = state; +} + +// =========================================================================== + +function forceSyncElementProperties(elementId) { + if (getElementFromId(elementId) == null) { + return false; + } + + syncElementProperties(getElementFromId(elementId)); +} + +// =========================================================================== + +function setElementCollisionsEnabled(elementId, state) { + if (getElementFromId(elementId) == null) { + return false; + } + + getElementFromId(elementId).collisionsEnabled = state; +} + +// =========================================================================== + +function setLocalPlayerArmour(armour) { + if (typeof localPlayer.armour != "undefined") { + localPlayer.armour = armour; + } +} + +// =========================================================================== + +function setLocalPlayerWantedLevel(wantedLevel) { + forceWantedLevel = toInteger(wantedLevel); +} + +// =========================================================================== + +function setLogLevel(level) { + logLevel = level; +} + +// =========================================================================== + +function setLocalPlayerInfiniteRun(state) { + if (localPlayer != null) { + if (getGame() == VRR_GAME_GTA_III || getGame() == VRR_GAME_GTA_VC) { + game.SET_PLAYER_NEVER_GETS_TIRED(game.GET_PLAYER_ID(), boolToInt(state)); + } + } +} + +// =========================================================================== + +function setLocalPlayerSkin(skinId) { + logToConsole(LOG_INFO, `[VRR.Server] Setting locale player skin to ${skinId}`); + if (getGame() == VRR_GAME_GTA_IV) { + natives.changePlayerModel(natives.getPlayerId(), skinId); + } else { + localPlayer.skin = skinId; + } +} + +// =========================================================================== + +function makePedHoldObject(pedId, modelIndex) { + if (getGame() == VRR_GAME_GTA_IV) { + natives.givePedAmbientObject(natives.getPedFromNetworkId(pedId), getGameConfig().objects[getGame()][modelIndex][1]) + } +} + +// =========================================================================== + +function sendLocalPlayerNetworkIdToServer() { + sendNetworkEventToServer("vrr.playerPedId", natives.getNetworkIdFromPed(localPlayer)); +} + +// =========================================================================== + +function setCutsceneInterior(cutsceneName) { + if (getGame() == VRR_GAME_GTA_IV) { + if (cutsceneName == "") { + natives.clearCutscene(); + } else { + if (natives.isInteriorScene()) { + natives.clearCutscene(); + } + natives.initCutscene(cutsceneName); + } + } +} + +// =========================================================================== + +function makeLocalPlayerPedSpeak(speechName) { + if (getGame() == VRR_GAME_GTA_IV) { + // if player is in vehicle, allow megaphone (if last arg is "1", it will cancel megaphone echo) + // Only speeches with _MEGAPHONE will have the bullhorn effect + // Afaik it only works on police voices anyway + if (localPlayer.vehicle != null) { + natives.sayAmbientSpeech(localPlayer, speechName, true, false, 0); + } else { + natives.sayAmbientSpeech(localPlayer, speechName, true, false, 1); + } + } else if (getGame() == VRR_GAME_GTA_III || getGame() == VRR_GAME_GTA_VC) { + // Don't have a way to get the ped ref ID and can't use ped in arg + //game.SET_CHAR_SAY(game.GET_PLAYER_ID(), int); + } +} + +// =========================================================================== + +function setLocalPlayerAsCopState(state) { + if (getGame() == VRR_GAME_GTA_IV) { + natives.setPlayerAsCop(natives.getPlayerId(), state); + natives.setPoliceIgnorePlayer(natives.getPlayerId(), state); + } +} + +// =========================================================================== + +function serverRequestedLocalPlayerSpawn(skinId, position) { + if (getGame() == VRR_GAME_GTA_IV) { + natives.createPlayer(skinId, position); + //if(isCustomCameraSupported()) { + // game.restoreCamera(true); + //} + } +} + +// =========================================================================== + +function sendLocaleSelectToServer(localeId) { + sendNetworkEventToServer("vrr.localeSelect", localeId); +} + +// =========================================================================== \ No newline at end of file diff --git a/scripts/server/crime.js b/scripts/server/crime.js new file mode 100644 index 00000000..1df467c3 --- /dev/null +++ b/scripts/server/crime.js @@ -0,0 +1,22 @@ +// =========================================================================== +// Vortrex's Roleplay Resource +// https://github.com/VortrexFTW/gtac_roleplay +// =========================================================================== +// FILE: crime.js +// DESC: Provides crime data structures, functions, and operations +// TYPE: Server (JavaScript) +// =========================================================================== + +/** + * @class Representing a crime's data. Loaded and saved in the database + */ + class CrimeData { + constructor(suspectId, crimeType, reporterId = 0) { + this.crimeType = crimeType; + this.suspectId = suspectId; + this.reporterId = reporterId; + this.whenCommitted = 0; + this.whenReported = 0; + this.databaseId = 0; + } +}; \ No newline at end of file diff --git a/scripts/server/forensics.js b/scripts/server/forensics.js new file mode 100644 index 00000000..840a969f --- /dev/null +++ b/scripts/server/forensics.js @@ -0,0 +1,20 @@ +// =========================================================================== +// Vortrex's Roleplay Resource +// https://github.com/VortrexFTW/gtac_roleplay +// =========================================================================== +// FILE: forensics.js +// DESC: Provides forensics functions and commands (bullet casings, blood, etc) +// TYPE: Server (JavaScript) +// =========================================================================== + +// Forensic Types +const VRR_FORENSICS_NONE = 0; +const VRR_FORENSICS_BULLET = 1; // Bullet. The actual tip that hits a target. Has rifling and ballistics information of the weapon. +const VRR_FORENSICS_BLOOD = 2; // Blood. Automatically applied to ground and bullets that hit when somebody is shot +const VRR_FORENSICS_BODY = 3; // Body. A dead body lol +const VRR_FORENSICS_HAIR = 4; // Hair. Automatically applied to +const VRR_FORENSICS_SWEAT = 5; // Sweat. Automatically applied to clothing when worn +const VRR_FORENSICS_SALIVA = 6; // Saliva. Automatically applied to drinks when drank +const VRR_FORENSICS_BULLETCASINGS = 7; // Bullet casings. Automatically dropped when fired from a weapon except when used in a vehicle (driveby) + +// =========================================================================== \ No newline at end of file diff --git a/scripts/server/gps.js b/scripts/server/gps.js new file mode 100644 index 00000000..69d47321 --- /dev/null +++ b/scripts/server/gps.js @@ -0,0 +1,148 @@ +// =========================================================================== +// Vortrex's Roleplay Resource +// https://github.com/VortrexFTW/gtac_roleplay +// =========================================================================== +// FILE: gps.js +// DESC: Provides GPS functions and commands +// TYPE: Server (JavaScript) +// =========================================================================== + +// GPS State Types +const VRR_GPS_TYPE_NONE = 0; // None (invalid) +const VRR_GPS_TYPE_BUSINESS = 1; // Business +const VRR_GPS_TYPE_POLICE = 2; // Police Station +const VRR_GPS_TYPE_HOSPITAL = 3; // Hospital +const VRR_GPS_TYPE_JOB = 4; // Job +const VRR_GPS_TYPE_GAMELOC = 5; // Game Location + +// =========================================================================== + +function gpsCommand(command, params, client) { + messagePlayerNormal(client, makeChatBoxSectionHeader(getLocaleString(client, "HeaderBusinessList"))); + + let locationType = VRR_GPS_TYPE_NONE; + let useType = VRR_ITEM_USETYPE_NONE; + let blipColour = "white"; + + switch(toLowerCase(params)) { + case "police": + blipColour = "businessBlue" + locationType = VRR_GPS_TYPE_POLICE; + break; + + case "hospital": + blipColour = "businessBlue" + locationType = VRR_GPS_TYPE_HOSPITAL; + break; + + case "job": + blipColour = "businessBlue" + locationType = VRR_GPS_TYPE_JOB; + break; + + case "skin": + case "skins": + case "clothes": + case "player": + blipColour = "businessBlue" + locationType = VRR_GPS_TYPE_BUSINESS; + useType = VRR_ITEM_USETYPE_SKIN; + break; + + case "gun": + case "guns": + case "weapon": + case "weapons": + case "wep": + case "weps": + blipColour = "businessBlue" + locationType = VRR_GPS_TYPE_BUSINESS; + useType = VRR_ITEM_USETYPE_WEAPON; + break; + + case "food": + case "eat": + blipColour = "businessBlue" + locationType = VRR_GPS_TYPE_BUSINESS; + useType = VRR_ITEM_USETYPE_FOOD; + break; + + case "drink": + blipColour = "businessBlue" + locationType = VRR_GPS_TYPE_BUSINESS; + useType = VRR_ITEM_USETYPE_DRINK; + break; + + case "alcohol": + case "booze": + case "bar": + blipColour = "businessBlue" + locationType = VRR_GPS_TYPE_BUSINESS; + useType = VRR_ITEM_USETYPE_ALCOHOL; + break; + + case "repair": + case "carrepair": + case "vehrepair": + case "spray": + case "fix": + blipColour = "businessBlue" + locationType = VRR_GPS_TYPE_BUSINESS; + useType = VRR_ITEM_USETYPE_VEHREPAIR; + break; + + case "vehiclecolour": + case "vehcolour": + case "carcolour": + case "colour": + blipColour = "businessBlue" + locationType = VRR_GPS_TYPE_BUSINESS; + useType = VRR_ITEM_USETYPE_VEHCOLOUR; + break; + + default: { + let itemTypeId = getItemTypeFromParams(params); + if(getItemTypeData(itemTypeId) != false) { + locationType = VRR_GPS_TYPE_BUSINESS; + blipColour = "businessBlue"; + useType = getItemTypeData(itemTypeId).useType; + } else { + let gameLocationId = getGameLocationFromParams(params); + if(gameLocationId != false) { + position = getGameConfig().locations[getServerGame()][gameLocationId][1] + } + } + } + } + + if(locationType == VRR_GPS_TYPE_NONE) { + messagePlayerError(client, getLocaleString(client, "InvalidGPSLocation")); + return false; + } + + if(locationType == VRR_GPS_TYPE_BUSINESS) { + let businessId = getClosestBusinessWithBuyableItemOfUseType(useType); + if(!businessId) { + messagePlayerError(client, getLocaleString(client, "NoBusinessWithItemType")); + return false; + } + + if(!getBusinessData(businessId)) { + messagePlayerError(client, getLocaleString(client, "NoBusinessWithItemType")); + return false; + } + + hideAllBlipsForPlayerGPS(client); + blinkGenericGPSBlipForPlayer(client, getBusinessData(businessId).entrancePosition, getBusinessData(businessId).entranceBlipModel, getColourByType(blipColour), 10); + messagePlayerSuccess(client, "Look for the blinking icon on your mini map"); + } + + if(locationType == VRR_GPS_TYPE_GAMELOC) { + hideAllBlipsForPlayerGPS(client); + blinkGenericGPSBlipForPlayer(client, position, 0, getColourByType(blipColour), 10); + messagePlayerSuccess(client, "Look for the blinking icon on your mini map"); + return true; + } +} + +// =========================================================================== \ No newline at end of file diff --git a/scripts/server/insurance.js b/scripts/server/insurance.js new file mode 100644 index 00000000..35aee21f --- /dev/null +++ b/scripts/server/insurance.js @@ -0,0 +1,40 @@ +// =========================================================================== +// Vortrex's Roleplay Resource +// https://github.com/VortrexFTW/gtac_roleplay +// =========================================================================== +// FILE: insurance.js +// DESC: Provides insurance commands, functions, and usage +// TYPE: Server (JavaScript) +// =========================================================================== + +// Insurance Account Owner Types +const VRR_INS_ACCT_OWNER_NONE = 0; // None +const VRR_INS_ACCT_OWNER_PLAYER = 1; // Player owns insurance company +const VRR_INS_ACCT_OWNER_BIZ = 2; // Business owns insurance company +const VRR_INS_ACCT_OWNER_CLAN = 3; // Clan owns insurance company + +// =========================================================================== + +// Insurance Account Entity Types +const VRR_INS_ACCT_ENTITY_NONE = 0; // None +const VRR_INS_ACCT_ENTITY_PLAYER_HEALTH = 1; // Health Insurance +const VRR_INS_ACCT_ENTITY_PLAYER_LIFE = 2; // Life Insurance +const VRR_INS_ACCT_ENTITY_VEH = 3; // Vehicle Insurance +const VRR_INS_ACCT_ENTITY_BIZ = 4; // Business Insurance +const VRR_INS_ACCT_ENTITY_HOUSE = 5; // House Insurance + +// =========================================================================== + +// Insurance Account History Types +const VRR_INS_ACCT_HISTORY_NONE = 0; // None +const VRR_INS_ACCT_HISTORY_PLAYER_MEDICAL = 1; // Medical insurance was used (player disease/injury) +const VRR_INS_ACCT_HISTORY_PLAYER_DEATH = 2; // Life insurance was used (player death) +const VRR_INS_ACCT_HISTORY_VEH_DAMAGE = 3; // Vehicle was damaged, but not destroyed +const VRR_INS_ACCT_HISTORY_VEH_WRECKED = 4; // Vehicle was completely destroyed +const VRR_INS_ACCT_HISTORY_VEH_THEFT = 5; // Vehicle was stolen +const VRR_INS_ACCT_HISTORY_BIZ_DAMAGE = 6; // Business was damaged (broken items/window/door) +const VRR_INS_ACCT_HISTORY_BIZ_THEFT = 7; // Business was stolen from +const VRR_INS_ACCT_HISTORY_HOUSE_DAMAGE = 8; // House was damaged +const VRR_INS_ACCT_HISTORY_HOUSE_THEFT = 9; // House was stolen from + +// =========================================================================== \ No newline at end of file diff --git a/scripts/server/netevents.js b/scripts/server/netevents.js new file mode 100644 index 00000000..864f50e2 --- /dev/null +++ b/scripts/server/netevents.js @@ -0,0 +1,1235 @@ +// =========================================================================== +// Vortrex's Roleplay Resource +// https://github.com/VortrexFTW/gtac_roleplay +// =========================================================================== +// FILE: netevents.js +// DESC: Provides client communication and cross-endpoint network events +// TYPE: Server (JavaScript) +// =========================================================================== + +function initNetworkEventsScript() { + logToConsole(LOG_DEBUG, "[VRR.Client]: Initializing client script ..."); + addAllNetworkEventHandlers(); + logToConsole(LOG_DEBUG, "[VRR.Client]: Client script initialized!"); +} + +// =========================================================================== + +function addAllNetworkEventHandlers() { + logToConsole(LOG_DEBUG, "[VRR.Client]: Adding network handlers ..."); + + // KeyBind + addNetworkEventHandler("vrr.useKeyBind", playerUsedKeyBind); + + // GUI + addNetworkEventHandler("vrr.promptAnswerNo", playerPromptAnswerNo); + addNetworkEventHandler("vrr.promptAnswerYes", playerPromptAnswerYes); + addNetworkEventHandler("vrr.toggleGUI", playerToggledGUI); + addNetworkEventHandler("vrr.2fa", checkPlayerTwoFactorAuthentication); + + // AFK + addNetworkEventHandler("vrr.afk", playerChangeAFKState); + + // Event + 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 + addNetworkEventHandler("vrr.arrivedAtJobRouteLocation", playerArrivedAtJobRouteLocation); + + // Client + addNetworkEventHandler("vrr.clientReady", playerClientReady); + addNetworkEventHandler("vrr.guiReady", playerGUIReady); + addNetworkEventHandler("vrr.clientStarted", playerClientStarted); + addNetworkEventHandler("vrr.clientStopped", playerClientStopped); + + // Account + addNetworkEventHandler("vrr.checkLogin", checkLogin); + addNetworkEventHandler("vrr.checkRegistration", checkRegistration); + addNetworkEventHandler("vrr.checkResetPassword", checkAccountResetPasswordRequest); + addNetworkEventHandler("vrr.checkChangePassword", checkAccountChangePassword); + + // Developer + addNetworkEventHandler("vrr.runCodeSuccess", clientRunCodeSuccess); + addNetworkEventHandler("vrr.runCodeFail", clientRunCodeFail); + + // SubAccount + addNetworkEventHandler("vrr.checkNewCharacter", checkNewCharacter); + addNetworkEventHandler("vrr.nextCharacter", checkNextCharacter); + addNetworkEventHandler("vrr.previousCharacter", checkPreviousCharacter); + addNetworkEventHandler("vrr.selectCharacter", selectCharacter); + + // Item + addNetworkEventHandler("vrr.itemActionDelayComplete", playerItemActionDelayComplete); + addNetworkEventHandler("vrr.weaponDamage", playerDamagedByPlayer); + + // Locale + addNetworkEventHandler("vrr.localeSelect", playerSelectedNewLocale); + + // Misc + addNetworkEventHandler("vrr.plr.pos", updatePositionInPlayerData); + addNetworkEventHandler("vrr.plr.rot", updateHeadingInPlayerData); + addNetworkEventHandler("vrr.skinSelected", playerFinishedSkinSelection); + addNetworkEventHandler("vrr.clientInfo", updateConnectionLogOnClientInfoReceive); + addNetworkEventHandler("vrr.vehBuyState", receiveVehiclePurchaseStateUpdateFromClient); + addNetworkEventHandler("vrr.playerPedId", receivePlayerPedNetworkId); + addNetworkEventHandler("vrr.playerCop", setPlayerAsCopState); +} + +// =========================================================================== + +function updatePlayerNameTag(client) { + //logToConsole(LOG_DEBUG, `[VRR.Client] Sending ${getPlayerDisplayForConsole(client)}'s updated nametag to all players`); + sendNetworkEventToPlayer("vrr.nametag", null, getPlayerName(client), getPlayerNameForNameTag(client), getPlayerColour(client), getPlayerData(client).afk, getPlayerPing(client)); +} + +// =========================================================================== + +function updateAllPlayerNameTags() { + logToConsole(LOG_DEBUG, `[VRR.Client] Sending updated nametags to all players`); + let clients = getClients(); + for (let i in clients) { + updatePlayerNameTag(clients[i]); + } +} + +// =========================================================================== + +function updatePlayerPing(client) { + //logToConsole(LOG_DEBUG, `[VRR.Client] Sending ${getPlayerDisplayForConsole(client)}'s ping to all players`); + sendNetworkEventToPlayer("vrr.ping", null, getPlayerName(client), getPlayerPing(client)); +} + +// =========================================================================== + +function playerClientReady(client) { + playerResourceReady[client.index] = true; + logToConsole(LOG_DEBUG, `[VRR.Client] ${getPlayerDisplayForConsole(client)}'s client resources are downloaded and ready! Started: ${getYesNoFromBool(playerResourceStarted[client.index])}`); + if (playerResourceStarted[client.index] == true) { + initClient(client); + } +} + +// =========================================================================== + +function playerGUIReady(client) { + playerGUI[client.index] = true; + logToConsole(LOG_DEBUG, `[VRR.Client] ${getPlayerDisplayForConsole(client)}'s client GUI is initialized and ready!`); +} + +// =========================================================================== + +function playerClientStarted(client) { + playerResourceStarted[client.index] = true; + logToConsole(LOG_DEBUG, `[VRR.Client] ${getPlayerDisplayForConsole(client)}'s client resources are started and running! Ready: ${getYesNoFromBool(playerResourceReady[client.index])}`); + if (playerResourceReady[client.index] == true) { + initClient(client); + } +} + +// =========================================================================== + +function playerClientStopped(client) { + logToConsole(LOG_DEBUG, `[VRR.Client] ${getPlayerDisplayForConsole(client)}'s client resources have stopped (possibly error?). Kicking them from the server ...`); + getPlayerData(targetClient).customDisconnectReason = `Kicked - Client script verification failed. Possible hacks.`; + disconnectPlayer(client); +} + +// =========================================================================== + +function showGameMessage(client, text, colour, duration, fontName = "Pricedown") { + logToConsole(LOG_DEBUG, `[VRR.Client] Showing game message to ${getPlayerDisplayForConsole(client)} (${text}) for ${duration} milliseconds`); + sendNetworkEventToPlayer("vrr.smallGameMessage", client, text, colour, duration, fontName); +} + +// =========================================================================== + +function enableCityAmbienceForPlayer(client, clearElements = false) { + //if(server.getCVar("civilians") == false) { + // return false; + //} + + //logToConsole(LOG_DEBUG, `[VRR.Client] Setting ${getPlayerDisplayForConsole(client)}'s city ambience to ${toUpperCase(getOnOffFromBool(false))}`); + //sendNetworkEventToPlayer("vrr.ambience", client, true); +} + +// =========================================================================== + +function disableCityAmbienceForPlayer(client, clearElements = false) { + //if(server.getCVar("civilians") == true) { + // return false; + //} + + //logToConsole(LOG_DEBUG, `[VRR.Client] Setting ${getPlayerDisplayForConsole(client)}'s city ambience to ${toUpperCase(getOnOffFromBool(false))}`); + //sendNetworkEventToPlayer("vrr.ambience", client, false, clearElements); +} + +// =========================================================================== + +function clearPlayerOwnedPeds(client) { + logToConsole(LOG_DEBUG, `[VRR.Client] Clearing peds owned by ${getPlayerDisplayForConsole(client)}`); + sendNetworkEventToPlayer("vrr.clearPeds", client); +} + +// =========================================================================== + +function updatePlayerSpawnedState(client, state) { + logToConsole(LOG_DEBUG, `[VRR.Client] Setting ${getPlayerDisplayForConsole(client)}'s spawned state ${toUpperCase(getOnOffFromBool(state))}`); + getPlayerData(client).spawned = true; + sendNetworkEventToPlayer("vrr.spawned", client, state); +} + +// =========================================================================== + +function setPlayerControlState(client, state) { + logToConsole(LOG_DEBUG, `[VRR.Client] Setting ${getPlayerDisplayForConsole(client)}'s control state ${toUpperCase(getOnOffFromBool(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))}`); + sendNetworkEventToPlayer("vrr.logo", client, state); +} + +// =========================================================================== + +function restorePlayerCamera(client) { + logToConsole(LOG_DEBUG, `[VRR.Client] Restoring ${getPlayerDisplayForConsole(client)}'s camera`); + sendNetworkEventToPlayer("vrr.restoreCamera", client); +} + +// =========================================================================== + +function setPlayer2DRendering(client, hudState = false, labelState = false, smallGameMessageState = false, scoreboardState = false, hotBarState = false, itemActionDelayState = false) { + 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`); + sendNetworkEventToPlayer("vrr.syncElement", null, getPlayerPed(client).id); +} + +// =========================================================================== + +function updatePlayerSnowState(client) { + if (isSnowSupported(getGame())) { + logToConsole(LOG_DEBUG, `[VRR.Client] Setting ${getPlayerDisplayForConsole(client)}'s snow state (Falling: ${toUpperCase(getOnOffFromBool(getServerConfig().fallingSnow))}, Ground: ${toUpperCase(getOnOffFromBool(getServerConfig().groundSnow))})`); + sendNetworkEventToPlayer("vrr.snow", client, getServerConfig().fallingSnow, getServerConfig().groundSnow); + } +} + +// =========================================================================== + +function updatePlayerHotBar(client) { + logToConsole(LOG_DEBUG, `[VRR.Client] Sending updated hotbar data to ${getPlayerDisplayForConsole(client)}`); + let tempHotBarItems = []; + for (let i in getPlayerData(client).hotBarItems) { + let itemImage = ""; + let itemValue = 0; + let itemExists = false; + if (getPlayerData(client).hotBarItems[i] != -1) { + if (getItemData(getPlayerData(client).hotBarItems[i])) { + let itemData = getItemData(getPlayerData(client).hotBarItems[i]); + let itemTypeData = getItemTypeData(itemData.itemTypeIndex); + itemExists = true; + itemImage = itemTypeData.hotbarImage; + itemValue = itemData.value; + } + } + tempHotBarItems.push([i, itemExists, itemImage, itemValue]); + } + 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`); + 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`); + sendNetworkEventToPlayer("vrr.weaponDamageEvent", null, getPlayerName(client), eventType); + getPlayerData(client).weaponDamageEvent = eventType; +} + +// =========================================================================== + +function sendJobRouteLocationToPlayer(client, position, colour) { + logToConsole(LOG_DEBUG, `[VRR.Client] Sending job route stop data to ${getPlayerDisplayForConsole(client)}`); + sendNetworkEventToPlayer("vrr.showJobRouteLocation", client, position, colour); +} + +// =========================================================================== + +function showPlayerLoginSuccessGUI(client) { + logToConsole(LOG_DEBUG, `[VRR.Client] Sending login success GUI signal to ${getPlayerDisplayForConsole(client)}`); + sendNetworkEventToPlayer("vrr.loginSuccess", client); +} + +// =========================================================================== + +function showPlayerLoginFailedGUI(client, errorMessage) { + logToConsole(LOG_DEBUG, `[VRR.Client] Sending login failed GUI signal to ${getPlayerDisplayForConsole(client)}`); + sendNetworkEventToPlayer("vrr.loginFailed", client, errorMessage); +} + +// =========================================================================== + +function showPlayerRegistrationSuccessGUI(client) { + logToConsole(LOG_DEBUG, `[VRR.Client] Sending registration success GUI signal to ${getPlayerDisplayForConsole(client)}`); + sendNetworkEventToPlayer("vrr.registrationSuccess", client); +} + +// =========================================================================== + +function showPlayerRegistrationFailedGUI(client, errorMessage) { + logToConsole(LOG_DEBUG, `[VRR.Client] Sending registration failed GUI signal to ${getPlayerDisplayForConsole(client)}`); + sendNetworkEventToPlayer("vrr.registrationFailed", client, errorMessage); +} + +// =========================================================================== + +function sendPlayerGUIColours(client) { + logToConsole(LOG_DEBUG, `[VRR.Client] Sending GUI colours to ${getPlayerDisplayForConsole(client)}`); + 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)}`); + sendNetworkEventToPlayer("vrr.guiInit", client); +} + +// =========================================================================== + +function showPlayerLoginGUI(client, errorMessage = "") { + logToConsole(LOG_DEBUG, `[VRR.Client] Sending show login GUI signal to ${getPlayerDisplayForConsole(client)}`); + sendNetworkEventToPlayer("vrr.showLogin", client); +} + +// =========================================================================== + +function showPlayerRegistrationGUI(client, errorMessage = "") { + logToConsole(LOG_DEBUG, `[VRR.Client] Sending show registration GUI signal to ${getPlayerDisplayForConsole(client)}`); + sendNetworkEventToPlayer("vrr.showRegistration", client); +} + +// =========================================================================== + +function showPlayerNewCharacterGUI(client) { + logToConsole(LOG_DEBUG, `[VRR.Client] Sending show new character GUI signal to ${getPlayerDisplayForConsole(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, errorMessage); +} + +// =========================================================================== + +function showPlayerResetPasswordCodeInputGUI(client) { + logToConsole(LOG_DEBUG, `[VRR.Client] Sending show reset password code input GUI signal to ${getPlayerDisplayForConsole(client)}`); + sendNetworkEventToPlayer("vrr.showResetPasswordCodeInput", client); +} + +// =========================================================================== + +function showPlayerResetPasswordEmailInputGUI(client) { + logToConsole(LOG_DEBUG, `[VRR.Client] Sending show reset password email input GUI signal to ${getPlayerDisplayForConsole(client)}`); + sendNetworkEventToPlayer("vrr.showResetPasswordEmailInput", client); +} + +// =========================================================================== + +function showPlayerCharacterSelectGUI(client, firstName, lastName, cash, clan, lastPlayed, skin) { + logToConsole(LOG_DEBUG, `[VRR.Client] Sending character select GUI signal to ${getPlayerDisplayForConsole(client)}`); + 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)}`); + 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)}`); + sendNetworkEventToPlayer("vrr.characterSelectSuccess", client); +} + +// =========================================================================== + +function showPlayerCharacterSelectFailedGUI(client) { + logToConsole(LOG_DEBUG, `[VRR.Client] Sending character select failed GUI signal to ${getPlayerDisplayForConsole(client)}`); + sendNetworkEventToPlayer("vrr.characterSelectFailed", client); +} + +// =========================================================================== + +function showPlayerPromptGUI(client, promptMessage, promptTitle, yesButtonText = "Yes", noButtonText = "No") { + logToConsole(LOG_DEBUG, `[VRR.Client] Sending show prompt GUI signal to ${getPlayerDisplayForConsole(client)} (Title: ${promptTitle}, Message: ${promptMessage}, YesButton: ${yesButtonText}, NoButton: ${noButtonText})`); + sendNetworkEventToPlayer("vrr.showPrompt", client, promptMessage, promptTitle, yesButtonText, noButtonText); +} + +// =========================================================================== + +function showPlayerInfoGUI(client, infoMessage, infoTitle, buttonText = "OK") { + logToConsole(LOG_DEBUG, `[VRR.Client] Sending show info GUI signal to ${getPlayerDisplayForConsole(client)} (Title: ${infoTitle}, Message: ${infoMessage})`); + sendNetworkEventToPlayer("vrr.showInfo", client, infoMessage, infoTitle, buttonText); +} + +// =========================================================================== + +function showPlayerErrorGUI(client, errorMessage, errorTitle, buttonText = "OK") { + logToConsole(LOG_DEBUG, `[VRR.Client] Sending show error GUI signal to ${getPlayerDisplayForConsole(client)} (Title: ${errorTitle}, Message: ${errorMessage})`); + sendNetworkEventToPlayer("vrr.showError", client, errorMessage, errorTitle, buttonText); +} + +// =========================================================================== + +function sendRunCodeToClient(client, code, returnTo) { + logToConsole(LOG_DEBUG, `[VRR.Client] Sending runcode to ${getPlayerDisplayForConsole(client)} (returnTo: ${getPlayerDisplayForConsole(getClientFromIndex(returnTo))}, Code: ${code})`); + sendNetworkEventToPlayer("vrr.runCode", client, code, getPlayerId(returnTo)); +} + +// =========================================================================== + +function sendPlayerWorkingState(client, state) { + logToConsole(LOG_DEBUG, `[VRR.Client] Sending working state (${toUpperCase(getYesNoFromBool(state))}) to ${getPlayerDisplayForConsole(client)}`); + sendNetworkEventToPlayer("vrr.working", client, state); +} + +// =========================================================================== + +function sendPlayerJobType(client, jobType) { + logToConsole(LOG_DEBUG, `[VRR.Client] Sending job type (${jobType}) to ${getPlayerDisplayForConsole(client)}`); + sendNetworkEventToPlayer("vrr.jobType", client, jobType); +} + +// =========================================================================== + +function sendPlayerStopJobRoute(client) { + logToConsole(LOG_DEBUG, `[VRR.Client] Sending signal to abort job route to ${getPlayerDisplayForConsole(client)}`); + sendNetworkEventToPlayer("vrr.hideJobRouteLocation", client); +} + +// =========================================================================== + +function sendPlayerMouseCameraToggle(client) { + logToConsole(LOG_DEBUG, `[VRR.Client] Sending signal to toggle mouse camera ${getPlayerDisplayForConsole(client)}`); + sendNetworkEventToPlayer("vrr.mouseCamera", client); +} + +// =========================================================================== + +function setPlayerMouseCameraState(client, state) { + logToConsole(LOG_DEBUG, `[VRR.Client] Sending signal to toggle mouse camera ${getPlayerDisplayForConsole(client)}`); + sendNetworkEventToPlayer("vrr.mouseCameraForce", client, state); +} + +// =========================================================================== + +function sendPlayerMouseCursorToggle(client) { + logToConsole(LOG_DEBUG, `[VRR.Client] Sending signal to toggle mouse cursor ${getPlayerDisplayForConsole(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"})`); + 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"})`); + sendNetworkEventToPlayer("vrr.clearKeyBinds", client); +} + +// =========================================================================== + +function sendRemoveAccountKeyBindToClient(client, key) { + logToConsole(LOG_DEBUG, `[VRR.Client] Sending deleted keybind to ${getPlayerDisplayForConsole(client)} (Key: ${toUpperCase(getKeyNameFromId(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})`); + sendNetworkEventToPlayer("vrr.position", client, position); +} + +// =========================================================================== + +function sendPlayerSetHeading(client, heading) { + logToConsole(LOG_DEBUG, `[VRR.Client] Sending set heading signal to ${getPlayerDisplayForConsole(client)} (Heading: ${heading})`); + sendNetworkEventToPlayer("vrr.heading", client, heading); +} + +// =========================================================================== + +function sendPlayerSetInterior(client, interior) { + logToConsole(LOG_DEBUG, `[VRR.Client] Sending set interior signal to ${getPlayerDisplayForConsole(client)} (Interior: ${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))})`); + sendNetworkEventToPlayer("vrr.frozen", client, state); +} + +// =========================================================================== + +function clearPlayerWeapons(client, clearData = true) { + logToConsole(LOG_DEBUG, `[VRR.Client] Sending signal to ${getPlayerDisplayForConsole(client)} to clear weapons`); + sendNetworkEventToPlayer("vrr.clearWeapons", client, clearData); +} + +// =========================================================================== + +function showPlayerNewCharacterFailedGUI(client, errorMessage) { + logToConsole(LOG_DEBUG, `[VRR.Client] Sending new character failed GUI signal to ${getPlayerDisplayForConsole(client)}`); + sendNetworkEventToPlayer("vrr.newCharacterFailed", client, errorMessage); +} + +// =========================================================================== + +function sendPlayerRemoveFromVehicle(client) { + logToConsole(LOG_DEBUG, `[VRR.Client] Sending remove from vehicle signal to ${getPlayerDisplayForConsole(client)}`); + sendNetworkEventToPlayer("vrr.removeFromVehicle", client); +} + +// =========================================================================== + +function sendChatBoxMessageToPlayer(client, messageText, colour) { + //messageClient(messageText, client, colour); + sendNetworkEventToPlayer("m", client, messageText, colour); +} + +// =========================================================================== + +function showPlayerItemTakeDelay(client, itemId) { + if (getItemData(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)`); + sendNetworkEventToPlayer("vrr.showItemActionDelay", client, delay); + } else { + logToConsole(LOG_DEBUG, `[VRR.Client] Showing item TAKE delay to ${getPlayerDisplayForConsole(client)} (instant)`); + playerItemActionDelayComplete(client); + } + } +} + +// =========================================================================== + +function showPlayerItemUseDelay(client, itemSlot) { + if (getItemData(getPlayerData(client).hotBarItems[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)`); + sendNetworkEventToPlayer("vrr.showItemActionDelay", client, delay); + } else { + logToConsole(LOG_DEBUG, `[VRR.Client] Showing item USE delay to ${getPlayerDisplayForConsole(client)} (instant)`); + playerItemActionDelayComplete(client); + } + } +} + +// =========================================================================== + +function showPlayerItemDropDelay(client, itemSlot) { + if (getItemData(getPlayerData(client).hotBarItems[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)`); + sendNetworkEventToPlayer("vrr.showItemActionDelay", client, delay); + } else { + logToConsole(LOG_DEBUG, `[VRR.Client] Showing item DROP delay to ${getPlayerDisplayForConsole(client)} (instant)`); + playerItemActionDelayComplete(client); + } + } +} + +// =========================================================================== + +function showPlayerItemPickupDelay(client, itemId) { + if (getItemData(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)`); + sendNetworkEventToPlayer("vrr.showItemActionDelay", client, delay); + } else { + logToConsole(LOG_DEBUG, `[VRR.Client] Showing item PICKUP delay to ${getPlayerDisplayForConsole(client)} (instant)`); + playerItemActionDelayComplete(client); + } + } +} + +// =========================================================================== + +function showPlayerItemPutDelay(client, itemSlot) { + if (getItemData(getPlayerData(client).hotBarItems[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)`); + sendNetworkEventToPlayer("vrr.showItemActionDelay", client, delay); + } else { + logToConsole(LOG_DEBUG, `[VRR.Client] Showing item PUT delay to ${getPlayerDisplayForConsole(client)} (instant)`); + playerItemActionDelayComplete(client); + } + } +} + +// =========================================================================== + +function showPlayerItemSwitchDelay(client, itemSlot) { + if (itemSlot != -1) { + if (getPlayerData(client).hotBarItems[itemSlot] != -1) { + 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)`); + sendNetworkEventToPlayer("vrr.showItemActionDelay", client, delay); + } else { + logToConsole(LOG_DEBUG, `[VRR.Client] Showing item switch delay to ${getPlayerDisplayForConsole(client)} (instant)`); + playerItemActionDelayComplete(client); + } + } else { + logToConsole(LOG_DEBUG, `[VRR.Client] Showing item switch delay to ${getPlayerDisplayForConsole(client)} (instant)`); + playerItemActionDelayComplete(client); + } + } else { + logToConsole(LOG_DEBUG, `[VRR.Client] Showing item switch delay to ${getPlayerDisplayForConsole(client)} (instant)`); + playerSwitchItem(client, itemSlot); + } +} + +// =========================================================================== + +function sendPlayerDrunkEffect(client, amount, duration) { + logToConsole(LOG_DEBUG, `[VRR.Client] Setting drunk effect for ${getPlayerDisplayForConsole(client)} to ${amount} for ${duration} milliseconds`); + sendNetworkEventToPlayer("vrr.drunkEffect", client, amount, duration); +} + +// =========================================================================== + +function sendPlayerClearPedState(client) { + logToConsole(LOG_DEBUG, `[VRR.Client] Clearing ped state for ${getPlayerDisplayForConsole(client)}`); + sendNetworkEventToPlayer("vrr.clearPedState", client); +} + +// =========================================================================== + +function playerDamagedByPlayer(client, damagerEntityName, weaponId, pedPiece, healthLoss) { + let damagerEntity = getPlayerFromParams(damagerEntityName); + + if (isNull(damagerEntity)) { + logToConsole(LOG_DEBUG, `[VRR.Client] ${getPlayerDisplayForConsole(client)}'s damager entity from ID is null`); + return false; + } + + logToConsole(LOG_DEBUG, `[VRR.Client] ${getPlayerDisplayForConsole(client)} was damaged by ${damagerEntity}`); + + if (isNull(damagerEntity)) { + logToConsole(LOG_DEBUG, `[VRR.Client] ${getPlayerDisplayForConsole(client)}'s damager client is INVALID`); + return false; + } + + if (!getPlayerData(damagerEntity) || !getPlayerData(client)) { + logToConsole(LOG_DEBUG, `[VRR.Client] ${getPlayerDisplayForConsole(client)}'s damager's client data is INVALID`); + return false; + } + + logToConsole(LOG_DEBUG, `[VRR.Client] ${getPlayerDisplayForConsole(client)}'s damager is ${getPlayerDisplayForConsole(damagerEntity)}`); + + switch (getPlayerData(damagerEntity).weaponDamageEvent) { + case VRR_WEAPON_DAMAGE_EVENT_TAZER: + logToConsole(LOG_DEBUG, `[VRR.Client] ${getPlayerDisplayForConsole(client)}'s damager ${getPlayerDisplayForConsole(damagerEntity)} is using a tazer`); + if (!isPlayerTazed(client) && !isPlayerHandCuffed(client) && !isPlayerInAnyVehicle(client)) { + logToConsole(LOG_DEBUG, `[VRR.Client] ${getPlayerDisplayForConsole(client)} was not previously tazed, binded, or in a vehicle. Taze successful`); + meActionToNearbyPlayers(damagerEntity, `electrifies ${getCharacterFullName(client)} with their tazer`); + tazePlayer(client); + } + break; + + case VRR_WEAPON_DAMAGE_EVENT_EXTINGUISH: + break; + + case VRR_WEAPON_DAMAGE_EVENT_MACE: + break; + + case VRR_WEAPON_DAMAGE_EVENT_NORMAL: + logToConsole(LOG_DEBUG, `[VRR.Client] ${getPlayerDisplayForConsole(client)}'s damager ${getPlayerDisplayForConsole(damagerEntity)} caused ${healthLoss} damage (damage reduction makes it ${(healthLoss * getPlayerData(client).incomingDamageMultiplier)})`); + setPlayerHealth(client, getPlayerHealth(client) - (healthLoss * getPlayerData(client).incomingDamageMultiplier)); + break; + + default: + logToConsole(LOG_DEBUG, `[VRR.Client] ${getPlayerDisplayForConsole(client)}'s damager ${getPlayerDisplayForConsole(damagerEntity)} caused ${healthLoss} damage (damage reduction makes it ${(healthLoss * getPlayerData(client).incomingDamageMultiplier)})`); + setPlayerHealth(client, getPlayerHealth(client) - (healthLoss * getPlayerData(client).incomingDamageMultiplier)); + break; + } +} + +// =========================================================================== + +function setPlayerCameraLookAt(client, cameraPosition, lookAtPosition) { + sendNetworkEventToPlayer("vrr.cameraLookAt", client, cameraPosition, lookAtPosition); +} + +// =========================================================================== + +function sendTimeMinuteDurationToPlayer(client, minuteDuration) { + sendNetworkEventToPlayer("vrr.minuteDuration", client, minuteDuration); +} + +// =========================================================================== + +function updatePositionInPlayerData(client, position) { + getPlayerData(client).syncPosition = position; +} + +// =========================================================================== + +function updateHeadingInPlayerData(client, heading) { + getPlayerData(client).syncHeading = heading; +} + +// =========================================================================== + +function updatePositionInVehicleData(client, vehicle, position) { + getVehicleData(vehicle).syncPosition = position; +} + +// =========================================================================== + +function updateHeadingInVehicleData(client, vehicle, heading) { + getVehicleData(vehicle).syncHeading = heading; +} + +// =========================================================================== + +function forcePlayerIntoSkinSelect(client) { + if (typeof getGameConfig().skinChangePosition[getGame()] != "undefined") { + getPlayerData(client).returnToPosition = getPlayerPosition(client); + getPlayerData(client).returnToHeading = getPlayerHeading(client); + getPlayerData(client).returnToInterior = getPlayerInterior(client); + getPlayerData(client).returnToDimension = getPlayerDimension(client); + getPlayerData(client).returnToType = VRR_RETURNTO_TYPE_SKINSELECT; + + setPlayerPosition(client, getGameConfig().skinChangePosition[getGame()][0]); + setPlayerHeading(client, getGameConfig().skinChangePosition[getGame()][1]); + setPlayerInterior(client, getGameConfig().skinChangePosition[getGame()][2]); + setPlayerDimension(client, getPlayerId(client) + 500); + } + + sendNetworkEventToPlayer("vrr.skinSelect", client, true); +} + +// =========================================================================== + +function updatePlayerCash(client) { + sendNetworkEventToPlayer("vrr.money", client, getPlayerCurrentSubAccount(client).cash); +} + +// =========================================================================== + +function sendAllPoliceStationBlips(client) { + if (getGameConfig().blipSprites[getGame()].policeStation != -1) { + let tempBlips = []; + for (let i in getServerData().policeStations[getGame()]) { + tempBlips.push([ + getGameConfig().blipSprites[getGame()].policeStation, + getServerData().policeStations[getGame()][i].position.x, + getServerData().policeStations[getGame()][i].position.y, + getServerData().policeStations[getGame()][i].position.z, + 3, + getColourByName("policeBlue"), + ]); + } + sendNetworkEventToPlayer("vrr.blips", client, tempBlips); + } +} + +// =========================================================================== + +function sendAllFireStationBlips(client) { + if (getGameConfig().blipSprites[getGame()].fireStation != -1) { + let tempBlips = []; + for (let i in getServerData().fireStations[getGame()]) { + tempBlips.push([ + getGameConfig().blipSprites[getGame()].fireStation, + getServerData().fireStations[getGame()][i].position.x, + getServerData().fireStations[getGame()][i].position.y, + getServerData().fireStations[getGame()][i].position.z, + 3, + getColourByName("firefighterRed"), + ]); + } + sendNetworkEventToPlayer("vrr.blips", client, tempBlips); + } +} + +// =========================================================================== + +function sendAllHospitalBlips(client) { + if (getGameConfig().blipSprites[getGame()].hospital != -1) { + let tempBlips = []; + for (let i in getServerData().hospitals[getGame()]) { + tempBlips.push([ + getGameConfig().blipSprites[getGame()].hospital, + getServerData().hospitals[getGame()][i].position.x, + getServerData().hospitals[getGame()][i].position.y, + getServerData().hospitals[getGame()][i].position.z, + 3, + getColourByName("medicPink"), + ]); + } + sendNetworkEventToPlayer("vrr.blips", client, tempBlips); + } +} + +// =========================================================================== + +function sendAllAmmunationBlips(client) { + if (getGameConfig().blipSprites[getGame()].ammunation != -1) { + let tempBlips = []; + for (let i in getServerData().ammunations[getGame()]) { + tempBlips.push([ + getGameConfig().blipSprites[getGame()].ammunation, + getServerData().ammunations[getGame()][i].position.x, + getServerData().ammunations[getGame()][i].position.y, + getServerData().ammunations[getGame()][i].position.z, + 3, + 0 + ]); + } + sendNetworkEventToPlayer("vrr.blips", client, tempBlips); + } +} + +// =========================================================================== + +function sendAllPayAndSprayBlips(client) { + if (getGameConfig().blipSprites[getGame()].payAndSpray != -1) { + let tempBlips = []; + for (let i in getServerData().payAndSprays[getGame()]) { + tempBlips.push([ + getGameConfig().blipSprites[getGame()].payAndSpray, + getServerData().payAndSprays[getGame()][i].position.x, + getServerData().payAndSprays[getGame()][i].position.y, + getServerData().payAndSprays[getGame()][i].position.z, + 3, + 0 + ]); + } + sendNetworkEventToPlayer("vrr.blips", client, tempBlips); + } +} + +// =========================================================================== + +function sendAllFuelStationBlips(client) { + if (getGameConfig().blipSprites[getGame()].fuelStation != -1) { + let tempBlips = []; + for (let i in getServerData().fuelStations[getGame()]) { + tempBlips.push([ + getGameConfig().blipSprites[getGame()].fuelStation, + getServerData().fuelStations[getGame()][i].position.x, + getServerData().fuelStations[getGame()][i].position.y, + getServerData().fuelStations[getGame()][i].position.z, + 3, + getColourByName("burntOrange"), + ]); + } + sendNetworkEventToPlayer("vrr.blips", client, tempBlips); + } +} + +// =========================================================================== + +function sendPlayerSetHealth(client, health) { + sendNetworkEventToPlayer("vrr.health", client, toInteger(health)); +} + +// =========================================================================== + +function sendPlayerSetArmour(client, armour) { + sendNetworkEventToPlayer("vrr.armour", client, armour); +} + +// =========================================================================== + +function playerFinishedSkinSelection(client, allowedSkinIndex) { + sendNetworkEventToPlayer("vrr.skinSelect", client, false); + if (allowedSkinIndex == -1) { + messagePlayerAlert(client, "You canceled the skin change."); + restorePlayerCamera(client); + + if (getPlayerData(client).returnToPosition != null && getPlayerData(client).returnToType == VRR_RETURNTO_TYPE_SKINSELECT) { + setPlayerPosition(client, getPlayerData(client).returnToPosition); + setPlayerHeading(client, getPlayerData(client).returnToHeading); + setPlayerInterior(client, getPlayerData(client).returnToInterior); + setPlayerDimension(client, getPlayerData(client).returnToDimension); + + getPlayerData(client).returnToPosition = null; + getPlayerData(client).returnToHeading = null; + getPlayerData(client).returnToInterior = null; + getPlayerData(client).returnToDimension = null; + } + return false; + } else { + getPlayerCurrentSubAccount(client).skin = getSkinIndexFromModel(getServerData().allowedSkins[allowedSkinIndex][0]); + if (isPlayerWorking(client)) { + messagePlayerAlert(client, "Your new skin has been saved but won't be shown until you stop working."); + setPlayerSkin(client, getJobData(getPlayerCurrentSubAccount(client).job).uniforms[getPlayerData(client).jobUniform].skinId); + } else { + setPlayerSkin(client, getPlayerCurrentSubAccount(client).skin); + } + + if (getPlayerData(client).returnToPosition != null && getPlayerData(client).returnToType == VRR_RETURNTO_TYPE_SKINSELECT) { + setPlayerPosition(client, getPlayerData(client).returnToPosition); + setPlayerHeading(client, getPlayerData(client).returnToHeading); + setPlayerInterior(client, getPlayerData(client).returnToInterior); + setPlayerDimension(client, getPlayerData(client).returnToDimension); + + getPlayerData(client).returnToPosition = null; + getPlayerData(client).returnToHeading = null; + getPlayerData(client).returnToInterior = null; + getPlayerData(client).returnToDimension = null; + } + + restorePlayerCamera(client); + setPlayerControlState(client, true); + + deleteItem(getPlayerData(client).itemActionItem); + switchPlayerActiveHotBarSlot(client, -1); + cachePlayerHotBarItems(client); + + meActionToNearbyPlayers(client, `changes their skin to ${getServerData().allowedSkins[allowedSkinIndex][1]}`); + } +} + +// =========================================================================== + +function sendPlayerChatScrollLines(client, amount) { + sendNetworkEventToPlayer("vrr.chatScrollLines", client, amount); +} + +// =========================================================================== + +function sendPlayerChatAutoHideDelay(client, delay) { + sendNetworkEventToPlayer("vrr.chatAutoHideDelay", client, delay); +} + +// =========================================================================== + +function playRadioStreamForPlayer(client, streamURL, loop = true, volume = 0, element = false) { + logToConsole(LOG_DEBUG, `[VRR.Client] Forcing ${getPlayerDisplayForConsole(client)} to stream ${streamURL}`); + 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}`); + sendNetworkEventToPlayer("vrr.audioFileStream", client, audioName, loop, volume); +} + +// =========================================================================== + +function stopRadioStreamForPlayer(client) { + logToConsole(LOG_DEBUG, `[VRR.Client] Forcing ${getPlayerDisplayForConsole(client)} to stop their radio stream`); + sendNetworkEventToPlayer("vrr.stopRadioStream", client); +} + +// =========================================================================== + +function setPlayerStreamingRadioVolume(client, volumeLevel, elementId = false) { + getPlayerData(client).accountData.streamingRadioVolume = volumeLevel; + getPlayerData(client).streamingRadioElement = elementId; + sendNetworkEventToPlayer("vrr.radioVolume", client, volumeLevel, elementId); +} + +// =========================================================================== + +function setVehicleLightsState(vehicle, state) { + setEntityData(vehicle, "vrr.lights", getVehicleData(vehicle).lights); + sendNetworkEventToPlayer("vrr.veh.lights", null, vehicle.id, state); +} + +// =========================================================================== + +function sendPlayerEnterPropertyKey(client, key) { + sendNetworkEventToPlayer("vrr.enterPropertyKey", client, key); +} + +// =========================================================================== + +function makePedPlayAnimation(ped, animationSlot, positionOffset) { + setEntityData(ped, "vrr.anim", animationSlot, true); + sendNetworkEventToPlayer("vrr.anim", null, getPedForNetworkEvent(ped), animationSlot, positionOffset); +} + +// =========================================================================== + +function makePedStopAnimation(ped) { + removeEntityData(ped, "vrr.anim"); + sendNetworkEventToPlayer("vrr.stopAnim", null, getPedForNetworkEvent(ped)); +} + +// =========================================================================== + +function forcePedAnimation(ped, animationSlot, positionOffset = 0) { + addEntityData(ped, "vrr.anim", animationSlot, true); + sendNetworkEventToPlayer("vrr.forceAnim", null, getPedForNetworkEvent(ped), animationSlot, positionOffset); +} + +// =========================================================================== + +function hideAllPlayerGUI(client) { + sendNetworkEventToPlayer("vrr.hideAllGUI", client); +} + +// =========================================================================== + +function requestClientInfo(client) { + sendNetworkEventToPlayer("vrr.clientInfo", client); +} + +// =========================================================================== + +function updateInteriorLightsForPlayer(client, state) { + sendNetworkEventToPlayer("vrr.interiorLights", client, state); +} + +// =========================================================================== + +function forcePlayerToSyncElementProperties(client, element) { + sendNetworkEventToPlayer("vrr.syncElement", client, element.id); +} + +// =========================================================================== + +function sendPlayerPedPartsAndProps(client) { + let bodyParts = getPlayerCurrentSubAccount(client).bodyParts; + let bodyProps = getPlayerCurrentSubAccount(client).bodyProps; + + sendNetworkEventToPlayer("vrr.ped", client, [bodyParts.hair, bodyParts.head, bodyParts.upper, bodyParts.lower], [bodyProps.hair, bodyProps.eyes, bodyProps.head, bodyProps.leftHand, bodyProps.rightHand, bodyProps.leftWrist, bodyProps.rightWrist, bodyParts.hip, bodyProps.leftFoot, bodyProps.rightFoot]); +} + +// =========================================================================== + +function onPlayerNearPickup(client, pickupId) { + getPlayerData(client).currentPickup = getElementFromId(pickupId); +} + +// =========================================================================== + +function updateAllInteriorVehiclesForPlayer(client, interior, dimension) { + for (let i in getServerData().vehicles) { + if (getServerData().vehicles[i].vehicle != false) { + if (getServerData().vehicles[i].interior == interior && getServerData().vehicles[i].dimension == dimension) { + forcePlayerToSyncElementProperties(client, getServerData().vehicles[i].vehicle); + } + } + } +} + +// =========================================================================== + +function setPlayerBuyingVehicleState(client, state, vehicleId, position) { + if (getGlobalConfig().useServerSideVehiclePurchaseCheck == false) { + sendNetworkEventToPlayer("vrr.vehBuyState", client, state, vehicleId, position); + } +} + +// ========================================================================== + +function receiveVehiclePurchaseStateUpdateFromClient(client, state) { + if (getGlobalConfig().useServerSideVehiclePurchaseCheck == false) { + checkVehiclePurchasing(client); + } +} + +// =========================================================================== + +function sendPlayerLogLevel(client, tempLogLevel = logLevel) { + sendNetworkEventToPlayer("vrr.logLevel", client, tempLogLevel); +} + +// ========================================================================== + +function setPlayerInfiniteRun(client, state) { + sendNetworkEventToPlayer("vrr.infiniteRun", client, state); +} + +// ========================================================================== + +function sendBusinessToPlayer(client, businessId, name, entrancePosition, blipModel, pickupModel, hasInterior, hasItems) { + sendNetworkEventToPlayer("vrr.business", client, businessId, name, entrancePosition, blipModel, pickupModel, hasInterior, hasItems); +} + +// ========================================================================== + +function sendHouseToPlayer(client, houseId, description, entrancePosition, blipModel, pickupModel, hasInterior) { + sendNetworkEventToPlayer("vrr.house", client, houseId, description, entrancePosition, blipModel, pickupModel, hasInterior); +} + +// ========================================================================== + +function sendJobToPlayer(client, jobId, jobLocationId, name, position) { + sendNetworkEventToPlayer("vrr.job", client, jobId, jobLocationId, name, position); +} + +// ========================================================================== + +function sendVehicleToPlayer(client, vehicleId, model, position, heading, colour1, colour2, colour3, colour4) { + sendNetworkEventToPlayer("vrr.vehicle", client, vehicleId, model, position, heading, colour1, colour2, colour3, colour4); +} + +// ========================================================================== + +function sendAllBusinessesToPlayer(client) { + let businesses = getServerData().businesses; + for (let i in businesses) { + sendBusinessToPlayer(client, businesses[i].index, businesses[i].name, businesses[i].entrancePosition, businesses[i].entranceBlipModel, businesses[i].entrancePickupModel, businesses[i].hasInterior, false); + } +} + +// ========================================================================== + +function sendAllHousesToPlayer(client) { + let houses = getServerData().houses; + for (let i in houses) { + sendHouseToPlayer(client, houses[i].index, houses[i].entrancePosition, houses[i].entranceBlipModel, houses[i].entrancePickupModel, houses[i].hasInterior); + } +} + +// ========================================================================== + +function sendAllJobsToPlayer(client) { + let jobs = getServerData().jobs; + for (let i in jobs) { + for (let j in jobs[i].locations) { + sendJobToPlayer(client, jobs[i].index, jobs[i].locations[j].index, jobs[i].name, jobs[i].locations[j].position, jobs[i].blipModel); + } + } +} + +// ========================================================================== + +function sendAllVehiclesToPlayer(client) { + let vehicles = getServerData().vehicles; + for (let i in vehicles) { + sendVehicleToPlayer(client, vehicles[i].index, vehicles[i].model, vehicles[i].syncPosition, vehicles[i].syncHeading, vehicles[i].colour1, vehicles[i].colour2, vehicles[i].colour3, vehicles[i].colour4); + } +} + +// ========================================================================== + +function makePlayerHoldObjectModel(client, modelIndex) { + sendNetworkEventToPlayer("vrr.holdObject", client, getPlayerData(client).ped, modelIndex); +} + +// ========================================================================== + +function receivePlayerPedNetworkId(client, pedId) { + getPlayerData(client).ped = pedId; +} + +// ========================================================================== + +function requestPlayerPedNetworkId(client) { + sendNetworkEventToPlayer("vrr.playerPedId", client); +} + +// ========================================================================== + +function setPlayerInCutsceneInterior(client, cutsceneName) { + getPlayerData(client).interiorCutscene = cutsceneName; + sendNetworkEventToPlayer("vrr.cutsceneInterior", client, cutsceneName); +} + +// ========================================================================== + +function makePlayerPedSpeak(client, pedSpeechName) { + sendNetworkEventToPlayer("vrr.pedSpeak", client, pedSpeechName); +} + +// ========================================================================== + +function setPlayerAsCopState(client, state) { + sendNetworkEventToPlayer("vrr.playerCop", client, state); +} + +// ========================================================================== + +function tellPlayerToSpawn(client, skinId, position) { + sendNetworkEventToPlayer("vrr.spawn", client, skinId, position); +} + +// ========================================================================== + +function sendNameTagDistanceToClient(client, distance) { + sendNetworkEventToPlayer("vrr.nameTagDistance", client, distance); +} + +// ========================================================================== + +function sendGPSBlipToPlayer(client, position, colour) { + sendNetworkEventToPlayer("vrr.showGPSBlip", client, position, colour); +} + +// ========================================================================== + +function playerSelectedNewLocale(client, localeId) { + getPlayerData(client).locale = localeId; + sendPlayerLocaleId(client, localeId); +} + +// ========================================================================== + +function sendPlayerLocaleId(client, localeId) { + sendNetworkEventToPlayer("vrr.locale", client, localeId); +} + +// ========================================================================== + +function showLocaleChooserForPlayer(client) { + sendNetworkEventToPlayer("vrr.localeChooser", client); +} + +// ========================================================================== + +function sendPlayerLocaleStrings(client) { + let strings = getGlobalConfig().locale.sendStringsToClient; + for (let i in strings) { + sendNetworkEventToPlayer("vrr.localeString", client, strings[i], getLocaleString(client, strings[i])); + } +} + +// ========================================================================== \ No newline at end of file