diff --git a/scripts/client/main.js b/scripts/client/main.js index 99d664d1..42854e51 100644 --- a/scripts/client/main.js +++ b/scripts/client/main.js @@ -27,7 +27,7 @@ let renderHotBar = true; let renderItemActionDelay = true; let renderInteriorLights = true; -let logLevel = LOG_ALL; +let logLevel = LOG_INFO; let weaponDamageEnabled = {}; let weaponDamageEvent = {}; diff --git a/scripts/client/server.js b/scripts/client/server.js index 2fa152a8..963db41b 100644 --- a/scripts/client/server.js +++ b/scripts/client/server.js @@ -78,16 +78,13 @@ function addAllNetworkHandlers() { addNetworkHandler("vrr.veh.engine", toggleVehicleEngine); addNetworkHandler("vrr.veh.repair", repairVehicle); - addNetworkHandler("vrr.veh.sync", syncVehicleProperties); - addNetworkHandler("vrr.civ.sync", syncCivilianProperties); - addNetworkHandler("vrr.plr.sync", syncPlayerProperties); - addNetworkHandler("vrr.obj.sync", syncObjectProperties); - addNetworkHandler("vrr.pedAnim", makePedPlayAnimation); addNetworkHandler("vrr.hideAllGUI", hideAllGUI); addNetworkHandler("vrr.gameScript", setGameScriptState); addNetworkHandler("vrr.clientInfo", serverRequestedClientInfo); addNetworkHandler("vrr.interiorLights", updateInteriorLightsState); + + addNetworkHandler("vrr.syncElement", forceSyncElementProperties); } // =========================================================================== @@ -278,4 +275,10 @@ function updateInteriorLightsState(state) { interiorLightsEnabled = state; } +// =========================================================================== + +function forceSyncElementProperties(elementId) { + syncElementProperties(getElementFromId(elementId)); +} + // =========================================================================== \ No newline at end of file diff --git a/scripts/client/sync.js b/scripts/client/sync.js index 5244432c..b1d3893a 100644 --- a/scripts/client/sync.js +++ b/scripts/client/sync.js @@ -98,7 +98,9 @@ function syncVehicleProperties(vehicle) { if(doesEntityDataExist(vehicle, "vrr.upgrades")) { let upgrades = getEntityData(vehicle, "vrr.upgrades"); for(let i in upgrades) { - vehicle.addUpgrade(upgrades[i]); + if(upgrades[i] != 0) { + vehicle.addUpgrade(upgrades[i]); + } } } } diff --git a/scripts/server/account.js b/scripts/server/account.js index 72439e11..3192a42e 100644 --- a/scripts/server/account.js +++ b/scripts/server/account.js @@ -548,7 +548,7 @@ function saveAccountToDatabase(accountData) { freeDatabaseQuery(dbQuery); let data2 = [ - ["acct_svr_settings", accountData.flags.settings], + ["acct_svr_settings", accountData.settings], ["acct_svr_staff_title", safeStaffTitle], ["acct_svr_staff_flags", accountData.flags.admin], ["acct_svr_mod_flags", accountData.flags.moderation], @@ -687,7 +687,7 @@ function checkLogin(client, password) { if(isPlayerLoggedIn(client)) { logToConsole(LOG_WARN, `[VRR.Account] ${getPlayerDisplayForConsole(client)} attempted to login but is already logged in`); if(getServerConfig().useGUI && doesPlayerHaveGUIEnabled(client)) { - sendPlayerLoginSuccess(client); + showPlayerLoginSuccessGUI(client); } else { messagePlayerError(client, "You are already logged in!"); } diff --git a/scripts/server/animation.js b/scripts/server/animation.js index b05051a2..449160cf 100644 --- a/scripts/server/animation.js +++ b/scripts/server/animation.js @@ -24,6 +24,7 @@ function playPlayerAnimationCommand(command, params, client) { if(!animationSlot) { messagePlayerError(client, "That animation doesn't exist!"); + messagePlayerInfo(client, "Use /animlist to see a list of valid animations"); return false; } diff --git a/scripts/server/business.js b/scripts/server/business.js index f55d6e46..c4351c53 100644 --- a/scripts/server/business.js +++ b/scripts/server/business.js @@ -142,16 +142,16 @@ function loadBusinessGameScriptsFromDatabase(businessId) { function createBusinessCommand(command, params, client) { let tempBusinessData = createBusiness(params, getPlayerPosition(client), toVector3(0.0, 0.0, 0.0), getGameConfig().pickupModels[getServerGame()].business, getGameConfig().blipSprites[getServerGame()].business, getPlayerInterior(client), getPlayerDimension(client)); - getServerData().businesses.push(tempBusinessData); + tempBusinessData.needsSaved = true; + let businessId = getServerData().businesses.push(tempBusinessData); + setAllBusinessIndexes(); saveAllBusinessesToDatabase(); - createBusinessEntrancePickup(getServerData().businesses.length-1); - createBusinessExitPickup(getServerData().businesses.length-1); - createBusinessEntranceBlip(getServerData().businesses.length-1); - createBusinessExitBlip(getServerData().businesses.length-1); - - saveBusinessToDatabase(getServerData().businesses.length-1); + createBusinessEntrancePickup(businessId-1); + createBusinessExitPickup(businessId-1); + createBusinessEntranceBlip(businessId-1); + createBusinessExitBlip(businessId-1); messageAdmins(`${getInlineChatColourByName("lightGrey")}${getPlayerName(client)} ${getInlineChatColourByName("white")}created business ${getInlineChatColourByType("businessBlue")}${tempBusinessData.name}`); } @@ -243,6 +243,13 @@ function setBusinessNameCommand(command, params, client) { return false; } + if(!doesPlayerHaveStaffPermission(client, getStaffFlagValue("manageBusinesses"))) { + if(getBusinessData(businessId).ownerType == VRR_BIZOWNER_PLAYER && getBusinessData(businessId).ownerId == getPlayerCurrentSubAccount(client).databaseId) { + messagePlayerError(client, "You don't own this business!"); + return false; + } + } + let oldBusinessName = getBusinessData(businessId).name; getBusinessData(businessId).name = newBusinessName; setEntityData(getBusinessData(businessId).entrancePickup, "vrr.label.name", getBusinessData(businessId).name, true); @@ -265,30 +272,95 @@ function setBusinessOwnerCommand(command, params, client) { return false; } + if(!doesPlayerHaveStaffPermission(client, getStaffFlagValue("manageBusinesses"))) { + if(getBusinessData(businessId).ownerType == VRR_BIZOWNER_PLAYER && getBusinessData(businessId).ownerId == getPlayerCurrentSubAccount(client).databaseId) { + messagePlayerError(client, "You don't own this business!"); + return false; + } + } + getBusinessData(businessId).ownerType = VRR_BIZOWNER_PLAYER; getBusinessData(businessId).ownerId = getServerData().clients[newBusinessOwner.index].accountData.databaseId; - messageAdmins(`${getInlineChatColourByName("lightGrey")}${getPlayerName(client)} ${getInlineChatColourByName("white")}set business ${getInlineChatColourByType("businessBlue")}${getBusinessData(businessId).name} ${getInlineChatColourByName("white")}owner to ${getInlineChatColourByName("lightGrey")}${newBusinessOwner.name}`); + messagePlayerSuccess(`${getInlineChatColourByName("white")}You gave business ${getInlineChatColourByType("businessBlue")}${getBusinessData(businessId).name} ${getInlineChatColourByName("white")}to ${getInlineChatColourByName("lightGrey")}${newBusinessOwner.name}`); } // =========================================================================== function setBusinessClanCommand(command, params, client) { - let clanId = getClanFromParams(params); let businessId = (isPlayerInAnyBusiness(client)) ? getPlayerBusiness(client) : getClosestBusinessEntrance(getPlayerPosition(client)); if(!getBusinessData(businessId)) { - messagePlayerError(client, "Business not found!"); + messagePlayerError("Business not found!"); return false; } + let clanId = getPlayerClan(params); + if(!getClanData(clanId)) { messagePlayerError(client, "Clan not found!"); return false; } + if(!doesPlayerHaveStaffPermission(client, getStaffFlagValue("manageBusinesses"))) { + if(getBusinessData(businessId).ownerType == VRR_BIZOWNER_PLAYER && getBusinessData(businessId).ownerId == getPlayerCurrentSubAccount(client).databaseId) { + messagePlayerError(client, "You don't own this business!"); + return false; + } + } + + getBusinessData(businessId).needsSaved = true; + getBusinessData(businessId).ownerType = VRR_BIZOWNER_CLAN; getBusinessData(businessId).ownerId = getClanData(clanId).databaseId; - messageAdmins(`${getInlineChatColourByName("lightGrey")}${getPlayerName(client)} ${getInlineChatColourByName("white")}set business ${getInlineChatColourByType("businessBlue")}${getBusinessData(businessId).name} ${getInlineChatColourByName("white")}owner to the ${getInlineChatColourByType("clanOrange")}${getClanData(clanId).name} ${getInlineChatColourByName("white")}clan`); + messagePlayerSuccess(`${getInlineChatColourByName("white")}You gave business ${getInlineChatColourByType("businessBlue")}${getBusinessData(businessId).name} ${getInlineChatColourByName("white")}to the ${getInlineChatColourByType("clanOrange")}${getClanData(clanId).name} ${getInlineChatColourByName("white")}clan!`); +} + +// =========================================================================== + +/** + * This is a command handler function. + * + * @param {string} command - The command name used by the player + * @param {string} params - The parameters/args string used with the command by the player + * @param {Client} client - The client/player that used the command + * @return {bool} Whether or not the command was successful + * + */ + function setBusinessRankCommand(command, params, client) { + let businessId = (isPlayerInAnyBusiness(client)) ? getPlayerBusiness(client) : getClosestBusinessEntrance(getPlayerPosition(client)); + + if(!getBusinessData(businessId)) { + messagePlayerError("House not found!"); + return false; + } + + let clanId = getPlayerClan(params); + + if(!getClanData(clanId)) { + messagePlayerError(client, "Clan not found!"); + return false; + } + + let clanRankId = getClanRankFromParams(clanId, params); + + if(!getClanRankData(clanId, clanRankId)) { + messagePlayerError(client, "Clan rank not found!"); + return false; + } + + if(doesPlayerHaveClanPermission(client, getClanFlagValue("manageBusinesses"))) { + messagePlayerError(client, "You can't set clan house ranks!"); + return false; + } + + if(getClanRankData(clanId, clanRankId).level > getPlayerCurrentSubAccount(client).clanRank) { + messagePlayerError(client, "That rank is above your level!"); + return false; + } + + getBusinessData(businessId).clanRank = getClanRankData(clanId, clanRankId).level; + getBusinessData(businessId).needsSaved = true; + messagePlayerSuccess(`${getInlineChatColourByName("white")}You set business ${getInlineChatColourByType("businessBlue")}${getBusinessData(businessId).name}${getInlineChatColourByName("white")}'s clan rank to ${getInlineChatColourByType("clanOrange")}${getClanRankData(clanId, clanRankId).name} ${getInlineChatColourByName("white")}(level ${getClanRankData(clanId, clanRankId).level}) and above!`); } // =========================================================================== @@ -355,6 +427,13 @@ function lockUnlockBusinessCommand(command, params, client) { return false; } + if(!doesPlayerHaveStaffPermission(client, getStaffFlagValue("manageBusinesses"))) { + if(canPlayerLockUnlockBusiness(client, businessId)) { + messagePlayerError(client, "You don't have keys to this business!"); + return false; + } + } + getBusinessData(businessId).locked = !getBusinessData(businessId).locked; setEntityData(getBusinessData(businessId).entrancePickup, "vrr.label.locked", getBusinessData(businessId).locked, true); messagePlayerSuccess(client, `${getLockedUnlockedEmojiFromBool((getBusinessData(businessId).locked))} Business ${getInlineChatColourByType("businessBlue")}${getBusinessData(businessId).name} ${getInlineChatColourByName("white")}${getLockedUnlockedTextFromBool((getBusinessData(businessId).locked))}!`); @@ -379,6 +458,13 @@ function lockUnlockBusinessCommand(command, params, client) { return false; } + if(!doesPlayerHaveStaffPermission(client, getStaffFlagValue("manageBusinesses"))) { + if(canPlayerSetBusinessInteriorLights(client, businessId)) { + messagePlayerError(client, "You don't have keys to this business!"); + return false; + } + } + getBusinessData(businessId).interiorLights = !getBusinessData(businessId).interiorLights; getBusinessData(businessId).needsSaved = true; @@ -399,6 +485,13 @@ function setBusinessEntranceFeeCommand(command, params, client) { return false; } + if(!doesPlayerHaveStaffPermission(client, getStaffFlagValue("manageBusinesses"))) { + if(canPlayerSetBusinessEntranceFee(client, businessId)) { + messagePlayerError(client, "You don't have keys to this business!"); + return false; + } + } + getBusinessData(businessId).entranceFee = entranceFee; messageAdmins(`${getInlineChatColourByName("lightGrey")}${getPlayerName(client)} ${getInlineChatColourByName("white")}set business ${getInlineChatColourByType("businessBlue")}${getBusinessData(businessId).name} ${getInlineChatColourByName("white")}entrance fee to [#AAAAAAA]$${entranceFee}`); } @@ -489,50 +582,37 @@ function setBusinessInteriorTypeCommand(command, params, client) { } if(isNaN(typeParam)) { - if(toLowerCase(typeParam) == "none") { - removePlayersFromBusiness(businessId); + let tempBusinessLocation = new serverClasses.businessLocationData(false); - getBusinessData(businessId).exitPosition = toVector3(0.0, 0.0, 0.0); - getBusinessData(businessId).exitInterior = 0; + if(toLowerCase(typeParam) == "none") { + tempBusinessLocation.exitPosition = toVector3(0.0, 0.0, 0.0); + tempBusinessLocation.exitDimension = 0; + tempBusinessLocation.exitInterior = -1; getBusinessData(businessId).hasInterior = false; messageAdmins(`${getInlineChatColourByName("lightGrey")}${getPlayerName(client)} ${getInlineChatColourByName("white")}removed business ${getInlineChatColourByType("businessBlue")}${getBusinessData(businessId).name} ${getInlineChatColourByName("white")}interior`); - - resetBusinessPickups(); - resetBusinessBlips(); - return false; } if(isNull(getGameConfig().interiorTemplates[getServerGame()][typeParam])) { - messagePlayerError(client, "Invalid interior type! Use an interior type name or an existing business database ID"); + messagePlayerError(client, "Invalid interior type! Use an interior type name"); messagePlayerInfo(client, `Interior Types: ${getInlineChatColourByName("lightGrey")}${Object.keys(getGameConfig().interiorTemplates[getServerGame()]).join(", ")}`) return false; } - removePlayersFromBusiness(businessId); - messageAdmins(`${getInlineChatColourByName("lightGrey")}${getPlayerName(client)} ${getInlineChatColourByName("white")}set business ${getInlineChatColourByType("businessBlue")}${getBusinessData(businessId).name} ${getInlineChatColourByName("white")}interior type to ${getInlineChatColourByName("lightGrey")}${toLowerCase(typeParam)}`); - getBusinessData(businessId).exitPosition = getGameConfig().interiorTemplates[getServerGame()][typeParam].exitPosition; - getBusinessData(businessId).exitInterior = getGameConfig().interiorTemplates[getServerGame()][typeParam].exitInterior; + getBusinessData(businessId).exitPosition = getGameConfig().interiorTemplates[getServerGame()][typeParam][0]; + getBusinessData(businessId).exitInterior = getGameConfig().interiorTemplates[getServerGame()][typeParam][1]; getBusinessData(businessId).exitDimension = getBusinessData(businessId).databaseId+getGlobalConfig().businessDimensionStart; getBusinessData(businessId).hasInterior = true; - - resetBusinessPickups(); - resetBusinessBlips(); - } else { - if(!getBusinessData(businessId)) { - messagePlayerError(client, "Business ID not found!"); - return false; - } - - removePlayersFromBusiness(businessId); - getBusinessData(businessId).exitPosition = getBusinessData(businessId).exitPosition; - getBusinessData(businessId).exitInterior = getBusinessData(businessId).exitInterior; - getBusinessData(businessId).exitDimension = getBusinessData(businessId).databaseId+getGlobalConfig().businessDimensionStart; - getBusinessData(businessId).hasInterior = true; - - resetBusinessPickups(); - resetBusinessBlips(); } + + deleteHouseEntrancePickup(businessId); + deleteHouseExitPickup(businessId); + createHouseEntrancePickup(businessId); + createHouseExitPickup(businessId); + + getBusinessData(businessId).needsSaved = true; + + messageAdmins(`${getInlineChatColourByName("lightGrey")}${getPlayerName(client)} ${getInlineChatColourByName("white")}set business ${getInlineChatColourByType("businessBlue")}${getBusinessData(businessId).name} ${getInlineChatColourByName("white")}interior type to ${getInlineChatColourByName("lightGrey")}${toLowerCase(typeParam)}`); } // =========================================================================== @@ -663,6 +743,13 @@ function withdrawFromBusinessCommand(command, params, client) { return false; } + if(!doesPlayerHaveStaffPermission(client, getStaffFlagValue("manageBusinesses"))) { + if(canPlayerWithdrawFromBusinessTill(client, businessId)) { + messagePlayerError(client, "You don't have keys to this business!"); + return false; + } + } + if(getBusinessData(businessId).till < amount) { messagePlayerError(client, `Business ${getInlineChatColourByType("businessBlue")}${tempBusinessData.name} doesn't have that much money! Use /bizbalance.`); return false; @@ -915,6 +1002,18 @@ function getClosestBusinessEntrance(position) { // =========================================================================== +function getClosestBusinessExit(position) { + let closest = 0; + for(let i in getServerData().businesses) { + if(getDistance(position, getServerData().businesses[i].exitPosition) <= getDistance(position, getServerData().businesses[closest].exitPosition)) { + closest = i; + } + } + return closest; +} + +// =========================================================================== + function isPlayerInAnyBusiness(client) { if(doesEntityDataExist(client, "vrr.inBusiness")) { return true; @@ -1672,4 +1771,64 @@ function updateBusinessInteriorLightsForOccupants(businessId) { } } +// =========================================================================== + +function canPlayerWithdrawFromBusinessTill(client, businessId) { + if(doesPlayerHaveStaffPermission(client, getStaffFlagValue("manageBusinesses"))) { + return true; + } + + if(getBusinessData(businessId).ownerType == VRR_BIZOWNER_PLAYER && getBusinessData(businessId).ownerId == getPlayerCurrentSubAccount(client).databaseId) { + return true; + } + + if(getBusinessData(businessId).ownerType == VRR_BIZOWNER_CLAN && getBusinessData(businessId).ownerId == getClanData(getPlayerClan(client)).databaseId) { + if(doesPlayerHaveClanPermission(client, getClanFlagValue("manageBusinesses"))) { + return true; + } + } + + return false; +} + +// =========================================================================== + +function canPlayerSetBusinessInteriorLights(client, businessId) { + if(doesPlayerHaveStaffPermission(client, getStaffFlagValue("manageBusinesses"))) { + return true; + } + + if(getBusinessData(businessId).ownerType == VRR_BIZOWNER_PLAYER && getBusinessData(businessId).ownerId == getPlayerCurrentSubAccount(client).databaseId) { + return true; + } + + if(getBusinessData(businessId).ownerType == VRR_BIZOWNER_CLAN && getBusinessData(businessId).ownerId == getClanData(getPlayerClan(client)).databaseId) { + if(doesPlayerHaveClanPermission(client, getClanFlagValue("manageBusinesses"))) { + return true; + } + } + + return false; +} + +// =========================================================================== + +function canPlayerLockUnlockBusiness(client, businessId) { + if(doesPlayerHaveStaffPermission(client, getStaffFlagValue("manageBusinesses"))) { + return true; + } + + if(getBusinessData(businessId).ownerType == VRR_BIZOWNER_PLAYER && getBusinessData(businessId).ownerId == getPlayerCurrentSubAccount(client).databaseId) { + return true; + } + + if(getBusinessData(businessId).ownerType == VRR_BIZOWNER_CLAN && getBusinessData(businessId).ownerId == getClanData(getPlayerClan(client)).databaseId) { + if(doesPlayerHaveClanPermission(client, getClanFlagValue("manageBusinesses"))) { + return true; + } + } + + return false; +} + // =========================================================================== \ No newline at end of file diff --git a/scripts/server/chat.js b/scripts/server/chat.js index 9742042e..5b58c882 100644 --- a/scripts/server/chat.js +++ b/scripts/server/chat.js @@ -130,9 +130,9 @@ function clanChatCommand(command, params, client) { function talkToNearbyPlayers(client, messageText) { let clients = getClientsInRange(getPlayerPosition(client), getGlobalConfig().talkDistance); for(let i in clients) { - //if(clients[i] != client) { + if(getPlayerInterior(client) == getPlayerInterior(clients[i] && getPlayerDimension(client) == getPlayerDimension(clients[i]))) { messagePlayerTalk(clients[i], client, messageText); - //} + } } } @@ -159,9 +159,9 @@ function phoneIncomingToNearbyPlayers(client, messageText) { function whisperToNearbyPlayers(client, messageText) { let clients = getClientsInRange(getPlayerPosition(client), getGlobalConfig().talkDistance); for(let i in clients) { - //if(clients[i] != client) { + if(getPlayerInterior(client) == getPlayerInterior(clients[i] && getPlayerDimension(client) == getPlayerDimension(clients[i]))) { messagePlayerWhisper(clients[i], client, messageText); - //} + } } } @@ -170,9 +170,9 @@ function whisperToNearbyPlayers(client, messageText) { function shoutToNearbyPlayers(client, messageText) { let clients = getClientsInRange(getPlayerPosition(client), getGlobalConfig().shoutDistance); for(let i in clients) { - //if(clients[i].index != client.index) { + if(getPlayerInterior(client) == getPlayerInterior(clients[i] && getPlayerDimension(client) == getPlayerDimension(clients[i]))) { messagePlayerShout(clients[i], client, messageText); - //} + } } } @@ -181,9 +181,9 @@ function shoutToNearbyPlayers(client, messageText) { function doActionToNearbyPlayers(client, messageText) { let clients = getClientsInRange(getPlayerPosition(client), getGlobalConfig().doActionDistance); for(let i in clients) { - //if(clients[i].index != client.index) { + if(getPlayerInterior(client) == getPlayerInterior(clients[i] && getPlayerDimension(client) == getPlayerDimension(clients[i]))) { messagePlayerDoAction(clients[i], client, messageText); - //} + } } } @@ -192,9 +192,9 @@ function doActionToNearbyPlayers(client, messageText) { function meActionToNearbyPlayers(client, messageText) { let clients = getClientsInRange(getPlayerPosition(client), getGlobalConfig().meActionDistance); for(let i in clients) { - //if(clients[i].index != client.index) { + if(getPlayerInterior(client) == getPlayerInterior(clients[i] && getPlayerDimension(client) == getPlayerDimension(clients[i]))) { messagePlayerMeAction(clients[i], client, messageText); - //} + } } } diff --git a/scripts/server/class.js b/scripts/server/class.js index b55d8a96..9099792a 100644 --- a/scripts/server/class.js +++ b/scripts/server/class.js @@ -202,6 +202,8 @@ function initClassTable() { this.syncPosition = null; this.syncHeading = null; + this.syncVehicle = null; + this.syncVehicleSeat = null; this.twoFactorAuthenticationState = VRR_2FA_STATE_NONE; this.twoFactorAuthenticationCode = 0; @@ -423,7 +425,6 @@ function initClassTable() { this.account = toInteger(dbAssoc["sacct_acct"]); this.skin = toInteger(dbAssoc["sacct_svr_skin"]); this.cash = toInteger(dbAssoc["sacct_cash"]); - console.log(dbAssoc["sacct_pos_x"]); this.spawnPosition = toVector3(toFloat(dbAssoc["sacct_pos_x"]), toFloat(dbAssoc["sacct_pos_y"]), toFloat(dbAssoc["sacct_pos_z"])); this.spawnHeading = toFloat(dbAssoc["sacct_rot_z"]); this.lastLogin = toInteger(dbAssoc["sacct_when_lastlogin"]); diff --git a/scripts/server/client.js b/scripts/server/client.js index 2d43dc04..336e7ea1 100644 --- a/scripts/server/client.js +++ b/scripts/server/client.js @@ -140,6 +140,10 @@ function showGameMessage(client, text, colour, duration) { // =========================================================================== 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))}`); triggerNetworkEvent("vrr.ambience", client, true); } @@ -147,6 +151,10 @@ function enableCityAmbienceForPlayer(client, clearElements = false) { // =========================================================================== 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))}`); triggerNetworkEvent("vrr.ambience", client, false, clearElements); } @@ -966,4 +974,10 @@ function updateInteriorLightsForPlayer(client, state) { triggerNetworkEvent("vrr.interiorLights", client, state); } +// =========================================================================== + +function forcePlayerToSyncElementProperties(client, element) { + triggerNetworkEvent("vrr.syncElement", client, element.id); +} + // =========================================================================== \ No newline at end of file diff --git a/scripts/server/command.js b/scripts/server/command.js index 3caa7ca9..2c9bae94 100644 --- a/scripts/server/command.js +++ b/scripts/server/command.js @@ -97,6 +97,7 @@ function loadCommands() { commandData("bizitemprice", setBusinessItemSellPriceCommand, " ", getStaffFlagValue("none"), true, true, "Sets the purchase price of a business item"), commandData("bizname", setBusinessNameCommand, "", getStaffFlagValue("none"), true, true, "Changes a business name"), commandData("bizowner", setBusinessOwnerCommand, "", getStaffFlagValue("none"), true, true, "Changes the owner of a business"), + commandData("bizclan", setBusinessClanCommand, "", getStaffFlagValue("none"), true, true, "Changes the owner of a business"), commandData("bizbuyprice", setBusinessBuyPriceCommand, "", getStaffFlagValue("none"), true, true, "Changes the owner of a business"), commandData("bizblip", setBusinessBlipCommand, "", getStaffFlagValue("manageBusinesses"), true, true, "Sets the business blip display"), commandData("bizpickup", setBusinessPickupCommand, "", getStaffFlagValue("manageBusinesses"), true, true, "Sets the business pickup display"), @@ -132,21 +133,21 @@ function loadCommands() { commandData("addclan", createClanCommand, "", getStaffFlagValue("manageClans"), true, true, "Creates an new empty, unowned clan."), commandData("delclan", deleteClanCommand, "", getStaffFlagValue("manageClans"), true, true, "Deletes a clan by ID or name"), - commandData("addclanrank", createClanRankCommand, " ", getStaffFlagValue("none"), true, true, "Adds a clan rank"), - commandData("delclanrank", deleteClanRankCommand, "", getStaffFlagValue("none"), true, true, "Removes a clan rank"), + commandData("clanaddrank", createClanRankCommand, " ", getStaffFlagValue("none"), true, true, "Adds a clan rank"), + commandData("clandelrank", deleteClanRankCommand, "", getStaffFlagValue("none"), true, true, "Removes a clan rank"), - commandData("setclanrank", setClanMemberRankCommand, " ", getStaffFlagValue("none"), true, true, "Sets the rank of a clan member"), + commandData("clansetrank", setClanMemberRankCommand, " ", getStaffFlagValue("none"), true, true, "Sets the rank of a clan member"), - commandData("clanowner", setClanOwnerCommand, " ", getStaffFlagValue("none"), true, true, "Gives ownership of the clan to a player"), + commandData("clanowner", setClanOwnerCommand, "", getStaffFlagValue("none"), true, true, "Gives ownership of the clan to a player"), commandData("clantag", setClanTagCommand, "", getStaffFlagValue("none"), true, true, "Sets a clan's main tag"), - commandData("clanranktag", setClanRankTagCommand, " ", getStaffFlagValue("none"), true, true, "Sets a clan rank's custom tag"), + commandData("clanranktag", setClanRankTagCommand, " ", getStaffFlagValue("none"), true, true, "Sets a clan rank's custom tag"), commandData("clanmembertag", setClanMemberTagCommand, " ", getStaffFlagValue("none"), true, true, "Sets a clan members's custom tag"), - commandData("clanranktitle", setClanRankTitleCommand, " ", getStaffFlagValue("none"), true, true, "Sets a clan rank's title"), + commandData("clanrankname", setClanRankTitleCommand, "<rank name/id> <new name>", getStaffFlagValue("none"), true, true, "Sets a clan rank's title"), commandData("clanmembertitle", setClanMemberTitleCommand, "<player name/id> <title>", getStaffFlagValue("none"), true, true, "Sets a clan members's custom title"), - commandData("addclanrankflag", addClanRankFlagCommand, "<rank name/id> <flag name>", getStaffFlagValue("none"), true, true, "Gives a clan rank a clan permission."), - commandData("delclanrankflag", removeClanRankFlagCommand, "<rank name/id> <flag name>", getStaffFlagValue("none"), true, true, "Takes a clan permission from a clan rank"), - commandData("addclanmemberflag", addClanMemberFlagCommand, "<player name/id> <flag name>", getStaffFlagValue("none"), true, true, "Gives a clan member a clan permission"), - commandData("delclanmemberflag", removeClanMemberFlagCommand, "<player name/id> <flag name>", getStaffFlagValue("none"), true, true, "Takes a clan permission from a clan member"), + commandData("clanaddrankflag", addClanRankFlagCommand, "<rank name/id> <flag name>", getStaffFlagValue("none"), true, true, "Gives a clan rank a clan permission."), + commandData("clandelrankflag", removeClanRankFlagCommand, "<rank name/id> <flag name>", getStaffFlagValue("none"), true, true, "Takes a clan permission from a clan rank"), + commandData("clanaddmemberflag", addClanMemberFlagCommand, "<player name/id> <flag name>", getStaffFlagValue("none"), true, true, "Gives a clan member a clan permission"), + commandData("clandelmemberflag", removeClanMemberFlagCommand, "<player name/id> <flag name>", getStaffFlagValue("none"), true, true, "Takes a clan permission from a clan member"), ], class: [], client: [], @@ -206,10 +207,11 @@ function loadCommands() { commandData("houseinfo", getHouseInfoCommand, "", getStaffFlagValue("none"), true, false), commandData("housebuy", buyHouseCommand, "", getStaffFlagValue("none"), true, false), + commandData("houseclan", setHouseClanCommand, "", getStaffFlagValue("none"), true, false), commandData("housedesc", setHouseDescriptionCommand, "", getStaffFlagValue("manageHouses"), true, false), commandData("houselock", lockUnlockHouseCommand, "", getStaffFlagValue("none"), true, false), commandData("houselights", toggleHouseInteriorLightsCommand, "", getStaffFlagValue("none"), true, false), - commandData("houseowner", setHouseOwnerCommand, "", getStaffFlagValue("manageHouses"), true, false), + commandData("houseowner", setHouseOwnerCommand, "", getStaffFlagValue("none"), true, false), commandData("housebuyprice", setHouseBuyPriceCommand, "", getStaffFlagValue("none"), true, false), commandData("houserentprice", setHouseRentPriceCommand, "", getStaffFlagValue("none"), true, false), commandData("houseblip", setHouseBlipCommand, "<type name/model id>", getStaffFlagValue("manageHouses"), true, true), @@ -340,6 +342,7 @@ function loadCommands() { commandData("nonrpname", forceCharacterNameChangeCommand, "<player name/id>", getStaffFlagValue("basicModeration"), true, true, "Forces a player to change their current character's name."), commandData("forcename", forceCharacterNameCommand, "<player name/id> <first name> <last name>", getStaffFlagValue("basicModeration"), true, true, "Changes a character's name directly."), commandData("forceskin", forcePlayerSkinCommand, "<player name/id> <skin id/name>", getStaffFlagValue("basicModeration"), true, true, "Changes a character's skin directly."), + commandData("forcefightstyle", forceFightStyleCommand, "<player name/id> <fight style name>", getStaffFlagValue("basicModeration"), true, true, "Changes a character's fight style."), commandData("plrinfo", getPlayerInfoCommand, "<player name/id>", getStaffFlagValue("basicModeration"), true, true, "Shows basic info about the specified player"), commandData("getplrhouse", getAllHousesOwnedByPlayerCommand, "<player name/id>", getStaffFlagValue("basicModeration"), true, true, "Shows a list of all houses owned by the player"), commandData("getplrbiz", getAllBusinessesOwnedByPlayerCommand, "<player name/id>", getStaffFlagValue("basicModeration"), true, true, "Shows a list of all businesses owned by the player"), @@ -407,7 +410,8 @@ function loadCommands() { commandData("vehbuyprice", setVehicleBuyPriceCommand, "", getStaffFlagValue("none"), true, true), commandData("stoprent", stopRentingVehicleCommand, "", getStaffFlagValue("none"), true, true), commandData("vehbuy", buyVehicleCommand, "", getStaffFlagValue("none"), true, true), - commandData("vehcolour", setVehicleColourCommand, "<colour1> <colour2>", getStaffFlagValue("none"), true, true), + commandData("vehcolour", vehicleColourCommand, "<colour1> <colour2>", getStaffFlagValue("none"), true, true), + commandData("vehlivery", vehicleLiveryCommand, "<livery id>", getStaffFlagValue("none"), true, true), commandData("vehrepair", vehicleRepairCommand, "", getStaffFlagValue("none"), true, true), commandData("passenger", enterVehicleAsPassengerCommand, "", getStaffFlagValue("none"), true, true), ], diff --git a/scripts/server/core.js b/scripts/server/core.js index 1baae3e9..3d973095 100644 --- a/scripts/server/core.js +++ b/scripts/server/core.js @@ -9,7 +9,7 @@ let scriptVersion = "1.0"; let serverStartTime = 0; -let logLevel = LOG_ALL; +let logLevel = LOG_DEBUG; // =========================================================================== diff --git a/scripts/server/event.js b/scripts/server/event.js index 191dd301..2ad73b3c 100644 --- a/scripts/server/event.js +++ b/scripts/server/event.js @@ -251,6 +251,36 @@ async function onPlayerEnteredVehicle(client, clientVehicle, seat) { messagePlayerTip(client, `Use /vehrent if you want to rent it.`); resetVehiclePosition(vehicle); } else { + let ownerName = "Nobody"; + let ownerType = "None"; + ownerType = toLowerCase(getVehicleOwnerTypeText(getVehicleData(vehicle).ownerType)); + switch(vehicleData.ownerType) { + case VRR_VEHOWNER_CLAN: + ownerName = getClanData(getVehicleData(vehicle).ownerId).name; + ownerType = "clan"; + break; + + case VRR_VEHOWNER_JOB: + ownerName = getJobData(getJobIdFromDatabaseId(getVehicleData(vehicle).ownerId)).name; + ownerType = "job"; + break; + + case VRR_VEHOWNER_PLAYER: + let subAccountData = loadSubAccountFromId(getVehicleData(vehicle).ownerId); + ownerName = `${subAccountData.firstName} ${subAccountData.lastName} [${subAccountData.databaseId}]`; + ownerType = "player"; + break; + + case VRR_VEHOWNER_BIZ: + ownerName = getBusinessData(getVehicleData(vehicle).ownerId).name; + ownerType = "business"; + break; + + default: + break; + } + messagePlayerAlert(client, `This ${getVehicleName(vehicle)} belongs to ${getInlineChatColourByName("lightGrey")}${ownerName} (${ownerType})`); + if(!getVehicleData(vehicle).engine) { if(doesPlayerHaveVehicleKeys(client, vehicle)) { if(!doesPlayerHaveKeyBindsDisabled(client) && doesPlayerHaveKeyBindForCommand(client, "engine")) { @@ -472,8 +502,7 @@ function onPlayerSpawn(client) { logToConsole(LOG_DEBUG, `[VRR.Event] Setting player walk and fightstyle for ${getPlayerDisplayForConsole(client)}`); setEntityData(client.player, "vrr.walkStyle", getPlayerCurrentSubAccount(client).walkStyle, true); - let fightStyleId = getPlayerCurrentSubAccount(client).fightStyle; - setEntityData(client.player, "vrr.fightStyle", [getGameData().fightStyles[getServerGame()][fightStyleId][1][0], getGameData().fightStyles[getServerGame()][fightStyleId][1][1]], true); + setPlayerFightStyle(client, getPlayerCurrentSubAccount(client).fightStyle); } logToConsole(LOG_DEBUG, `[VRR.Event] Updating logo state for ${getPlayerDisplayForConsole(client)}`); @@ -501,6 +530,24 @@ function onPlayerSpawn(client) { sendPlayerEnterPropertyKey(client, keyId.key); } + if(isGTAIV()) { + setEntityData(client.player, "vrr.bodyPartHair", getPlayerCurrentSubAccount(client).bodyParts.hair, true); + setEntityData(client.player, "vrr.bodyPartHead", getPlayerCurrentSubAccount(client).bodyParts.head, true); + setEntityData(client.player, "vrr.bodyPartUpper", getPlayerCurrentSubAccount(client).bodyParts.upper, true); + setEntityData(client.player, "vrr.bodyPartLower", getPlayerCurrentSubAccount(client).bodyParts.lower, true); + + setEntityData(client.player, "vrr.bodyPropHair", getPlayerCurrentSubAccount(client).bodyProps.hair, true); + setEntityData(client.player, "vrr.bodyPropEyes", getPlayerCurrentSubAccount(client).bodyProps.eyes, true); + setEntityData(client.player, "vrr.bodyPartHead", getPlayerCurrentSubAccount(client).bodyProps.head, true); + setEntityData(client.player, "vrr.bodyPartLeftHand", getPlayerCurrentSubAccount(client).bodyProps.leftHand, true); + setEntityData(client.player, "vrr.bodyPartRightHand", getPlayerCurrentSubAccount(client).bodyProps.rightHand, true); + setEntityData(client.player, "vrr.bodyPartLeftWrist", getPlayerCurrentSubAccount(client).bodyProps.leftWrist, true); + setEntityData(client.player, "vrr.bodyPartRightWrist", getPlayerCurrentSubAccount(client).bodyProps.rightWrist, true); + setEntityData(client.player, "vrr.bodyPartHip", getPlayerCurrentSubAccount(client).bodyProps.hip, true); + setEntityData(client.player, "vrr.bodyPartLeftFoot", getPlayerCurrentSubAccount(client).bodyProps.leftFoot, true); + setEntityData(client.player, "vrr.bodyPartRightFoot", getPlayerCurrentSubAccount(client).bodyProps.rightFoot, true); + } + logToConsole(LOG_DEBUG, `[VRR.Event] Setting ${getPlayerDisplayForConsole(client)}'s ped state to ready`); getPlayerData(client).pedState = VRR_PEDSTATE_READY; @@ -520,6 +567,8 @@ function onPlayerSpawn(client) { if(getPlayerCurrentSubAccount(client).inHouse > 0) { setEntityData(client.player, "vrr.inHouse", getHouseIdFromDatabaseId(getPlayerCurrentSubAccount(client).inHouse), true); } + + //} } diff --git a/scripts/server/help.js b/scripts/server/help.js index 6455d3af..cff3d8d3 100644 --- a/scripts/server/help.js +++ b/scripts/server/help.js @@ -26,6 +26,12 @@ let randomTips = [ `${getInlineChatColourByName("white")}Want to buy a business? Use /bizbuy at one for sale`, `${getInlineChatColourByName("white")}Want to buy a house? Use /housebuy at one for sale`, `${getInlineChatColourByName("white")}Want to buy a vehicle? Visit a dealership and enter one for info on how to buy it!`, + `${getInlineChatColourByName("white")}Switch to any of your characters with ${getInlineChatColourByName("lightGrey")}/switchchar`, + `${getInlineChatColourByName("white")}Use ${getInlineChatColourByName("lightGrey")}/iplogin ${getInlineChatColourByName("white")}to automatically login when connecting with the same IP`, + `${getInlineChatColourByName("white")}Use ${getInlineChatColourByName("lightGrey")}/houselights or /bizlights ${getInlineChatColourByName("white")}to turn on/off the lights in your house or business`, + `${getInlineChatColourByName("white")}Use ${getInlineChatColourByName("lightGrey")}/radiostation ${getInlineChatColourByName("white")}to play an internet radio station in your car, house, or business`, + //`${getInlineChatColourByName("white")}Lower your car windows with /windows ${getInlineChatColourByName("lightGrey")} to play the vehicle's internet radio station ${getInlineChatColourByName("lightGrey")}(/radiostation) ${getInlineChatColourByName("white")}to nearby players`, + //`${getInlineChatColourByName("white")}Lower your car windows with /windows ${getInlineChatColourByName("lightGrey")} to play the vehicle's internet radio station ${getInlineChatColourByName("lightGrey")}(/radiostation) ${getInlineChatColourByName("white")}to nearby players`, //`${getInlineChatColourByName("white")}Tax is based on your total wealth. This includes money, vehicles, businesses and more.`, //`${getInlineChatColourByName("white")}Don't go broke because of a hospital bill! Get insured today by visiting an insurance agency!`, //`${getInlineChatColourByName("white")}Don't go broke because your car was destroyed. Visit an insurance agency today!`, @@ -55,6 +61,11 @@ function helpCommand(command, params, client) { break; case "vehicle": + case "veh": + case "vehs": + case "vehicles": + case "car": + case "cars": showVehicleHelpMessage(client); break; @@ -87,12 +98,16 @@ function helpCommand(command, params, client) { break; case "anim": + case "anims": case "animation": + case "animations": showAnimationHelpMessage(client); break; case "ammunation": case "ammu": + case "gun": + case "guns": showAmmunationHelpMessage(client); break; @@ -119,6 +134,17 @@ function helpCommand(command, params, client) { } break; + case "clan": + case "clans": + case "group": + case "groups": + case "faction": + case "factions": + case "family": + case "families": + showClanHelpMessage(client); + break; + default: showMainHelpMessage(client); break; @@ -140,6 +166,7 @@ function helpCommand(command, params, client) { // == Bindable Keys ============================ // == Clothes ================================== // == Business ================================= +// == Clan Help ================================ // == Command Info ============================= // == Player Vehicles ========================== // == Player Businesses ======================== @@ -282,6 +309,17 @@ function showBusinessHelpMessage(client) { // =========================================================================== +function showClanHelpMessage(client) { + messagePlayerInfo(client, `${getInlineChatColourByType("clanOrange")}== ${getInlineChatColourByType("jobYellow")}Clan ${getInlineChatColourByType("clanOrange")}================================`); + messagePlayerNormal(client, `${getInlineChatColourByType("clanOrange")}• ${getInlineChatColourByName("white")}Use ${getInlineChatColourByName("lightGrey")}/addclan ${getInlineChatColourByName("white")}to create a clan (Similar to factions/groups/families)`); + messagePlayerNormal(client, `${getInlineChatColourByType("clanOrange")}• ${getInlineChatColourByName("white")}Clan commands: ${getInlineChatColourByName("lightGrey")}/clan, /clanmotd, /clanname, /clanowner, /clanhouse, /clanbiz, /claninvite, /clanuninvite, /clansetrank`); + messagePlayerNormal(client, `${getInlineChatColourByType("clanOrange")}• ${getInlineChatColourByName("white")}${getInlineChatColourByName("lightGrey")}/clanflags, /clanaddrank, /clandelrank, /clanaddrankflag, /clandelrankflag, /clanaddmemberflag, /clandelmemberflag`); + messagePlayerNormal(client, `${getInlineChatColourByType("clanOrange")}• ${getInlineChatColourByName("white")}${getInlineChatColourByName("lightGrey")}/clanranks, /clanaddrank, /clandelrank, /clanrankname, /clanaddrankflag, /clandelrankflag`); + messagePlayerNormal(client, `${getInlineChatColourByType("clanOrange")}• ${getInlineChatColourByName("white")}${getInlineChatColourByName("lightGrey")}/clanaddmemberflag, /clandelmemberflag`); +} + +// =========================================================================== + function showCommandHelpMessage(client, commandName) { if(!commandName) { messagePlayerSyntax(client, `${getCommandSyntaxText("help")} command <command name>`); diff --git a/scripts/server/house.js b/scripts/server/house.js index e6fc02b0..ed36b5c5 100644 --- a/scripts/server/house.js +++ b/scripts/server/house.js @@ -214,11 +214,18 @@ function setHouseOwnerCommand(command, params, client) { return false; } + if(!doesPlayerHaveStaffPermission(client, getStaffFlagValue("manageHouses"))) { + if(getHouseData(houseId).ownerType == VRR_HOUSEOWNER_PLAYER && getHouseData(houseId).ownerId == getPlayerCurrentSubAccount(client).databaseId) { + messagePlayerError(client, "You don't own this house!"); + return false; + } + } + getHouseData(houseId).needsSaved = true; getHouseData(houseId).ownerType = VRR_HOUSEOWNER_PLAYER; getHouseData(houseId).ownerId = getServerData().clients[newHouseOwner.index].accountData.databaseId; - messageAdmins(`${getInlineChatColourByName("lightGrey")}${getPlayerName(client)} ${getInlineChatColourByName("white")}set house ${getInlineChatColourByType("houseGreen")}${getHouseData(houseId).description} ${getInlineChatColourByName("white")}owner to ${getInlineChatColourByName("lightGrey")}${newHouseOwner.name}`); + messagePlayerSuccess(`${getInlineChatColourByName("white")}You gave house ${getInlineChatColourByType("houseGreen")}${getHouseData(houseId).description} ${getInlineChatColourByName("white")}to ${getInlineChatColourByName("lightGrey")}${newHouseOwner.name}`); } // =========================================================================== @@ -235,23 +242,78 @@ function setHouseOwnerCommand(command, params, client) { function setHouseClanCommand(command, params, client) { let houseId = toInteger((isPlayerInAnyHouse(client)) ? getPlayerHouse(client) : getClosestHouseEntrance(getPlayerPosition(client))); - let clan = getClanFromParams(params); - - if(!clan) { - messagePlayerError(client, "That clan is invalid or doesn't exist!"); - return false; - } - if(!getHouseData(houseId)) { messagePlayerError("House not found!"); return false; } + let clanId = getPlayerClan(params); + + if(!getClanData(clanId)) { + messagePlayerError(client, "Clan not found!"); + return false; + } + + if(!doesPlayerHaveStaffPermission(client, getStaffFlagValue("manageHouses"))) { + if(getHouseData(houseId).ownerType == VRR_HOUSEOWNER_PLAYER && getHouseData(houseId).ownerId == getPlayerCurrentSubAccount(client).databaseId) { + messagePlayerError(client, "You don't own this house!"); + return false; + } + } + getHouseData(houseId).needsSaved = true; getHouseData(houseId).ownerType = VRR_HOUSEOWNER_CLAN; getHouseData(houseId).ownerId = getClanData(clanId).databaseId; - messageAdmins(`${getInlineChatColourByName("lightGrey")}${getPlayerName(client)} ${getInlineChatColourByName("white")}set house ${getInlineChatColourByType("houseGreen")}${getHouseData(houseId).description} ${getInlineChatColourByName("white")}owner to the ${getInlineChatColourByType("clanOrange")}${getClanData(clanId).name} ${getInlineChatColourByName("white")}clan!`); + messagePlayerSuccess(`${getInlineChatColourByName("white")}You gave house ${getInlineChatColourByType("houseGreen")}${getHouseData(houseId).description} ${getInlineChatColourByName("white")} to the ${getInlineChatColourByType("clanOrange")}${getClanData(clanId).name} ${getInlineChatColourByName("white")}clan!`); +} + +// =========================================================================== + +/** + * This is a command handler function. + * + * @param {string} command - The command name used by the player + * @param {string} params - The parameters/args string used with the command by the player + * @param {Client} client - The client/player that used the command + * @return {bool} Whether or not the command was successful + * + */ + function setHouseRankCommand(command, params, client) { + let houseId = toInteger((isPlayerInAnyHouse(client)) ? getPlayerHouse(client) : getClosestHouseEntrance(getPlayerPosition(client))); + + if(!getHouseData(houseId)) { + messagePlayerError("House not found!"); + return false; + } + + let clanId = getPlayerClan(params); + + if(!getClanData(clanId)) { + messagePlayerError(client, "Clan not found!"); + return false; + } + + let clanRankId = getClanRankFromParams(clanId, params); + + if(!getClanRankData(clanId, clanRankId)) { + messagePlayerError(client, "Clan rank not found!"); + return false; + } + + if(doesPlayerHaveClanPermission(client, getClanFlagValue("manageHouses"))) { + messagePlayerError(client, "You can't set clan house ranks!"); + return false; + } + + if(getClanRankData(clanId, clanRankId).level > getPlayerCurrentSubAccount(client).clanRank) { + messagePlayerError(client, "That rank is above your level!"); + return false; + } + + getHouseData(houseId).clanRank = getClanRankData(clanId, clanRankId).level; + getHouseData(houseId).needsSaved = true; + messagePlayerSuccess(`${getInlineChatColourByName("white")}You set house ${getInlineChatColourByType("houseGreen")}${getHouseData(houseId).description}${getInlineChatColourByName("white")}'s clan rank to ${getInlineChatColourByType("clanOrange")}${getClanRankData(clanId, clanRankId).name} ${getInlineChatColourByName("white")}(level ${getClanRankData(clanId, clanRankId).level}) and above!`); } // =========================================================================== @@ -605,6 +667,19 @@ function getClosestHouseEntrance(position) { // =========================================================================== +function getClosestHouseExit(position) { + let houses = getServerData().houses; + let closest = 0; + for(let i in houses) { + if(getDistance(houses[i].exitPosition, position) <= getDistance(houses[closest].exitPosition, position)) { + closest = i; + } + } + return closest; +} + +// =========================================================================== + function getPlayerHouse(client) { if(doesEntityDataExist(client, "vrr.inHouse")) { return getEntityData(client, "vrr.inHouse"); @@ -1184,4 +1259,44 @@ function updateHouseInteriorLightsForOccupants(houseId) { } } +// =========================================================================== + +function canPlayerSetHouseInteriorLights(client, houseId) { + if(doesPlayerHaveStaffPermission(client, getStaffFlagValue("manageHouses"))) { + return true; + } + + if(getHouseData(houseId).ownerType == VRR_HOUSEOWNER_PLAYER && getHouseData(houseId).ownerId == getPlayerCurrentSubAccount(client).databaseId) { + return true; + } + + if(getHouseData(houseId).ownerType == VRR_HOUSEOWNER_CLAN && getHouseData(houseId).ownerId == getClanData(getPlayerClan(client)).databaseId) { + if(doesPlayerHaveClanPermission(client, getClanFlagValue("manageHouses"))) { + return true; + } + } + + return false; +} + +// =========================================================================== + +function canPlayerLockUnlockHouse(client, houseId) { + if(doesPlayerHaveStaffPermission(client, getStaffFlagValue("manageHouses"))) { + return true; + } + + if(getHouseData(houseId).ownerType == VRR_HOUSEOWNER_PLAYER && getHouseData(houseId).ownerId == getPlayerCurrentSubAccount(client).databaseId) { + return true; + } + + if(getHouseData(houseId).ownerType == VRR_HOUSEOWNER_CLAN && getHouseData(houseId).ownerId == getClanData(getPlayerClan(client)).databaseId) { + if(doesPlayerHaveClanPermission(client, getClanFlagValue("manageHouses"))) { + return true; + } + } + + return false; +} + // =========================================================================== \ No newline at end of file diff --git a/scripts/server/item.js b/scripts/server/item.js index 06786939..5a878ccc 100644 --- a/scripts/server/item.js +++ b/scripts/server/item.js @@ -663,15 +663,18 @@ function playerUseItem(client, hotBarSlot) { case VRR_ITEM_USETYPE_WALKIETALKIE: getItemData(itemIndex).enabled = !getItemData(itemIndex).enabled; - messagePlayerAlert(client, `You turned ${getBoolRedGreenInlineColour(getItemData(itemIndex).enabled)}${toUpperCase(getOnOffFromBool(getItemData(itemIndex).enabled))} ${getInlineChatColourByName("white")}your walkie talkie in slot ${getPlayerData(client).activeHotBarSlot+1} ${getInlineChatColourByName("lightGrey")}(${getItemValueDisplayForItem(itemIndex)})`); + //messagePlayerAlert(client, `You turned ${getBoolRedGreenInlineColour(getItemData(itemIndex).enabled)}${toUpperCase(getOnOffFromBool(getItemData(itemIndex).enabled))} ${getInlineChatColourByName("white")}your walkie talkie in slot ${getPlayerData(client).activeHotBarSlot+1} ${getInlineChatColourByName("lightGrey")}${getItemValueDisplayForItem(itemIndex)}`); + meActionToNearbyPlayers(client, `turns ${toLowerCase(getOnOffFromBool(getItemData(itemIndex).enabled))} their walkie-talkie`); break; case VRR_ITEM_USETYPE_PHONE: getItemData(itemIndex).enabled = !getItemData(itemIndex).enabled; if(getItemData(itemIndex).enabled) { - messagePlayerAlert(client, `You turned on your phone in slot ${getPlayerData(client).activeHotBarSlot+1} (${getItemValueDisplayForItem(itemIndex)})`); + //messagePlayerAlert(client, `You turned on your phone in slot ${getPlayerData(client).activeHotBarSlot+1} ${getItemValueDisplayForItem(itemIndex)}`); + meActionToNearbyPlayers(client, `turns on their phone`); } else { - messagePlayerAlert(client, `You turned OFF your phone in slot ${getPlayerData(client).activeHotBarSlot+1}`); + //messagePlayerAlert(client, `You turned OFF your phone in slot ${getPlayerData(client).activeHotBarSlot+1}`); + meActionToNearbyPlayers(client, `turns off their phone`); } break; @@ -1357,9 +1360,14 @@ function playerItemActionDelayComplete(client) { function getItemValueDisplayForItem(itemId) { if(!getItemData(itemId)) { - return "unknown"; + return "[unknown]"; } - return getItemValueDisplay(getItemData(itemId).itemTypeIndex, getItemData(itemId).value); + + if(isMeleeWeapon(getItemTypeData(getItemData(itemId).itemTypeIndex).useId)) { + return ""; + } + + return `[${getItemValueDisplay(getItemData(itemId).itemTypeIndex, getItemData(itemId).value)}]`; } // =========================================================================== @@ -1416,7 +1424,7 @@ function toggleItemEnabledCommand(command, params, client) { } getItemData(getPlayerActiveItem(client)).enabled = !getItemData(getPlayerActiveItem(client)).enabled; - messagePlayerNormal(client, `You turned ${getBoolRedGreenInlineColour(getItemData(itemIndex).enabled)}${toUpperCase(getOnOffFromBool(getItemData(itemIndex).enabled))} ${getInlineChatColourByName("white")}your ${getItemName(getPlayerActiveItem(client))} in slot ${getPlayerActiveItemSlot(client)} ${getInlineChatColourByName("lightGrey")}(${getItemValueDisplayForItem(getPlayerActiveItem(client))}`) + messagePlayerNormal(client, `You turned ${getBoolRedGreenInlineColour(getItemData(itemIndex).enabled)}${toUpperCase(getOnOffFromBool(getItemData(itemIndex).enabled))} ${getInlineChatColourByName("white")}your ${getItemName(getPlayerActiveItem(client))} in slot ${getPlayerActiveItemSlot(client)} ${getInlineChatColourByName("lightGrey")}${getItemValueDisplayForItem(getPlayerActiveItem(client))}`) } // =========================================================================== @@ -1496,8 +1504,8 @@ function showBusinessFloorInventoryToPlayer(client, businessId) { //itemDisplay.push(`${getInlineChatColourByType("jobYellow")}${toInteger(i)+1}${getInlineChatColourByName("lightGrey")}(Empty)`); messagePlayerNormal(client, `${getInlineChatColourByName("yellow")}${toInteger(i)+1}${getInlineChatColourByName("lightGrey")}(Empty)`, COLOUR_WHITE); } else { - //itemDisplay.push(`${getInlineChatColourByType("jobYellow")}${toInteger(i)+1}: ${getInlineChatColourByName("white")}${getItemTypeData(getItemData(getBusinessData(businessId).floorItemCache[i]).itemTypeIndex).name}${getInlineChatColourByName("lightGrey")}[${getItemValueDisplayForItem(getBusinessData(businessId).floorItemCache[i])}] - [${(getPlayerCurrentSubAccount(client).cash<getItemData(getBusinessData(businessId).floorItemCache[i]).buyPrice) ? rgbToHex(205, 60, 60) : rgbToHex(50, 205, 50)}]$${getItemData(getBusinessData(businessId).floorItemCache[i]).buyPrice} [#CCCCCC] - ${getItemData(getBusinessData(businessId).floorItemCache[i]).amount} available`); - messagePlayerNormal(client, `${getInlineChatColourByName("yellow")}${toInteger(i)+1}: ${getInlineChatColourByName("white")}${getItemTypeData(getItemData(getBusinessData(businessId).floorItemCache[i]).itemTypeIndex).name}${getInlineChatColourByName("lightGrey")}[${getItemValueDisplayForItem(getBusinessData(businessId).floorItemCache[i])}] - [${(getPlayerCurrentSubAccount(client).cash<getItemData(getBusinessData(businessId).floorItemCache[i]).buyPrice) ? rgbToHex(205, 60, 60) : rgbToHex(50, 205, 50)}]$${getItemData(getBusinessData(businessId).floorItemCache[i]).buyPrice} [#CCCCCC] - ${getItemData(getBusinessData(businessId).floorItemCache[i]).amount} available`, COLOUR_WHITE); + //itemDisplay.push(`${getInlineChatColourByType("jobYellow")}${toInteger(i)+1}: ${getInlineChatColourByName("white")}${getItemTypeData(getItemData(getBusinessData(businessId).floorItemCache[i]).itemTypeIndex).name}${getInlineChatColourByName("lightGrey")}${getItemValueDisplayForItem(getBusinessData(businessId).floorItemCache[i])} - [${(getPlayerCurrentSubAccount(client).cash<getItemData(getBusinessData(businessId).floorItemCache[i]).buyPrice) ? rgbToHex(205, 60, 60) : rgbToHex(50, 205, 50)}]$${getItemData(getBusinessData(businessId).floorItemCache[i]).buyPrice} [#CCCCCC] - ${getItemData(getBusinessData(businessId).floorItemCache[i]).amount} available`); + messagePlayerNormal(client, `${getInlineChatColourByName("yellow")}${toInteger(i)+1}: ${getInlineChatColourByName("white")}${getItemTypeData(getItemData(getBusinessData(businessId).floorItemCache[i]).itemTypeIndex).name}${getInlineChatColourByName("lightGrey")}${getItemValueDisplayForItem(getBusinessData(businessId).floorItemCache[i])} - [${(getPlayerCurrentSubAccount(client).cash<getItemData(getBusinessData(businessId).floorItemCache[i]).buyPrice) ? rgbToHex(205, 60, 60) : rgbToHex(50, 205, 50)}]$${getItemData(getBusinessData(businessId).floorItemCache[i]).buyPrice} [#CCCCCC] - ${getItemData(getBusinessData(businessId).floorItemCache[i]).amount} available`, COLOUR_WHITE); } //messagePlayerNormal(client, splitItemDisplay[i].join("${getInlineChatColourByName("white")}, "), COLOUR_WHITE); @@ -1523,7 +1531,7 @@ function showBusinessStorageInventoryToPlayer(client, businessId) { if(getBusinessData(businessId).storageItemCache == -1) { itemDisplay.push(`${getInlineChatColourByName("yellow")}${toInteger(i)+1}${getInlineChatColourByName("lightGrey")}(Empty)`); } else { - itemDisplay.push(`${getInlineChatColourByName("yellow")}${toInteger(i)+1}: ${getInlineChatColourByName("white")}${getItemTypeData(getItemData(getBusinessData(businessId).storageItemCache[i]).itemTypeIndex).name}${getInlineChatColourByName("lightGrey")}[${getItemValueDisplayForItem(getBusinessData(businessId).storageItemCache[i])}] - [#CCCCCC]${getItemData(getBusinessData(businessId).storageItemCache[i]).amount} available`); + itemDisplay.push(`${getInlineChatColourByName("yellow")}${toInteger(i)+1}: ${getInlineChatColourByName("white")}${getItemTypeData(getItemData(getBusinessData(businessId).storageItemCache[i]).itemTypeIndex).name}${getInlineChatColourByName("lightGrey")}${getItemValueDisplayForItem(getBusinessData(businessId).storageItemCache[i])} - [#CCCCCC]${getItemData(getBusinessData(businessId).storageItemCache[i]).amount} available`); } } @@ -1548,7 +1556,7 @@ function showItemInventoryToPlayer(client, itemId) { if(getItemData(itemId).itemCache == -1) { itemDisplay.push(`[#CCCCCC]${toInteger(i)+1}${getInlineChatColourByName("lightGrey")}(Empty)`); } else { - itemDisplay.push(`[#CCCCCC]${toInteger(i)+1}: ${getInlineChatColourByName("lightGrey")}${getItemTypeData(getItemData(getItemData(itemId).itemCache[i]).itemTypeIndex).name}[${getItemValueDisplayForItem(getItemData(itemId).itemCache[i])}]`); + itemDisplay.push(`[#CCCCCC]${toInteger(i)+1}: ${getInlineChatColourByName("lightGrey")}${getItemTypeData(getItemData(getItemData(itemId).itemCache[i]).itemTypeIndex).name}${getItemValueDisplayForItem(getItemData(itemId).itemCache[i])}`); } } @@ -1578,7 +1586,7 @@ function showPlayerInventoryToPlayer(client, targetClient) { if(getPlayerData(targetClient).hotBarItems[i] == -1) { itemDisplay.push(`[#CCCCCC]${toInteger(i)+1}: ${colour}(Empty)`); } else { - itemDisplay.push(`[#CCCCCC]${toInteger(i)+1}: ${colour}${getItemTypeData(getItemData(getPlayerData(targetClient).hotBarItems[i]).itemTypeIndex).name}[${getItemValueDisplayForItem(getPlayerData(targetClient).hotBarItems[i])}]`); + itemDisplay.push(`[#CCCCCC]${toInteger(i)+1}: ${colour}${getItemTypeData(getItemData(getPlayerData(targetClient).hotBarItems[i]).itemTypeIndex).name}${getItemValueDisplayForItem(getPlayerData(targetClient).hotBarItems[i])}`); } } @@ -1608,7 +1616,7 @@ function showHouseInventoryToPlayer(client, houseId) { if(getHouseData(houseId).itemCache == -1) { itemDisplay.push(`[#CCCCCC]${toInteger(i)+1}${getInlineChatColourByName("lightGrey")}(Empty)`); } else { - itemDisplay.push(`[#CCCCCC]${toInteger(i)+1}: ${getInlineChatColourByName("lightGrey")}${getItemTypeData(getItemData(getHouseData(houseId).itemCache[i]).itemTypeIndex).name}[${getItemValueDisplayForItem(getBusinessData(houseId).itemCache[i])}]`); + itemDisplay.push(`[#CCCCCC]${toInteger(i)+1}: ${getInlineChatColourByName("lightGrey")}${getItemTypeData(getItemData(getHouseData(houseId).itemCache[i]).itemTypeIndex).name}${getItemValueDisplayForItem(getBusinessData(houseId).itemCache[i])}`); } } diff --git a/scripts/server/item/handcuff.js b/scripts/server/item/handcuff.js index 0ec22b2d..132dccf2 100644 --- a/scripts/server/item/handcuff.js +++ b/scripts/server/item/handcuff.js @@ -30,7 +30,7 @@ function unHandCuffPlayer(client) { // =========================================================================== function isPlayerSurrendered(client) { - return (getPlayerData(client).pedState == VRR_PEDSTATE_TAZED || getPlayerData(client).pedState == VRR_PEDSTATE_HANDSUP); + return true; //(getPlayerData(client).pedState == VRR_PEDSTATE_TAZED || getPlayerData(client).pedState == VRR_PEDSTATE_HANDSUP); } // =========================================================================== \ No newline at end of file diff --git a/scripts/server/native/gtac.js b/scripts/server/native/gtac.js index 6f495e20..adae995f 100644 --- a/scripts/server/native/gtac.js +++ b/scripts/server/native/gtac.js @@ -4286,7 +4286,7 @@ function setPlayerInterior(client, interior) { // =========================================================================== function isPlayerInAnyVehicle(client) { - if(getServerGame() == GAME_GTA_IV) { + if(!doesGameHaveServerElements()) { return (getPlayerData().syncVehicle != null); } else { return (client.player.vehicle != null); @@ -4300,11 +4300,15 @@ function getPlayerVehicleSeat(client) { return false; } - for(let i = 0 ; i <= 8 ; i++) { - if(getPlayerVehicle(client).getOccupant(i) == client.player) { - return i; - } - } + if(!doesGameHaveServerElements()) { + return getPlayerData().syncVehicleSeat; + } else { + for(let i = 0 ; i <= 8 ; i++) { + if(getPlayerVehicle(client).getOccupant(i) == client.player) { + return i; + } + } + } return false; } @@ -4789,4 +4793,27 @@ function setGameTime(hour, minute, minuteDuration = 1000) { } } +// =========================================================================== + +function setPlayerFightStyle(client, fightStyleId) { + if(!isPlayerSpawned(client)) { + return false; + } + + setEntityData(getPlayerElement(client), "vrr.fightStyle", [getGameData().fightStyles[getServerGame()][fightStyleId][1][0], getGameData().fightStyles[getServerGame()][fightStyleId][1][1]]); + forcePlayerToSyncElementProperties(null, getPlayerElement(client)); +} + +// =========================================================================== + +function isPlayerAtGym(client) { + return true; +} + +// =========================================================================== + +function getPlayerElement(client) { + return client.player; +} + // =========================================================================== \ No newline at end of file diff --git a/scripts/server/subaccount.js b/scripts/server/subaccount.js index 3207d40c..5ffb4460 100644 --- a/scripts/server/subaccount.js +++ b/scripts/server/subaccount.js @@ -375,10 +375,11 @@ function selectCharacter(client, characterId = -1) { if(!isGTAIV()) { spawnPlayer(client, spawnPosition, spawnHeading, skin, spawnInterior, spawnDimension); } else { - setPlayerPosition(client, spawnPosition); - setPlayerHeading(client, spawnHeading); - setPlayerSkin(client, skin); - restorePlayerCamera(client); + //setPlayerPosition(client, spawnPosition); + //setPlayerHeading(client, spawnHeading); + //setPlayerSkin(client, skin); + //restorePlayerCamera(client); + spawnPlayer(client, spawnPosition, spawnHeading, skin, spawnInterior, spawnDimension); } logToConsole(LOG_DEBUG, `[VRR.SubAccount] Spawned ${getPlayerDisplayForConsole(client)} as character ID ${getPlayerData(client).currentSubAccount} with skin ${skin} (${spawnPosition.x}, ${spawnPosition.y}, ${spawnPosition.z})`); @@ -544,6 +545,13 @@ function setFightStyleCommand(command, params, client) { return false; } + if(!isPlayerAtGym(client)) { + if(!doesPlayerHaveStaffPermission(client, getStaffFlagValue("basicModeration"))) { + messagePlayerError(client, `You need to be at a gym!`); + return false + } + } + setPlayerFightStyle(client, fightStyleId); messagePlayerSuccess(client, `Your fight style has been set to ${getGameData().fightStyles[getServerGame()][fightStyleId][0]}`) @@ -552,6 +560,53 @@ function setFightStyleCommand(command, params, client) { // =========================================================================== +function forceFightStyleCommand(command, params, client) { + if(areParamsEmpty(params)) { + messagePlayerSyntax(client, getCommandSyntaxText(command)); + return false; + } + + let splitParams = params.split(); + let targetClient = getPlayerFromParams(splitParams[0]); + let fightStyleId = getFightStyleFromParams(splitParams[1]); + + //if(!targetClient) { + // messagePlayerError(client, `Player not found!`); + // return false; + //} + + //if(!getPlayerData(targetClient)) { + // messagePlayerError(client, `Player not found!`); + // return false; + //} + + //if(!isPlayerSpawned(targetClient)) { + // messagePlayerError(client, `That player isn't spawned`); + // return false; + //} + + if(!fightStyleId) { + messagePlayerError(client, `That fight style doesn't exist!`); + messagePlayerError(client, `Fight styles: ${getGameData().fightStyles[getServerGame()].map(fs => fs[0]).join(", ")}`); + return false; + } + + if(!isPlayerAtGym(client)) { + if(!doesPlayerHaveStaffPermission(client, getStaffFlagValue("basicModeration"))) { + messagePlayerError(client, `You need to be at a gym!`); + return false + } + } + + getPlayerCurrentSubAccount(client).fightStyle = fightStyleId; + setPlayerFightStyle(client, fightStyleId); + messagePlayerSuccess(client, `You set ${getCharacterFullName(targetClient)}'s fight style to ${getGameData().fightStyles[getServerGame()][fightStyleId][0]}`) + + return true; +} + +// =========================================================================== + function createDefaultSubAccountServerData(databaseId, thisServerSkin) { for(let i = 1 ; i <= 4 ; i++) { if(i == getServerId()) { diff --git a/scripts/server/utilities.js b/scripts/server/utilities.js index ca985905..650fa500 100644 --- a/scripts/server/utilities.js +++ b/scripts/server/utilities.js @@ -712,6 +712,24 @@ function getWeatherFromParams(params) { return 0; } + +// =========================================================================== + +function getFightStyleFromParams(params) { + if(isNaN(params)) { + for(let i in getGameData().fightStyles[getServerGame()]) { + if(toLowerCase(getGameData().fightStyles[getServerGame()][i][0]).indexOf(toLowerCase(params)) != -1) { + return i; + } + } + } else { + if(typeof getGameData().fightStyles[getServerGame()][params] != "undefined") { + return toInteger(params); + } + } + return 0; +} + // =========================================================================== function getAnimationFromParams(params) { diff --git a/scripts/server/vehicle.js b/scripts/server/vehicle.js index c413b1a0..5b78657e 100644 --- a/scripts/server/vehicle.js +++ b/scripts/server/vehicle.js @@ -426,7 +426,7 @@ function vehicleSirenCommand(command, params, client) { // =========================================================================== -function setVehicleColourCommand(command, params, client) { +function vehicleColourCommand(command, params, client) { if(areParamsEmpty(params) && areThereEnoughParams(params, 2)) { messagePlayerSyntax(client, getCommandSyntaxText(command)); return false; @@ -509,6 +509,49 @@ function vehicleRepairCommand(command, params, client) { // =========================================================================== +function vehicleLiveryCommand(command, params, client) { + if(!isPlayerInAnyVehicle(client)) { + messagePlayerError(client, "You need to be in a vehicle!"); + return false; + } + + let vehicle = getPlayerVehicle(client); + + if(!getVehicleData(vehicle)) { + messagePlayerError(client, "This is a random traffic vehicle and commands can't be used for it."); + return false; + } + + if(!isAtPayAndSpray(getVehiclePosition(vehicle))) { + if(!doesPlayerHaveStaffPermission(client, getStaffFlagValue("manageVehicles"))) { + messagePlayerError(client, "You need to be at a pay-n-spray!"); + return false; + } + } + + if(getPlayerCurrentSubAccount(client).cash < getGlobalConfig().repairVehicleCost) { + messagePlayerError(client, `You don't have enough money to change the vehicle's livery (need $${getGlobalConfig().resprayVehicleCost-getPlayerCurrentSubAccount(client).cash} more!)`); + return false; + } + + let splitParams = params.split(" "); + let livery = toInteger(params) || 3; + + takePlayerCash(client, getGlobalConfig().resprayVehicleCost); + updatePlayerCash(client); + getVehicleData(vehicle).livery = livery; + getVehicleData(vehicle).needsSaved = true; + + setEntityData(vehicle, "vrr.livery", livery, true); + setTimeout(function() { + forcePlayerToSyncElementProperties(null, vehicle); + }, 1000); + + meActionToNearbyPlayers(client, `sets the ${getVehicleName(vehicle)}'s livery/paintjob'`); +} + +// =========================================================================== + function buyVehicleCommand(command, params, client) { if(!isPlayerInAnyVehicle(client)) { messagePlayerError(client, "You need to be in a vehicle!"); @@ -590,6 +633,14 @@ function rentVehicleCommand(command, params, client) { meActionToNearbyPlayers(client, `rents the ${getVehicleName(vehicle)} and receives a set of vehicle keys!`); messagePlayerAlert(client, `You will be charged ${getVehicleData(vehicle).rentPrice} per minute to use this vehicle. To stop renting this vehicle, use /vehrent again.`); + + if(!getVehicleData(vehicle).engine) { + if(!doesPlayerHaveKeyBindsDisabled(client) && doesPlayerHaveKeyBindForCommand(client, "engine")) { + messagePlayerTip(client, `The ${getVehicleName(vehicle)}'s engine is off. Press ${getInlineChatColourByName("lightGrey")}${toUpperCase(getKeyNameFromId(getPlayerKeyBindForCommand(client, "engine").key))} ${getInlineChatColourByName("white")}to start it.`); + } else { + messagePlayerAlert(client, `The ${getVehicleName(vehicle)}'s engine is off. Use /engine to start it`); + } + } } // =========================================================================== @@ -649,7 +700,7 @@ function doesPlayerHaveVehicleKeys(client, vehicle) { } if(vehicleData.ownerType == VRR_VEHOWNER_JOB) { - if(getJobType(vehicleData.ownerId) == getJobType(getPlayerCurrentSubAccount(client).job)) { + if(vehicleData.ownerId == getJobType(getPlayerCurrentSubAccount(client).job)) { return true; } } @@ -924,7 +975,7 @@ function getVehicleInfoCommand(command, params, client) { break; case VRR_VEHOWNER_JOB: - ownerName = getJobData(vehicleData.ownerId).name; + ownerName = getJobData(getJobIdFromDatabaseId(vehicleData.ownerId)).name; ownerType = "job"; break; @@ -943,7 +994,7 @@ function getVehicleInfoCommand(command, params, client) { break; } - messagePlayerNormal(client, `🚗 ${getInlineChatColourByType("vehiclePurple")}[Vehicle Info] ${getInlineChatColourByName("white")}ID: ${getInlineChatColourByName("lightGrey")}${vehicle.id}, ${getInlineChatColourByName("white")}DatabaseID: ${getInlineChatColourByName("lightGrey")}${vehicleData.databaseId}, ${getInlineChatColourByName("white")}Owner: ${getInlineChatColourByName("lightGrey")}${ownerName}[ID ${vehicleData.ownerId}] (${ownerType}), ${getInlineChatColourByName("white")}Type: ${getInlineChatColourByName("lightGrey")}${getVehicleName(vehicle)}[${vehicle.modelIndex}], ${getInlineChatColourByName("white")}BuyPrice: ${getInlineChatColourByName("lightGrey")}${vehicleData.buyPrice}, ${getInlineChatColourByName("white")}RentPrice: ${getInlineChatColourByName("lightGrey")}${vehicleData.rentPrice}`); + messagePlayerNormal(client, `🚗 ${getInlineChatColourByType("vehiclePurple")}[Vehicle Info] ${getInlineChatColourByName("white")}ID: ${getInlineChatColourByName("lightGrey")}${getElementId(vehicle)}, ${getInlineChatColourByName("white")}DatabaseID: ${getInlineChatColourByName("lightGrey")}${vehicleData.databaseId}, ${getInlineChatColourByName("white")}Owner: ${getInlineChatColourByName("lightGrey")}${ownerName}[ID ${vehicleData.ownerId}] (${ownerType}), ${getInlineChatColourByName("white")}Type: ${getInlineChatColourByName("lightGrey")}${getVehicleName(vehicle)}[${vehicle.modelIndex}], ${getInlineChatColourByName("white")}BuyPrice: ${getInlineChatColourByName("lightGrey")}${vehicleData.buyPrice}, ${getInlineChatColourByName("white")}RentPrice: ${getInlineChatColourByName("lightGrey")}${vehicleData.rentPrice}`); } // =========================================================================== @@ -1082,27 +1133,30 @@ function spawnVehicle(vehicleData) { let vehicle = gta.createVehicle(vehicleData.model, vehicleData.spawnPosition, vehicleData.spawnRotation); addToWorld(vehicle); - if(vehicleData.colour1IsRGBA && vehicleData.colour2IsRGBA) { - vehicle.setRGBColours(vehicleData.colour1RGBA, vehicleData.colour2RGBA); - } else { - vehicle.colour1 = vehicleData.colour1; - vehicle.colour2 = vehicleData.colour2; - vehicle.colour3 = vehicleData.colour3; - vehicle.colour4 = vehicleData.colour4; + if(doesGameHaveServerElements()) { + if(vehicleData.colour1IsRGBA && vehicleData.colour2IsRGBA) { + vehicle.setRGBColours(vehicleData.colour1RGBA, vehicleData.colour2RGBA); + } else { + vehicle.colour1 = vehicleData.colour1; + vehicle.colour2 = vehicleData.colour2; + vehicle.colour3 = vehicleData.colour3; + vehicle.colour4 = vehicleData.colour4; + } + + vehicle.engine = intToBool(vehicleData.engine); + //vehicle.lights = intToBool(vehicleData.lights); + //vehicle.health = vehicleData.health; + + //vehicle.position = vehicleData.spawnPosition; + vehicle.heading = vehicleData.spawnRotation; + + vehicle.locked = intToBool(vehicleData.locked); } - vehicle.engine = intToBool(vehicleData.engine); - //vehicle.lights = intToBool(vehicleData.lights); - //vehicle.health = vehicleData.health; - - //vehicle.position = vehicleData.spawnPosition; - vehicle.heading = vehicleData.spawnRotation; - - vehicle.locked = intToBool(vehicleData.locked); - vehicleData.vehicle = vehicle; setEntityData(vehicle, "vrr.livery", vehicleData.livery); + setEntityData(vehicle, "vrr.upgrades", vehicleData.extras); return vehicle; } diff --git a/scripts/shared/native/gtac.js b/scripts/shared/native/gtac.js index 859f0da1..786c8e83 100644 --- a/scripts/shared/native/gtac.js +++ b/scripts/shared/native/gtac.js @@ -1072,6 +1072,10 @@ function isCustomCameraSupported() { // =========================================================================== function areWorldLabelsSupported() { + if(isGTAIV()) { + return false; + } + return true; }