diff --git a/scripts/server/config.js b/scripts/server/config.js index e092df92..a7cb17a3 100644 --- a/scripts/server/config.js +++ b/scripts/server/config.js @@ -119,7 +119,7 @@ function loadServerConfigFromGameAndPort(gameId, port, mpMod) { if(dbQuery) { if(dbQuery.numRows > 0) { let dbAssoc = fetchQueryAssoc(dbQuery); - let tempServerConfigData = new ServerConfigData(dbAssoc); + let tempServerConfigData = new ServerData(dbAssoc); freeDatabaseQuery(dbQuery); return tempServerConfigData; } @@ -139,7 +139,7 @@ function loadServerConfigFromId(tempServerId) { if(dbQuery) { if(dbQuery.numRows > 0) { let dbAssoc = fetchQueryAssoc(dbQuery); - let tempServerConfigData = new ServerConfigData(dbAssoc); + let tempServerConfigData = new ServerData(dbAssoc); freeDatabaseQuery(dbQuery); return tempServerConfigData; } @@ -157,7 +157,7 @@ function applyConfigToServer(tempServerConfig) { } if(isWeatherSupported()) { - gta.forceWeather(tempServerConfig.weather); + game.forceWeather(tempServerConfig.weather); } updateServerRules(); @@ -299,8 +299,8 @@ function setTimeCommand(command, params, client) { getServerConfig().hour = hour; getServerConfig().minute = minute; - gta.time.hour = getServerConfig().hour; - gta.time.minute = getServerConfig().minute; + game.time.hour = getServerConfig().hour; + game.time.minute = getServerConfig().minute; //checkServerGameTime(); @@ -363,7 +363,7 @@ function setWeatherCommand(command, params, client) { return false; } - gta.forceWeather(toInteger(weatherId)); + game.forceWeather(toInteger(weatherId)); getServerConfig().weather = weatherId; getServerConfig().needsSaved = true; diff --git a/scripts/server/core.js b/scripts/server/core.js index fad27f82..08565413 100644 --- a/scripts/server/core.js +++ b/scripts/server/core.js @@ -34,6 +34,11 @@ let serverData = { // =========================================================================== +// Pre-cache allowed skins +let allowedSkins = getAllowedSkins(getGame()); + +// =========================================================================== + function initServerData() { // Pre-allocate translation cache language slots //getServerData().translation.cache = new Array(getServerData().translation.languages.length); diff --git a/scripts/server/event.js b/scripts/server/event.js index 5d1979ac..9fc62da8 100644 --- a/scripts/server/event.js +++ b/scripts/server/event.js @@ -32,6 +32,9 @@ function addAllEventHandlers() { addEventHandler("onPedEnterVehicle", onPedEnteringVehicle); addEventHandler("onPedExitVehicle", onPedExitingVehicle); + addEventHandler("onPedEnteringVehicle", onPedEnteringVehicle); + addEventHandler("onPedExitingVehicle", onPedExitingVehicle); + addEventHandler("OnPlayerCommand", onPlayerCommand); } @@ -48,6 +51,8 @@ function onPlayerConnect(event, ipAddress, port) { // =========================================================================== function onPlayerJoin(event, client) { + logToConsole(LOG_DEBUG, `[VRR.Event] Client ${client.name}[${client.index}] joining from ${ipAddress}`); + if(isFadeCameraSupported()) { fadeCamera(client, true, 1.0); } @@ -72,7 +77,7 @@ function onElementStreamIn(event, element, client) { // =========================================================================== function onPlayerQuit(event, client, quitReasonId) { - logToConsole(LOG_DEBUG, `👋 ${getPlayerDisplayForConsole(client)} disconnected (${disconnectReasons[quitReasonId]}[${quitReasonId}])`); + logToConsole(LOG_DEBUG, `👋 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")); @@ -82,6 +87,8 @@ function onPlayerQuit(event, client, quitReasonId) { } messageDiscordEventChannel(`👋 ${getPlayerDisplayForConsole(client)} has left the server.`); + + clearTemporaryVehicles(); } // =========================================================================== @@ -381,7 +388,7 @@ function onPlayerDeath(client, position) { client.despawnPlayer(); getPlayerCurrentSubAccount(client).interior = closestJail.interior; getPlayerCurrentSubAccount(client).dimension = closestJail.dimension; - if(getServerGame() == GAME_GTA_IV) { + if(getServerGame() == VRR_GAME_GTA_IV) { spawnPlayer(client, closestJail.position, closestJail.heading, getPlayerCurrentSubAccount(client).skin); } else { spawnPlayer(client, closestJail.position, closestJail.heading, getPlayerCurrentSubAccount(client).skin); @@ -396,7 +403,7 @@ function onPlayerDeath(client, position) { client.despawnPlayer(); getPlayerCurrentSubAccount(client).interior = closestHospital.interior; getPlayerCurrentSubAccount(client).dimension = closestHospital.dimension; - if(getServerGame() == GAME_GTA_IV) { + if(getServerGame() == VRR_GAME_GTA_IV) { spawnPlayer(client, closestHospital.position, closestHospital.heading, getPlayerCurrentSubAccount(client).skin); } else { spawnPlayer(client, closestHospital.position, closestHospital.heading, getPlayerCurrentSubAccount(client).skin); @@ -455,7 +462,7 @@ function onPlayerSpawn(client) { logToConsole(LOG_DEBUG, `[VRR.Event] ${getPlayerDisplayForConsole(client)}'s player data is valid. Continuing spawn processing ...`); - if(getServerGame() == GAME_GTA_IV) { + if(getServerGame() == VRR_GAME_GTA_IV) { logToConsole(LOG_DEBUG, `[VRR.Event] Setting ${getPlayerDisplayForConsole(client)}'s ped body parts and props`); setEntityData(client.player, "vrr.bodyParts", getPlayerCurrentSubAccount(client).bodyParts, true); setEntityData(client.player, "vrr.bodyProps", getPlayerCurrentSubAccount(client).bodyProps, true); @@ -514,7 +521,7 @@ function onPlayerSpawn(client) { logToConsole(LOG_DEBUG, `[VRR.Event] Sending snow states to ${getPlayerDisplayForConsole(client)}`); updatePlayerSnowState(client); - if(getServerGame() == GAME_GTA_SA) { + if(getServerGame() == VRR_GAME_GTA_SA) { logToConsole(LOG_DEBUG, `[VRR.Event] Setting player walk and fightstyle for ${getPlayerDisplayForConsole(client)}`); setEntityData(client.player, "vrr.walkStyle", getPlayerCurrentSubAccount(client).walkStyle, true); diff --git a/scripts/server/item.js b/scripts/server/item.js index c52c1505..3d790190 100644 --- a/scripts/server/item.js +++ b/scripts/server/item.js @@ -103,12 +103,15 @@ function createGroundItemObject(itemId) { deleteGroundItemObject(itemId); } - getItemData(itemId).object = createGameObject(getItemTypeData(getItemData(itemId).itemTypeIndex).dropModel, applyOffsetToPos(getItemData(itemId).position, getItemTypeData(getItemData(itemId).itemTypeIndex).dropPosition)); - 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); - addToWorld(getItemData(itemId).object); + let object = createGameObject(getItemTypeData(getItemData(itemId).itemTypeIndex).dropModel, applyOffsetToPos(getItemData(itemId).position, getItemTypeData(getItemData(itemId).itemTypeIndex).dropPosition)); + if(object != false) { + getItemData(itemId).object = object; + 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); + addToWorld(getItemData(itemId).object); + } getServerData().groundItemCache.push(itemId); } @@ -1341,7 +1344,7 @@ function saveAllItemsToDatabase() { for(let i in getServerData().items) { if(getServerData().items[i].needsSaved) { if(getServerData().items[i].databaseId != -1) { - saveItemToDatabase(i); + saveItemToDatabase(getServerData().items[i]); } } } @@ -1349,39 +1352,98 @@ function saveAllItemsToDatabase() { // =========================================================================== -function saveItemToDatabase(itemId) { - let tempItemData = getServerData().items[itemId]; - logToConsole(LOG_VERBOSE, `[VRR.Item]: Saving item '${itemId}' to database ...`); +function saveItemToDatabase(itemData) { + logToConsole(LOG_VERBOSE, `[VRR.Item]: Saving item '${itemData.index}' to database ...`); let dbConnection = connectToDatabase(); if(dbConnection) { let data = [ ["item_server", getServerId()], - ["item_type", tempItemData.itemType], - ["item_owner_type", tempItemData.ownerType], - ["item_owner_id", tempItemData.ownerId], - ["item_amount", tempItemData.amount], - ["item_pos_x", tempItemData.position.x], - ["item_pos_y", tempItemData.position.y], - ["item_pos_z", tempItemData.position.z], - ["item_int", tempItemData.interior], - ["item_vw", tempItemData.dimension], - ["item_buy_price", tempItemData.buyPrice], - ["item_enabled", tempItemData.enabled], - ["item_value", tempItemData.value], + ["item_type", itemData.itemType], + ["item_owner_type", itemData.ownerType], + ["item_owner_id", itemData.ownerId], + ["item_amount", itemData.amount], + ["item_pos_x", itemData.position.x], + ["item_pos_y", itemData.position.y], + ["item_pos_z", itemData.position.z], + ["item_int", itemData.interior], + ["item_vw", itemData.dimension], + ["item_buy_price", itemData.buyPrice], + ["item_enabled", itemData.enabled], + ["item_value", itemData.value], ]; let dbQuery = null; - if(tempItemData.databaseId == 0) { + if(itemData.databaseId == 0) { let queryString = createDatabaseInsertQuery("item_main", data); dbQuery = queryDatabase(dbConnection, queryString); - getServerData().items[itemId].databaseId = getDatabaseInsertId(dbConnection); + itemData.databaseId = getDatabaseInsertId(dbConnection); } else { - let queryString = createDatabaseUpdateQuery("item_main", data, `item_id=${tempItemData.databaseId}`); + let queryString = createDatabaseUpdateQuery("item_main", data, `item_id=${itemData.databaseId}`); dbQuery = queryDatabase(dbConnection, queryString); } - getItemData(itemId).needsSaved = false; + itemData.needsSaved = false; + freeDatabaseQuery(dbQuery); + disconnectFromDatabase(dbConnection); + return true; + } + + return false; +} + +function saveItemTypeToDatabase(itemTypeData) { + logToConsole(LOG_VERBOSE, `[VRR.Item]: Saving item type '${itemTypeData.name}' to database ...`); + + let dbConnection = connectToDatabase(); + if(dbConnection) { + let data = [ + ["item_type_id", itemTypeData.databaseId], + ["item_type_server", itemTypeData.serverId], + ["item_type_name", itemTypeData.name], + ["item_type_enabled", itemTypeData.enabled], + ["item_type_use_type", itemTypeData.useType], + ["item_type_drop_type", itemTypeData.dropType], + ["item_type_use_id", itemTypeData.useId], + ["item_type_drop_pos_x", itemTypeData.dropPosition.x], + ["item_type_drop_pos_y", itemTypeData.dropPosition.y], + ["item_type_drop_pos_z", itemTypeData.dropPosition.z], + ["item_type_drop_rot_x", itemTypeData.dropRotation.x], + ["item_type_drop_rot_y", itemTypeData.dropRotation.y], + ["item_type_drop_rot_z", itemTypeData.dropRotation.z], + ["item_type_drop_scale_x", itemTypeData.dropScale.x], + ["item_type_drop_scale_y", itemTypeData.dropScale.y], + ["item_type_drop_scale_z", itemTypeData.dropScale.z], + ["item_type_drop_model", itemTypeData.dropModel], + ["item_type_use_value", itemTypeData.useValue], + //["item_type_max_value", itemTypeData.maxValue], + ["item_type_order_price", itemTypeData.orderPrice], + ["item_type_order_value", itemTypeData.orderValue], + ["item_type_demand_multiplier", itemTypeData.demandMultiplier], + ["item_type_supply_multiplier", itemTypeData.supplyMultiplier], + ["item_type_risk_multiplier", itemTypeData.riskMultiplier], + ["item_type_size", itemTypeData.size], + ["item_type_capacity", itemTypeData.capacity], + ["item_type_delay_use", itemTypeData.useDelay], + ["item_type_delay_switch", itemTypeData.switchDelay], + ["item_type_delay_pickup", itemTypeData.pickupDelay], + ["item_type_delay_put", itemTypeData.putDelay], + ["item_type_delay_take", itemTypeData.takeDelay], + ["item_type_delay_give", itemTypeData.giveDelay], + ["item_type_delay_drop", itemTypeData.dropDelay], + ]; + + let dbQuery = null; + if(itemTypeData.databaseId == 0) { + let queryString = createDatabaseInsertQuery("item_type", data); + dbQuery = queryDatabase(dbConnection, queryString); + itemTypeData.databaseId = getDatabaseInsertId(dbConnection); + } else { + let queryString = createDatabaseUpdateQuery("item_type", data, `item_type_id=${itemTypeData.databaseId}`); + dbQuery = queryDatabase(dbConnection, queryString); + } + + itemTypeData.needsSaved = false; freeDatabaseQuery(dbQuery); disconnectFromDatabase(dbConnection); return true; diff --git a/scripts/server/misc.js b/scripts/server/misc.js index e8e30f8c..e496b44e 100644 --- a/scripts/server/misc.js +++ b/scripts/server/misc.js @@ -87,7 +87,7 @@ function setNewCharacterSkinCommand(command, params, client) { getServerConfig().newCharacter.skin = skinId; getServerConfig().needsSaved = true; - messagePlayerNormal(client, `The new character skin has been set to ${getSkinNameFromId(skinId)} (ID ${skinId})`); + messagePlayerNormal(client, `The new character skin has been set to ${getSkinNameFromModel(skinId)} (ID ${skinId})`); return true; } @@ -151,40 +151,44 @@ function enterExitPropertyCommand(command, params, client) { // isEntrance = false; //} - if(getPlayerData(client).currentPickup != false) { - let ownerType = getEntityData(getPlayerData(client).currentPickup, "vrr.owner.type"); - let ownerId = getEntityData(getPlayerData(client).currentPickup, "vrr.owner.id"); + if(!getPlayerData(client).currentPickup) { + return false; + } - //logToConsole(LOG_DEBUG, `${getPlayerDisplayForConsole(client)} is near pickup for owner ID ${ownerId}`); + let ownerType = getEntityData(getPlayerData(client).currentPickup, "vrr.owner.type"); + let ownerId = getEntityData(getPlayerData(client).currentPickup, "vrr.owner.id"); - switch(ownerType) { - case VRR_PICKUP_BUSINESS_ENTRANCE: - isBusiness = true; - isEntrance = true; - closestProperty = getServerData().businesses[ownerId]; - break; + switch(ownerType) { + case VRR_PICKUP_BUSINESS_ENTRANCE: + isBusiness = true; + isEntrance = true; + closestProperty = getServerData().businesses[ownerId]; + break; - case VRR_PICKUP_BUSINESS_EXIT: - isBusiness = true; - isEntrance = false; - closestProperty = getServerData().businesses[ownerId]; - break; + case VRR_PICKUP_BUSINESS_EXIT: + isBusiness = true; + isEntrance = false; + closestProperty = getServerData().businesses[ownerId]; + break; - case VRR_PICKUP_HOUSE_ENTRANCE: - isBusiness = false; - isEntrance = true; - closestProperty = getServerData().houses[ownerId]; - break; + case VRR_PICKUP_HOUSE_ENTRANCE: + isBusiness = false; + isEntrance = true; + closestProperty = getServerData().houses[ownerId]; + break; - case VRR_PICKUP_HOUSE_EXIT: - isBusiness = false; - isEntrance = false; - closestProperty = getServerData().houses[ownerId]; - break; + case VRR_PICKUP_HOUSE_EXIT: + isBusiness = false; + isEntrance = false; + closestProperty = getServerData().houses[ownerId]; + break; - default: - return false; - } + default: + return false; + } + + if(closestProperty == null) { + return false; } logToConsole(LOG_DEBUG, `${getPlayerDisplayForConsole(client)}'s closest door is ${(isBusiness) ? closestProperty.name : closestProperty.description} ${(isEntrance) ? "entrance" : "exit"}`); @@ -295,7 +299,7 @@ function getPlayerInfoCommand(command, params, client) { `${getInlineChatColourByName("white")}Registered: ${getPlayerData(targetClient).accountData}`, `${getInlineChatColourByName("white")}Game Version: ${getInlineChatColourByName("lightGrey")}${targetClient.gameVersion}`, `${getInlineChatColourByName("white")}Client Version: ${getInlineChatColourByName("lightGrey")}${getPlayerData(targetClient).clientVersion}`, - `${getInlineChatColourByName("white")}Skin: ${getInlineChatColourByName("lightGrey")}${getSkinNameFromId(getPlayerCurrentSubAccount(targetClient).skin)}[${getPlayerCurrentSubAccount(targetClient).skin}]`, + `${getInlineChatColourByName("white")}Skin: ${getInlineChatColourByName("lightGrey")}${getSkinNameFromModel(getPlayerCurrentSubAccount(targetClient).skin)}[${getPlayerCurrentSubAccount(targetClient).skin}]`, `${getInlineChatColourByName("white")}Clan: ${getInlineChatColourByName("lightGrey")}${clan}`, `${getInlineChatColourByName("white")}Job: ${getInlineChatColourByName("lightGrey")}${job}`, @@ -358,8 +362,8 @@ function showPlayerPrompt(client, promptType, promptMessage, promptTitle) { function updateServerGameTime() { if(isTimeSupported()) { - gta.time.hour = getServerConfig().hour; - gta.time.minute = getServerConfig().minute; + game.time.hour = getServerConfig().hour; + game.time.minute = getServerConfig().minute; } } diff --git a/scripts/server/moderation.js b/scripts/server/moderation.js index 3d184c46..3683753f 100644 --- a/scripts/server/moderation.js +++ b/scripts/server/moderation.js @@ -959,22 +959,22 @@ function forcePlayerSkinCommand(command, params, client) { let splitParams = params.split(" "); let targetClient = getPlayerFromParams(splitParams[0]); - let skinId = getSkinIdFromParams(splitParams[1]); + let skinIndex = getSkinModelIndexFromParams(splitParams[1]); if(!targetClient) { messagePlayerError(client, "That player is not connected!"); return false; } - if(!skinId) { + if(!skinIndex) { messagePlayerError(client, "That skin is invalid!"); return false; } - getPlayerCurrentSubAccount(targetClient).skin = skinId; - setPlayerSkin(targetClient, skinId); + getPlayerCurrentSubAccount(targetClient).skin = skinIndex; + setPlayerSkin(targetClient, skinIndex); - messageAdmins(`${client.name} ${getInlineChatColourByName("white")}set ${getPlayerName(targetClient)}'s ${getInlineChatColourByName("white")}skin to ${getInlineChatColourByName("lightGrey")}${getSkinNameFromId(skinId)}`); + messageAdmins(`${client.name} ${getInlineChatColourByName("white")}set ${getPlayerName(targetClient)}'s ${getInlineChatColourByName("white")}skin to ${getInlineChatColourByName("lightGrey")}${getGameData().skins[getGame()][skinIndex][1]}`); } // =========================================================================== diff --git a/scripts/server/npc.js b/scripts/server/npc.js index 298ee728..b053464c 100644 --- a/scripts/server/npc.js +++ b/scripts/server/npc.js @@ -5,4 +5,16 @@ // FILE: npc.js // DESC: Provides NPC usage and functions // TYPE: Server (JavaScript) +// =========================================================================== + +function initNPCScript() { + +} + +// =========================================================================== + +function getNPCData(ped) { + return false; +} + // =========================================================================== \ No newline at end of file diff --git a/scripts/server/startup.js b/scripts/server/startup.js index 5579e9ef..7b8a09f5 100644 --- a/scripts/server/startup.js +++ b/scripts/server/startup.js @@ -37,6 +37,7 @@ function initServerScripts() { initGUIScript(); initEconomyScript(); initRadioScript(); + initLocaleScript(); initTimers(); diff --git a/scripts/server/subaccount.js b/scripts/server/subaccount.js index 6e4d3ef1..64e7afe8 100644 --- a/scripts/server/subaccount.js +++ b/scripts/server/subaccount.js @@ -287,8 +287,6 @@ function checkNewCharacter(client, firstName, lastName) { return true; } - let skinId = allowedSkins[getServerGame()][getAllowedSkinDataBySkinId(getServerConfig().newCharacter.skin)][0] - let subAccountData = createSubAccount(getPlayerData(client).accountData.databaseId, firstName, lastName); if(!subAccountData) { if(getServerConfig().useGUI && doesPlayerHaveGUIEnabled(client)) { @@ -296,7 +294,7 @@ function checkNewCharacter(client, firstName, lastName) { } else { messagePlayerAlert(client, "Your character could not be created!"); } - messagePlayerAlert(client, `${getServerName()} staff have been notified of the problem and will fix it shortly.`); + messagePlayerAlert(client, `${getServerName()} staff have been notified of the problem and will fix it soon.`); return false; } @@ -372,14 +370,10 @@ function selectCharacter(client, characterId = -1) { //setPlayerCameraLookAt(client, getPosBehindPos(spawnPosition, spawnHeading, 5), spawnPosition); getPlayerData(client).pedState = VRR_PEDSTATE_SPAWNING; - if(!isGTAIV()) { - spawnPlayer(client, spawnPosition, spawnHeading, skin, spawnInterior, spawnDimension); + if(getGame() < VRR_GAME_MAFIA_ONE) { + spawnPlayer(client, spawnPosition, spawnHeading, getGameData().skins[getGame()][skin][0], spawnInterior, spawnDimension); } else { - //setPlayerPosition(client, spawnPosition); - //setPlayerHeading(client, spawnHeading); - //setPlayerSkin(client, skin); - //restorePlayerCamera(client); - spawnPlayer(client, spawnPosition, spawnHeading, skin, spawnInterior, spawnDimension); + spawnPlayer(client, getGameData().skins[getGame()][skin][0], spawnPosition, spawnHeading); } logToConsole(LOG_DEBUG, `[VRR.SubAccount] Spawned ${getPlayerDisplayForConsole(client)} as character ID ${getPlayerData(client).currentSubAccount} with skin ${skin} (${spawnPosition.x}, ${spawnPosition.y}, ${spawnPosition.z})`); @@ -609,7 +603,7 @@ function forceFightStyleCommand(command, params, client) { // =========================================================================== function createDefaultSubAccountServerData(databaseId, thisServerSkin) { - for(let i = 1 ; i <= 4 ; i++) { + for(let i = 1 ; i <= 5 ; i++) { if(i == getServerId()) { let dbQueryString = `INSERT INTO sacct_svr (sacct_svr_sacct, sacct_svr_server, sacct_svr_skin) VALUES (${databaseId}, ${i}, ${thisServerSkin})`; quickDatabaseQuery(dbQueryString); diff --git a/scripts/server/vehicle.js b/scripts/server/vehicle.js index 459faa06..a85e11c5 100644 --- a/scripts/server/vehicle.js +++ b/scripts/server/vehicle.js @@ -79,7 +79,7 @@ function saveVehicleToDatabase(vehicleDataId) { let dbConnection = connectToDatabase(); if(dbConnection) { if(!tempVehicleData.spawnLocked) { - if(doesGameHaveServerElements()) { + if(areServerElementsSupported()) { tempVehicleData.spawnPosition = tempVehicleData.vehicle.position; tempVehicleData.spawnRotation = tempVehicleData.vehicle.heading; } else { @@ -207,15 +207,15 @@ function createVehicleCommand(command, params, client) { return false; } - let modelId = getVehicleModelIdFromParams(params); + let modelIndex = getVehicleModelIndexFromParams(params); - if(!modelId) { + if(!modelIndex) { messagePlayerError(client, "That vehicle type is invalid!"); return false; } let frontPos = getPosInFrontOfPos(getPlayerPosition(client), getPlayerHeading(client), getGlobalConfig().spawnCarDistance); - let vehicle = createPermanentVehicle(modelId, frontPos, getPlayerHeading(client), getPlayerInterior(client), getPlayerDimension(client)); + let vehicle = createPermanentVehicle(modelIndex, frontPos, getPlayerHeading(client), getPlayerInterior(client), getPlayerDimension(client)); messageAdmins(`${getInlineChatColourByName("lightGrey")}${getPlayerName(client)} ${getInlineChatColourByName("white")}created a ${getInlineChatColourByType("vehiclePurple")}${getVehicleName(vehicle)}!`); } @@ -228,15 +228,15 @@ function createTemporaryVehicleCommand(command, params, client) { return false; } - let modelId = getVehicleModelIdFromParams(params); + let modelIndex = getVehicleModelIndexFromParams(params); - if(!modelId) { + if(!modelIndex) { messagePlayerError(client, "That vehicle type is invalid!"); return false; } let frontPos = getPosInFrontOfPos(getPlayerPosition(client), getPlayerHeading(client), getGlobalConfig().spawnCarDistance); - let vehicle = createTemporaryVehicle(modelId, frontPos, getPlayerHeading(client), getPlayerInterior(client), getPlayerDimension(client)); + let vehicle = createTemporaryVehicle(modelIndex, frontPos, getPlayerHeading(client), getPlayerInterior(client), getPlayerDimension(client)); messageAdmins(`${getInlineChatColourByName("lightGrey")}${getPlayerName(client)} ${getInlineChatColourByName("white")}created a temporary ${getInlineChatColourByType("vehiclePurple")}${getVehicleName(vehicle)}`); } @@ -737,12 +737,6 @@ function doesClientOwnVehicle(client, vehicle) { // =========================================================================== -function getVehicleName(vehicle) { - return getVehicleNameFromModelId(vehicle.modelIndex) || "Unknown"; -} - -// =========================================================================== - function setVehicleJobCommand(command, params, client) { if(!isPlayerInAnyVehicle(client)) { messagePlayerError(client, "You need to be in a vehicle!"); @@ -1159,7 +1153,7 @@ function spawnVehicle(vehicleData) { let vehicle = createGameVehicle(vehicleData.model, vehicleData.spawnPosition, vehicleData.spawnRotation); addToWorld(vehicle); - if(doesGameHaveServerElements()) { + if(isSnowSupported()) { if(vehicleData.colour1IsRGBA && vehicleData.colour2IsRGBA) { vehicle.setRGBColours(vehicleData.colour1RGBA, vehicleData.colour2RGBA); } else { @@ -1250,8 +1244,8 @@ async function getPlayerNewVehicle(client) { // =========================================================================== -function createNewDealershipVehicle(model, spawnPosition, spawnRotation, price, dealershipId, interior = 0, dimension = 0) { - let vehicle = createGameVehicle(model, spawnPosition, spawnRotation); +function createNewDealershipVehicle(modelIndex, spawnPosition, spawnRotation, price, dealershipId, interior = 0, dimension = 0) { + let vehicle = createGameVehicle(modelIndex, spawnPosition, spawnRotation); if(!vehicle) { return false; } @@ -1277,17 +1271,24 @@ function createNewDealershipVehicle(model, spawnPosition, spawnRotation, price, // =========================================================================== -function createTemporaryVehicle(modelId, position, heading, interior = 0, dimension = 0) { - let vehicle = createGameVehicle(modelId, position, heading); +function createTemporaryVehicle(modelIndex, position, heading, interior = 0, dimension = 0) { + let vehicle = createGameVehicle(modelIndex, position, heading); setVehicleHeading(vehicle, heading); setElementInterior(vehicle, interior); setElementDimension(vehicle, dimension); addToWorld(vehicle); let tempVehicleData = new VehicleData(false, vehicle); + tempVehicleData.model = modelIndex; tempVehicleData.databaseId = -1; tempVehicleData.interior = interior; tempVehicleData.dimension = dimension; + if(!isGameFeatureSupported("vehicleColours")) { + tempVehicleData.colour1 = 0; + tempVehicleData.colour2 = 0; + tempVehicleData.colour3 = 0; + tempVehicleData.colour4 = 0; + } let slot = getServerData().vehicles.push(tempVehicleData); setEntityData(vehicle, "vrr.dataSlot", slot-1, false); @@ -1297,16 +1298,23 @@ function createTemporaryVehicle(modelId, position, heading, interior = 0, dimens // =========================================================================== -function createPermanentVehicle(modelId, position, heading, interior = 0, dimension = 0) { - let vehicle = createGameVehicle(modelId, position, heading); +function createPermanentVehicle(modelIndex, position, heading, interior = 0, dimension = 0) { + let vehicle = createGameVehicle(modelIndex, position, heading); setVehicleHeading(vehicle, heading); setElementInterior(vehicle, interior); setElementDimension(vehicle, dimension); addToWorld(vehicle); let tempVehicleData = new VehicleData(false, vehicle); + tempVehicleData.model = modelIndex; tempVehicleData.interior = interior; tempVehicleData.dimension = dimension; + if(!isGameFeatureSupported("vehicleColours")) { + tempVehicleData.colour1 = 0; + tempVehicleData.colour2 = 0; + tempVehicleData.colour3 = 0; + tempVehicleData.colour4 = 0; + } let slot = getServerData().vehicles.push(tempVehicleData); setEntityData(vehicle, "vrr.dataSlot", slot-1, false); diff --git a/scripts/shared/utilities.js b/scripts/shared/utilities.js index c27ae9c6..2c568d8b 100644 --- a/scripts/shared/utilities.js +++ b/scripts/shared/utilities.js @@ -432,4 +432,416 @@ function getPercentage(num, per) { return (num/100)*per; } +// =========================================================================== + +function getMultiplayerMod() { + return (getGame() >= 10) ? VRR_MPMOD_MAFIAC : VRR_MPMOD_GTAC; +} + +// =========================================================================== + +function getGame() { + if(isServerScript()) { + return server.game; + } else { + return game.game; + } +} + +// =========================================================================== + +function isSnowSupported(gameId) { + return supportedFeatures.snow[getGame()]; +} + +// =========================================================================== + +function isGTAIV() { + return (getGame() == VRR_GAME_GTA_IV); +} + +// =========================================================================== + +function areServerElementsSupported() { + return supportedFeatures.serverElements[getGame()]; +} + +// =========================================================================== + +function isTimeSupported() { + return supportedFeatures.time[getGame()]; +} + +// =========================================================================== + +function isWeatherSupported() { + return supportedFeatures.weather[getGame()]; +} + +// =========================================================================== + +function arePickupsSupported() { + return supportedFeatures.pickups[getGame()]; +} + +// =========================================================================== + +function areBlipsSupported() { + return supportedFeatures.blips[getGame()]; +} + +// =========================================================================== + +function areMarkersSupported() { + return supportedFeatures.markers[getGame()]; +} + +// =========================================================================== + +function isFadeCameraSupported() { + return supportedFeatures.fadeCamera[getGame()]; +} + +// =========================================================================== + +function isCustomCameraSupported() { + return supportedFeatures.customCamera[getGame()]; +} + +// =========================================================================== + +function isFightStyleSupported() { + return supportedFeatures.fightStyle[getGame()]; +} + +// =========================================================================== + +function areWorldLabelsSupported() { + return supportedFeatures.worldLabels[getGame()]; +} + +// =========================================================================== + +function isGameFeatureSupported(featureName) { + return supportedFeatures[featureName][getGame()]; +} + +// =========================================================================== + +function getAllowedSkins(gameId = getGame()) { + return getGameData().skins[gameId].filter(skin => skin[2] == true); +} + +// =========================================================================== + +function getGameData() { + return gameData; +} + +// =========================================================================== + +function getAllowedSkinIndexFromSkin(skin) { + for(let i in allowedSkins) { + if(allowedSkins[i][0] == skin) { + return i; + } + } + + return false; +} + +// =========================================================================== + +function getSkinIndexFromModel(model, gameId = getGame()) { + let skins = getGameData().skins[gameId]; + for(let i in skins) { + if(toLowerCase(skins[i][0]).indexOf(toLowerCase(model)) != -1) { + return i; + } + } + + return false; +} + +// =========================================================================== + +function getSkinIndexFromName(name, gameId = getGame()) { + let skins = getGameData().skins[gameId]; + for(let i in skins) { + if(toLowerCase(skins[i][1]).indexOf(toLowerCase(name)) != -1) { + return i; + } + } + + return false; +} + +// =========================================================================== + +function getObjectModelIndexFromModel(model, gameId = getGame()) { + let objects = getGameData().objects[gameId]; + for(let i in objects) { + if(toLowerCase(objects[i][0]).indexOf(toLowerCase(model)) != -1) { + return i; + } + } + + return false; +} + +// =========================================================================== + +function getGameName(gameId = getGame()) { + return getGameData().gameNames[gameId]; +} + +// =========================================================================== + +function getVehicleModelIndexFromParams(params, gameId = getGame()) { + let fromName = getVehicleModelIndexFromName(params, gameId); + let fromModel = getVehicleModelIndexFromModel(params, gameId); + + if(fromModel && !fromName) { + return fromModel; + } + + if(!fromModel && fromName) { + return fromName; + } + + return false; +} + +// =========================================================================== + +function getVehicleModelIndexFromName(name, gameId = getGame()) { + let vehicles = getGameData().vehicles[gameId]; + for(let i in vehicles) { + if(toLowerCase(vehicles[i][1]).indexOf(toLowerCase(name)) != -1) { + return i; + } + } + + return false; +} + +// =========================================================================== + +function getVehicleModelIndexFromModel(model, gameId = getGame()) { + let vehicles = getGameData().vehicles[gameId]; + for(let i in vehicles) { + if(isNaN(model)) { + if(toLowerCase(vehicles[i][0]).indexOf(toLowerCase(model)) != -1) { + return i; + } + } else { + if(vehicles[i][0] == toInteger(model)) { + return i; + } + } + } + + return false; +} + +// =========================================================================== + +function getVehicleModelFromName(name, gameId = getGame()) { + let vehicles = getGameData().vehicles[gameId]; + for(let i in vehicles) { + if(toLowerCase(vehicles[i][1]).indexOf(toLowerCase(name)) != -1) { + return vehicles[i][0]; + } + } + + return false; +} + +// =========================================================================== + +function getVehicleNameFromModel(model, gameId = getGame()) { + let vehicles = getGameData().vehicles[gameId]; + for(let i in vehicles) { + if(isNaN(model)) { + if(toLowerCase(vehicles[i][0]).indexOf(toLowerCase(model)) != -1) { + return vehicles[i][1]; + } + } else { + if(vehicles[i][0] == toInteger(model)) { + return vehicles[i][1]; + } + } + } + + return false; +} + +// =========================================================================== + +function getSkinModelIndexFromParams(params, gameId = getServerGame()) { + let fromName = getSkinIndexFromName(params, gameId); + let fromModel = getSkinIndexFromModel(params, gameId); + + if(fromModel && !fromName) { + return fromModel; + } + + if(!fromModel && fromName) { + return fromName; + } + + return false; +} + +// =========================================================================== + +function getSkinNameFromModel(model, gameId = getServerGame()) { + let skins = getGameData().skins[gameId]; + for(let i in skins) { + if(toLowerCase(skins[i][0]).indexOf(toLowerCase(model)) != -1) { + return skins[i][1]; + } + } + + return false; +} + +// =========================================================================== + +function getSkinModelFromName(name, gameId = getServerGame()) { + let skins = getGameData().skins[gameId]; + for(let i in skins) { + if(toLowerCase(skins[i][1]).indexOf(toLowerCase(name)) != -1) { + return skins[i][0]; + } + } +} + +// =========================================================================== + +function getObjectModelIndexFromParams(params, gameId = getServerGame()) { + let fromName = getObjectModelIndexFromName(params, gameId); + let fromModel = getObjectModelIndexFromModel(params, gameId); + + if(fromModel && !fromName) { + return fromModel; + } + + if(!fromModel && fromName) { + return fromName; + } + + return false; +} + +// =========================================================================== + +function getObjectNameFromModel(model, gameId = getServerGame()) { + let objects = getGameData().objects[gameId]; + for(let i in objects) { + if(toLowerCase(objects[i][0]).indexOf(toLowerCase(model)) != -1) { + return objects[i][1]; + } + } + + return false; +} + +// =========================================================================== + +function getObjectModelFromName(name, gameId = getServerGame()) { + let objects = getGameData().objects[gameId]; + for(let i in objects) { + if(toLowerCase(objects[i][1]).indexOf(toLowerCase(name)) != -1) { + return objects[i][0]; + } + } +} + +// =========================================================================== + +// =========================================================================== + +function getPosToRightOfPos(pos, angle, distance) { + let x = (pos.x+((Math.cos((-angle+1.57)+(Math.PI/2)))*distance)); + let y = (pos.y+((Math.sin((-angle+1.57)+(Math.PI/2)))*distance)); + + let rightPos = toVector3(x, y, pos.z); + + return rightPos; +} + +// =========================================================================== + +function getPosToLeftOfPos(pos, angle, distance) { + let x = (pos.x+((Math.cos((angle+1.57)+(Math.PI/2)))*distance)); + let y = (pos.y+((Math.sin((angle+1.57)+(Math.PI/2)))*distance)); + + let leftPos = toVector3(x, y, pos.z); + + return leftPos; +} + +// =========================================================================== + +function getPosInFrontOfPos(pos, angle, distance) { + let x = pos.x; + let y = pos.y; + let z = pos.z; + + if(getGame() < VRR_GAME_MAFIA_ONE) { + y = (pos.y+((Math.sin(angle+(Math.PI/2)))*distance)); + } else { + angle = radToDeg(angle); + z = (pos.z+((Math.sin(angle+(Math.PI/2)))*distance)); + } + + x = (pos.x+((Math.cos(angle+(Math.PI/2)))*distance)); + + return toVector3(x, y, z); +} + +// =========================================================================== + +function getPosBehindPos(pos, angle, distance) { + let x = pos.x; + let y = pos.y; + let z = pos.z; + + if(getGame() < VRR_GAME_MAFIA_ONE) { + y = (pos.y+((Math.sin(angle-(Math.PI/2)))*distance)); + } else { + angle = radToDeg(angle); + z = (pos.z+((Math.sin(angle-(Math.PI/2)))*distance)); + } + + x = (pos.x+((Math.cos(angle-(Math.PI/2)))*distance)); + + return toVector3(x, y, z); +} + +// =========================================================================== + +function getPosAbovePos(pos, distance) { + return toVector3(pos.x, pos.y, pos.z+distance); +} + +// =========================================================================== + +function getPosBelowPos(pos, distance) { + return toVector3(pos.x, pos.y, pos.z-distance); +} + +// =========================================================================== + +function applyOffsetToPos(position, position2) { + return toVector3(position.x+position2.x, position.y+position2.y, position.z+position2.z); +} + +// =========================================================================== + +function getRandom(min, max) { + return Math.floor(Math.random() * (toInteger(max) - toInteger(min) + 1)) + toInteger(min) +} + // =========================================================================== \ No newline at end of file