Bunch of fixes/changes

* Set client log level to info
* Added element prop sync util
* Added check to make sure veh upgrade was valid
* Fixed incorrect acct settings being saved
* Added help tip when using invalid anim
* Fixed create biz cmd
* Allow biz owners to set biz name
* Allow biz owners to give biz to player or clan
* Added biz clan rank cmd
* Allow those with permission to lock/unlock biz & houses
* Fix set biz interior
* Allow players with permission to withdraw from biz till
* Added utils to check if player has biz permissions for till/lock/lights
* Added check if players are in same int/vw on talk/shout/whisper
* Follow server civilians cvar when toggling ambience
* Renamed some clan cmds to prefix with "clan"
* Added vehlivery cmd
* Set server log level to debug
* Show veh owner info on enter
* Sync body parts & props on IV
* Add clan help in help cmd
* Don't show values for melee weapons
* Add IV support for some utils
* Sync player ped fight style in SA
* Added fightstyle cmd
* Fix wrong job owner on vehinfo cmd
* Return false on world label support util for IV
This commit is contained in:
Vortrex
2021-09-12 13:53:51 -05:00
parent ac4702cc52
commit cfc22a77ee
21 changed files with 680 additions and 128 deletions

View File

@@ -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 = {};

View File

@@ -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);
}
// ===========================================================================
@@ -279,3 +276,9 @@ function updateInteriorLightsState(state) {
}
// ===========================================================================
function forceSyncElementProperties(elementId) {
syncElementProperties(getElementFromId(elementId));
}
// ===========================================================================

View File

@@ -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]);
}
}
}
}

View File

@@ -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!");
}

View File

@@ -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;
}

View File

@@ -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;
@@ -1673,3 +1772,63 @@ 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;
}
// ===========================================================================

View File

@@ -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);
//}
}
}
}

View File

@@ -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"]);

View File

@@ -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);
}
@@ -967,3 +975,9 @@ function updateInteriorLightsForPlayer(client, state) {
}
// ===========================================================================
function forcePlayerToSyncElementProperties(client, element) {
triggerNetworkEvent("vrr.syncElement", client, element.id);
}
// ===========================================================================

View File

@@ -97,6 +97,7 @@ function loadCommands() {
commandData("bizitemprice", setBusinessItemSellPriceCommand, "<item slot> <sell price>", getStaffFlagValue("none"), true, true, "Sets the purchase price of a business item"),
commandData("bizname", setBusinessNameCommand, "<name>", getStaffFlagValue("none"), true, true, "Changes a business name"),
commandData("bizowner", setBusinessOwnerCommand, "<player name/id>", 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, "<amount>", getStaffFlagValue("none"), true, true, "Changes the owner of a business"),
commandData("bizblip", setBusinessBlipCommand, "<type name/model id>", getStaffFlagValue("manageBusinesses"), true, true, "Sets the business blip display"),
commandData("bizpickup", setBusinessPickupCommand, "<type name/model id>", getStaffFlagValue("manageBusinesses"), true, true, "Sets the business pickup display"),
@@ -132,21 +133,21 @@ function loadCommands() {
commandData("addclan", createClanCommand, "<name>", getStaffFlagValue("manageClans"), true, true, "Creates an new empty, unowned clan."),
commandData("delclan", deleteClanCommand, "<clan id>", getStaffFlagValue("manageClans"), true, true, "Deletes a clan by ID or name"),
commandData("addclanrank", createClanRankCommand, "<rank id> <name>", getStaffFlagValue("none"), true, true, "Adds a clan rank"),
commandData("delclanrank", deleteClanRankCommand, "<rank name>", getStaffFlagValue("none"), true, true, "Removes a clan rank"),
commandData("clanaddrank", createClanRankCommand, "<rank id> <name>", getStaffFlagValue("none"), true, true, "Adds a clan rank"),
commandData("clandelrank", deleteClanRankCommand, "<rank name>", getStaffFlagValue("none"), true, true, "Removes a clan rank"),
commandData("setclanrank", setClanMemberRankCommand, "<player name/id> <rank name>", getStaffFlagValue("none"), true, true, "Sets the rank of a clan member"),
commandData("clansetrank", setClanMemberRankCommand, "<player name/id> <rank name>", getStaffFlagValue("none"), true, true, "Sets the rank of a clan member"),
commandData("clanowner", setClanOwnerCommand, "<clan id> <player name/id>", getStaffFlagValue("none"), true, true, "Gives ownership of the clan to a player"),
commandData("clanowner", setClanOwnerCommand, "<player name/id>", getStaffFlagValue("none"), true, true, "Gives ownership of the clan to a player"),
commandData("clantag", setClanTagCommand, "<tag>", getStaffFlagValue("none"), true, true, "Sets a clan's main tag"),
commandData("clanranktag", setClanRankTagCommand, "<rank id> <tag>", getStaffFlagValue("none"), true, true, "Sets a clan rank's custom tag"),
commandData("clanranktag", setClanRankTagCommand, "<rank name/id> <tag>", getStaffFlagValue("none"), true, true, "Sets a clan rank's custom tag"),
commandData("clanmembertag", setClanMemberTagCommand, "<player name/id> <tag>", getStaffFlagValue("none"), true, true, "Sets a clan members's custom tag"),
commandData("clanranktitle", setClanRankTitleCommand, "<rank id> <title>", 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),
],

View File

@@ -9,7 +9,7 @@
let scriptVersion = "1.0";
let serverStartTime = 0;
let logLevel = LOG_ALL;
let logLevel = LOG_DEBUG;
// ===========================================================================

View File

@@ -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);
}
//}
}

View File

@@ -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>`);

View File

@@ -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");
@@ -1185,3 +1260,43 @@ 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;
}
// ===========================================================================

View File

@@ -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])}`);
}
}

View File

@@ -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);
}
// ===========================================================================

View File

@@ -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;
}
@@ -4790,3 +4794,26 @@ 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;
}
// ===========================================================================

View File

@@ -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()) {

View File

@@ -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) {

View File

@@ -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;
}

View File

@@ -1072,6 +1072,10 @@ function isCustomCameraSupported() {
// ===========================================================================
function areWorldLabelsSupported() {
if(isGTAIV()) {
return false;
}
return true;
}