From e44307991dcabc38110f788964d0e7fec83dca6c Mon Sep 17 00:00:00 2001
From: Vortrex <3858226+VortrexFTW@users.noreply.github.com>
Date: Thu, 24 Feb 2022 15:45:00 -0600
Subject: [PATCH 01/46] Arrange meta.xml client scripts by name
---
meta.xml | 34 +++++++++++++++++-----------------
1 file changed, 17 insertions(+), 17 deletions(-)
diff --git a/meta.xml b/meta.xml
index 33f8807f..e41b8fd1 100644
--- a/meta.xml
+++ b/meta.xml
@@ -25,7 +25,6 @@
-
@@ -112,26 +111,27 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
From 7daa6927704988c2cb6a660d9a5021c0d24ba4fc Mon Sep 17 00:00:00 2001
From: Vortrex <3858226+VortrexFTW@users.noreply.github.com>
Date: Thu, 24 Feb 2022 15:45:30 -0600
Subject: [PATCH 02/46] Offload colour replace to client
---
scripts/client/chatbox.js | 8 +-
scripts/server/colour.js | 367 -----------
scripts/server/locale.js | 3 -
scripts/server/messaging.js | 29 +-
scripts/shared/gamedata.js | 1 +
scripts/shared/utilities.js | 1228 +++++++++++++++++++++++++++++++++++
6 files changed, 1243 insertions(+), 393 deletions(-)
delete mode 100644 scripts/server/colour.js
diff --git a/scripts/client/chatbox.js b/scripts/client/chatbox.js
index 37526c4b..d74eb237 100644
--- a/scripts/client/chatbox.js
+++ b/scripts/client/chatbox.js
@@ -46,11 +46,13 @@ function unBindChatBoxKeys() {
// ===========================================================================
function receiveChatBoxMessageFromServer(messageString, colour) {
- if(bottomMessageIndex => chatBoxHistory.length-1) {
- message(messageString, colour);
+ let colouredString = replaceColoursInMessage(messageString);
+
+ if(bottomMessageIndex >= chatBoxHistory.length-1) {
+ message(colouredString, colour);
bottomMessageIndex = chatBoxHistory.length-1;
}
- addToChatBoxHistory(messageString, colour);
+ addToChatBoxHistory(colouredString, colour);
}
// ===========================================================================
diff --git a/scripts/server/colour.js b/scripts/server/colour.js
deleted file mode 100644
index 3ffe0889..00000000
--- a/scripts/server/colour.js
+++ /dev/null
@@ -1,367 +0,0 @@
-// ===========================================================================
-// Vortrex's Roleplay Resource
-// https://github.com/VortrexFTW/gtac_roleplay
-// ===========================================================================
-// FILE: colour.js
-// DESC: Provides colours, functions and usage
-// TYPE: Server (JavaScript)
-// ===========================================================================
-
-let serverColours = {
- hex: {
- byType: {
- talkMessage: "C8C8C8",
- shoutMessage: "FFFFC8",
- whisperMessage: "828282",
- doActionMessage: "B19CD9",
- meActionMessage: "B19CD9",
- errorMessage: "ED4337",
- syntaxMessage: "C8C8C8",
- normalMessage: "FFFFFF",
- alertMessage: "FFFF00",
- successMessage: "00B400",
- clanChatMessage: "00BE00",
- businessBlue: "0099FF",
- houseGreen: "11CC11",
- clanOrange: "FF9900",
- vehiclePurple: "960096",
- jobYellow: "FFFF00",
- },
- byName: {
- white: "FFFFFF",
- black: "000000",
- red: "FF0000",
- yellow: "FFFF00",
- royalBlue: "0000FF",
- teal: "00FFFF",
- orange: "FF8000",
- softRed: "ED4337",
- softGreen: "32CD32",
- lightPurple: "960096",
- lightGrey: "C8C8C8",
- mediumGrey: "969696",
- darkGrey: "404040",
- policeBlue: "3250C8",
- medicPink: "DB7093",
- firefighterRed: "CD3C3C",
- busDriverGreen: "32A032",
- taxiDriverYellow: "F0E664",
- deliveryPurple: "B19CD9",
- civilianWhite: "C8C8C8",
- burntYellow: "D2D200",
- burntOrange: "D27800",
- bankGreen: "00B400",
- softYellow: "EAC67E",
- businessBlue: "0099FF",
- houseGreen: "11CC11",
- clanOrange: "FF9900",
- vehiclePurple: "960096",
- jobYellow: "FFFF00",
- },
- },
-
- byType: {
- talkMessage: toColour(200, 200, 200),
- shoutMessage: toColour(255, 255, 200),
- whisperMessage: toColour(130, 130, 130),
- doActionMessage: toColour(177, 156, 217, 255),
- meActionMessage: toColour(177, 156, 217, 255),
- errorMessage: toColour(237, 67, 55, 255),
- syntaxMessage: toColour(200, 200, 200, 255),
- normalMessage: toColour(255, 255, 255, 255),
- alertMessage: toColour(255, 255, 0, 255),
- successMessage: toColour(0, 180, 0, 255),
- clanChatMessage: toColour(0, 190, 0, 255),
- },
- byName: {
- white: toColour(255, 255, 255, 255),
- black: toColour(0, 0, 0, 255),
- red: toColour(255, 0, 0, 255),
- yellow: toColour(255, 255, 0, 255),
- royalBlue: toColour(0, 0, 255, 255),
- teal: toColour(0, 255, 255, 255),
- orange: toColour(255, 128, 0, 255),
- softRed: toColour(205, 60, 60, 255),
- softGreen: toColour(50, 205, 50, 255),
- lightPurple: toColour(150, 0, 150, 255),
- lightGrey: toColour(200, 200, 200, 255),
- mediumGrey: toColour(150, 150, 150, 255),
- darkGrey: toColour(64, 64, 64, 255),
- policeBlue: toColour(50, 80, 200, 255),
- medicPink: toColour(219, 112, 147, 255),
- firefighterRed: toColour(205, 60, 60, 255),
- busDriverGreen: toColour(50, 160, 50, 255),
- taxiDriverYellow: toColour(240, 230, 100, 255),
- deliveryPurple: toColour(177, 156, 217, 255),
- civilianWhite: toColour(200, 200, 200, 255),
- burntYellow: toColour(210, 210, 0, 255),
- burntOrange: toColour(210, 120, 0, 255),
- bankGreen: toColour(0, 150, 0, 255),
- softYellow: toColour(234, 198, 126, 255),
- businessBlue: toColour(0, 153, 255, 255),
- houseGreen: toColour(17, 204, 17, 255),
- clanOrange: toColour(255, 153, 0, 255),
- },
-};
-
-// ===========================================================================
-
-function getServerColours() {
- return serverColours;
-}
-
-// ===========================================================================
-
-function getColourByType(typeName) {
- return getServerColours().byType[typeName];
-}
-
-// ===========================================================================
-
-function getColourByName(colourName) {
- return getServerColours().byName[colourName];
-}
-
-// ===========================================================================
-
-function getHexColourByName(colourName) {
- //let rgbaColour = getServerColours().byName[colourName];
- //let rgbaArray = rgbaArrayFromToColour(rgbaColour);
- //return rgbToHex(rgbaArray[0], rgbaArray[1], rgbaArray[2]);
-
- return `#${getServerColours().hex.byName[colourName]}`;
-}
-
-// ===========================================================================
-
-function getHexColourByType(colourName) {
- //let rgbaColour = getServerColours().byType[colourName];
- //let rgbaArray = rgbaArrayFromToColour(rgbaColour);
- //return rgbToHex(rgbaArray[0], rgbaArray[1], rgbaArray[2]);
-
- return `#${getServerColours().hex.byType[colourName]}`;
-}
-
-// ===========================================================================
-
-function getPlayerColour(client) {
- if(getPlayerData(client) != false) {
- if(!isPlayerLoggedIn(client)) {
- return getColourByName("darkGrey");
- } else {
- if(isPlayerWorking(client)) {
- return getJobData(getJobIndexFromDatabaseId(getPlayerCurrentSubAccount(client).job)).colour;
- }
- }
- }
-
- return getColourByName("civilianWhite");
-}
-
-// ===========================================================================
-
-/**
- * Gets the red/green colour depending on bool (red = false, green = true) for inline use in chatbox messages
- *
- * @param {Boolean} boolValue The boolean value
- * @return {String} Red or green inline HEX colour string
- *
- */
-function getBoolRedGreenInlineColour(boolValue) {
- return (!boolValue) ? "{softRed}" : "{softGreen}";
-}
-
-// ===========================================================================
-
-/**
- * Gets an array of RGB colour values from a HEX colour string
- *
- * @param {String} hexColour Hex colour string
- * @return {Array} 3-slot array where each slot is an RGB colour value
- *
- */
-function hexToRgb(h) {
- return [
- '0x'+h[1]+h[2]|0,
- '0x'+h[3]+h[4]|0,
- '0x'+h[5]+h[6]|0
- ];
-}
-
-// ===========================================================================
-
-/**
- * Gets a HEX colour string from RGB values, without brackets (example: #FFFFFF)
- *
- * @param {Number} red Red RGB value
- * @param {Number} green Green RGB value
- * @param {Number} blue Blue RGB value
- * @return {String} HEX colour string
- *
- */
-function rgbToHex(r, g, b) {
- return "#"+((1<<24)+(r<<16)+(g<<8)+ b).toString(16).slice(1);
-}
-
-// ===========================================================================
-
-/**
- * Gets the current colour for a player (affected by job and status)
- *
- * @param {Client} client Player client
- * @return {Number} Colour integer
- *
- */
-function getClientChatColour(client) {
- let tempJob = getPlayerCurrentSubAccount(client).job;
- if(tempJob != -1) {
- if(getPlayerData(client).isWorking) {
- return getJobData(tempJob).jobColour;
- }
- }
- return getColourByName("white");
-}
-
-// ===========================================================================
-
-/**
- * Gets a toColour-created colour integer with random RGB values (alpha is always 255)
- *
- * @return {Number} Colour integer
- *
- */
-function getRandomRGB() {
- return toColour.apply(null, [
- getRandom(0, 255),
- getRandom(0, 255),
- getRandom(0, 255),
- 255
- ]);
-}
-
-// ===========================================================================
-
-/**
- * Gets a hex formatting colour by name for use inline in chatbox messages (example: [#FFFFFF]).
- *
- * @param {String} colourName - Colour name
- * @return {String} HEX-formatted colour string with brackets
- *
- */
-function getInlineChatColourByName(colourName) {
- return `{${colourName}}`;
-}
-
-// ===========================================================================
-
-/**
- * Gets a hex formatting colour by type for use inline in chatbox messages (example: [#FFFFFF]).
- *
- * @param {String} colourName - Colour type
- * @return {String} HEX-formatted colour string with brackets
- *
- */
-function getInlineChatColourByType(colourName) {
- return `{${colourName}}`;
-}
-
-// ===========================================================================
-
-/**
- * Gets an array of RGBA colour values from a toColour integer.
- *
- * @param {Number} colour - Colour integer created by toColour
- * @return {Array} 4-slot array where each slot is an RGBA colour value
- *
- */
-function rgbaArrayFromToColour(colour) {
- //return [
- // (colour >> 24) & 0xFF, // red
- // (colour >> 16) & 0xFF,
- // (colour >> 8) & 0xFF,
- // colour & 0xFF // alpha
- //];
- return [
- (colour >> 16) & 0xFF, // red
- (colour >> 8) & 0xFF,
- colour & 0xFF,
- (colour >> 24) & 0xFF// alpha
- ];
-}
-
-// ===========================================================================
-
-function hexFromToColour(colour) {
- let rgba = rgbaArrayFromToColour(colour);
- return rgbToHex(rgba[0], rgba[1], rgba[2]);
-}
-
-// ===========================================================================
-
-function replaceColoursInMessage(messageText) {
- if(messageText == null) {
- return "";
- }
-
- let tempFind = `{RESETCOLOUR}`;
- let tempRegex = new RegExp(tempFind, 'g');
- messageText = messageText.replace(tempRegex, "[/#]");
-
- tempFind = `{ALTCOLOUR}`;
- tempRegex = new RegExp(tempFind, 'g');
- messageText = messageText.replace(tempRegex, "[#C8C8C8]");
-
- tempFind = `{MAINCOLOUR}`;
- tempRegex = new RegExp(tempFind, 'g');
- messageText = messageText.replace(tempRegex, "[#FFFFFF]");
-
- for(let i in getServerColours().hex.byName) {
- let find = `{${i}}`;
- let re = new RegExp(find, 'g');
- messageText = messageText.replace(re, `[#${getServerColours().hex.byName[i]}]`);
- }
-
- for(let i in getServerColours().hex.byType) {
- let find = `{${i}}`;
- let re = new RegExp(find, 'g');
- messageText = messageText.replace(re, `[#${getServerColours().hex.byType[i]}]`);
- }
-
- return messageText;
-}
-
-// ===========================================================================
-
-function removeColoursInMessage(messageText) {
- if(messageText == null) {
- return "";
- }
-
- let tempFind = `{RESETCOLOUR}`;
- let tempRegex = new RegExp(tempFind, 'g');
- messageText = messageText.replace(tempRegex, "");
-
- tempFind = `{ALTCOLOUR}`;
- tempRegex = new RegExp(tempFind, 'g');
- messageText = messageText.replace(tempRegex, "");
-
- tempFind = `{MAINCOLOUR}`;
- tempRegex = new RegExp(tempFind, 'g');
- messageText = messageText.replace(tempRegex, "");
-
- for(let i in getServerColours().hex.byName) {
- let find = `{${i}}`;
- let re = new RegExp(find, 'g');
- messageText = messageText.replace(re, "");
- }
-
- for(let i in getServerColours().hex.byType) {
- let find = `{${i}}`;
- let re = new RegExp(find, 'g');
- messageText = messageText.replace(re, "");
- }
-
- return messageText;
-}
-
-// ===========================================================================
\ No newline at end of file
diff --git a/scripts/server/locale.js b/scripts/server/locale.js
index f10c0b02..a45ef9e8 100644
--- a/scripts/server/locale.js
+++ b/scripts/server/locale.js
@@ -34,8 +34,6 @@ function getLocaleString(client, stringName, ...args) {
submitBugReport(client, `(AUTOMATED REPORT) Locale string "${stringName}" is missing for "${getPlayerLocaleName(client)}"`);
}
- tempString = replaceColoursInMessage(tempString);
-
for(let i = 1; i <= args.length; i++) {
tempString = tempString.replace(`{${i}}`, args[i-1]);
}
@@ -47,7 +45,6 @@ function getLocaleString(client, stringName, ...args) {
function getGroupedLocaleString(client, stringName, index, ...args) {
let tempString = getRawGroupedLocaleString(stringName, getPlayerData(client).locale, index);
- tempString = replaceColoursInMessage(tempString);
for(let i = 1; i <= args.length; i++) {
tempString = tempString.replace(`{${i}}`, args[i-1]);
diff --git a/scripts/server/messaging.js b/scripts/server/messaging.js
index 91a5608f..e27eb770 100644
--- a/scripts/server/messaging.js
+++ b/scripts/server/messaging.js
@@ -33,19 +33,19 @@ function messageAdminAction(messageText) {
*
*/
function messagePlayerNormal(client, messageText, colour = COLOUR_WHITE) {
- if(isConsole(client) || client == null) {
- logToConsole(LOG_INFO, `${removeColoursInMessage(messageText)}`);
- }
+ //if(isConsole(client) || client == null) {
+ // logToConsole(LOG_INFO, `${removeColoursInMessage(messageText)}`);
+ //}
- sendChatBoxMessageToPlayer(client, `${replaceColoursInMessage(messageText)}`, colour);
+ sendChatBoxMessageToPlayer(client, messageText, colour);
return true;
}
// ===========================================================================
function messageAdmins(messageText, colour = getColourByName("softRed")) {
- let plainMessage = removeColoursInMessage(messageText);
- console.warn(`๐ก๏ธ ${plainMessage}`);
+ //let plainMessage = removeColoursInMessage(messageText);
+ //console.warn(`๐ก๏ธ ${plainMessage}`);
let clients = getClients();
for(let i in clients) {
@@ -54,9 +54,9 @@ function messageAdmins(messageText, colour = getColourByName("softRed")) {
}
}
- if(getServerConfig().discordConfig.sendAdminEvents) {
- messageDiscordAdminChannel(plainMessage);
- }
+ //if(getServerConfig().discordConfig.sendAdminEvents) {
+ // messageDiscordAdminChannel(plainMessage);
+ //}
}
// ===========================================================================
@@ -236,17 +236,6 @@ function clearChatBox(client) {
// ===========================================================================
-function replaceEmojiInString(messageString) {
- for(let i in emojiReplaceString) {
- while(messageString.indexOf(emojiReplaceString[i][0]) != -1) {
- messageString = messageString.replace(emojiReplaceString[i][0], emojiReplaceString[i][1]);
- }
- }
- return messageString;
-}
-
-// ===========================================================================
-
function messagePlayerHelpContent(client, messageString) {
messagePlayerNormal(client, `{clanOrange}โข {MAINCOLOUR}${messageString}`);
}
diff --git a/scripts/shared/gamedata.js b/scripts/shared/gamedata.js
index 6c44119e..497dcdbb 100644
--- a/scripts/shared/gamedata.js
+++ b/scripts/shared/gamedata.js
@@ -5355,3 +5355,4 @@ let gameData = {
],
};
+// ===========================================================================
\ No newline at end of file
diff --git a/scripts/shared/utilities.js b/scripts/shared/utilities.js
index 808ccb91..1cd8fd4a 100644
--- a/scripts/shared/utilities.js
+++ b/scripts/shared/utilities.js
@@ -170,6 +170,963 @@ let cardinalDirections = [
// ===========================================================================
+let serverColours = {
+ hex: {
+ byType: {
+ talkMessage: "C8C8C8",
+ shoutMessage: "FFFFC8",
+ whisperMessage: "828282",
+ doActionMessage: "B19CD9",
+ meActionMessage: "B19CD9",
+ errorMessage: "ED4337",
+ syntaxMessage: "C8C8C8",
+ normalMessage: "FFFFFF",
+ alertMessage: "FFFF00",
+ successMessage: "00B400",
+ clanChatMessage: "00BE00",
+ businessBlue: "0099FF",
+ houseGreen: "11CC11",
+ clanOrange: "FF9900",
+ vehiclePurple: "960096",
+ jobYellow: "FFFF00",
+ },
+ byName: {
+ white: "FFFFFF",
+ black: "000000",
+ red: "FF0000",
+ yellow: "FFFF00",
+ royalBlue: "0000FF",
+ teal: "00FFFF",
+ orange: "FF8000",
+ softRed: "ED4337",
+ softGreen: "32CD32",
+ lightPurple: "960096",
+ lightGrey: "C8C8C8",
+ mediumGrey: "969696",
+ darkGrey: "404040",
+ policeBlue: "3250C8",
+ medicPink: "DB7093",
+ firefighterRed: "CD3C3C",
+ busDriverGreen: "32A032",
+ taxiDriverYellow: "F0E664",
+ deliveryPurple: "B19CD9",
+ civilianWhite: "C8C8C8",
+ burntYellow: "D2D200",
+ burntOrange: "D27800",
+ bankGreen: "00B400",
+ softYellow: "EAC67E",
+ businessBlue: "0099FF",
+ houseGreen: "11CC11",
+ clanOrange: "FF9900",
+ vehiclePurple: "960096",
+ jobYellow: "FFFF00",
+ },
+ },
+
+ byType: {
+ talkMessage: toColour(200, 200, 200),
+ shoutMessage: toColour(255, 255, 200),
+ whisperMessage: toColour(130, 130, 130),
+ doActionMessage: toColour(177, 156, 217, 255),
+ meActionMessage: toColour(177, 156, 217, 255),
+ errorMessage: toColour(237, 67, 55, 255),
+ syntaxMessage: toColour(200, 200, 200, 255),
+ normalMessage: toColour(255, 255, 255, 255),
+ alertMessage: toColour(255, 255, 0, 255),
+ successMessage: toColour(0, 180, 0, 255),
+ clanChatMessage: toColour(0, 190, 0, 255),
+ },
+ byName: {
+ white: toColour(255, 255, 255, 255),
+ black: toColour(0, 0, 0, 255),
+ red: toColour(255, 0, 0, 255),
+ yellow: toColour(255, 255, 0, 255),
+ royalBlue: toColour(0, 0, 255, 255),
+ teal: toColour(0, 255, 255, 255),
+ orange: toColour(255, 128, 0, 255),
+ softRed: toColour(205, 60, 60, 255),
+ softGreen: toColour(50, 205, 50, 255),
+ lightPurple: toColour(150, 0, 150, 255),
+ lightGrey: toColour(200, 200, 200, 255),
+ mediumGrey: toColour(150, 150, 150, 255),
+ darkGrey: toColour(64, 64, 64, 255),
+ policeBlue: toColour(50, 80, 200, 255),
+ medicPink: toColour(219, 112, 147, 255),
+ firefighterRed: toColour(205, 60, 60, 255),
+ busDriverGreen: toColour(50, 160, 50, 255),
+ taxiDriverYellow: toColour(240, 230, 100, 255),
+ deliveryPurple: toColour(177, 156, 217, 255),
+ civilianWhite: toColour(200, 200, 200, 255),
+ burntYellow: toColour(210, 210, 0, 255),
+ burntOrange: toColour(210, 120, 0, 255),
+ bankGreen: toColour(0, 150, 0, 255),
+ softYellow: toColour(234, 198, 126, 255),
+ businessBlue: toColour(0, 153, 255, 255),
+ houseGreen: toColour(17, 204, 17, 255),
+ clanOrange: toColour(255, 153, 0, 255),
+ },
+};
+
+let serverEmoji = [
+ [":hash:", "#"],
+ [":zero:", "0"],
+ [":one:", "1"],
+ [":two:", "2"],
+ [":three:", "3"],
+ [":four:", "4"],
+ [":five:", "5"],
+ [":six:", "6"],
+ [":seven:", "7"],
+ [":eight:", "8"],
+ [":nine:", "9"],
+ [":copyright:", "ยฉ"],
+ [":registered:", "ยฎ"],
+ [":bangbang:", "โผ"],
+ [":interrobang:", "โ"],
+ [":tm:", "โข"],
+ [":information_source:", "โน"],
+ [":left_right_arrow:", "โ"],
+ [":arrow_up_down:", "โ"],
+ [":arrow_upper_left:", "โ"],
+ [":arrow_upper_right:", "โ"],
+ [":arrow_lower_right:", "โ"],
+ [":arrow_lower_left:", "โ"],
+ [":leftwards_arrow_with_hook:", "โฉ"],
+ [":arrow_right_hook:", "โช"],
+ [":watch:", "โ"],
+ [":hourglass:", "โ"],
+ [":fast_forward:", "โฉ"],
+ [":rewind:", "โช"],
+ [":arrow_double_up:", "โซ"],
+ [":arrow_double_down:", "โฌ"],
+ [":alarm_clock:", "โฐ"],
+ [":hourglass_flowing_sand:", "โณ"],
+ [":m:", "โ"],
+ [":black_small_square:", "โช"],
+ [":white_small_square:", "โซ"],
+ [":arrow_forward:", "โถ"],
+ [":arrow_backward:", "โ"],
+ [":white_medium_square:", "โป"],
+ [":black_medium_square:", "โผ"],
+ [":white_medium_small_square:", "โฝ"],
+ [":black_medium_small_square:", "โพ"],
+ [":sunny:", "โ"],
+ [":cloud:", "โ"],
+ [":telephone:", "โ"],
+ [":ballot_box_with_check:", "โ"],
+ [":umbrella:", "โ"],
+ [":coffee:", "โ"],
+ [":point_up:", "โ"],
+ [":relaxed:", "โบ"],
+ [":aries:", "โ"],
+ [":taurus:", "โ"],
+ [":gemini:", "โ"],
+ [":cancer:", "โ"],
+ [":leo:", "โ"],
+ [":virgo:", "โ"],
+ [":libra:", "โ"],
+ [":scorpius:", "โ"],
+ [":sagittarius:", "โ"],
+ [":capricorn:", "โ"],
+ [":aquarius:", "โ"],
+ [":pisces:", "โ"],
+ [":spades:", "โ "],
+ [":clubs:", "โฃ"],
+ [":hearts:", "โฅ"],
+ [":diamonds:", "โฆ"],
+ [":hotsprings:", "โจ"],
+ [":recycle:", "โป"],
+ [":wheelchair:", "โฟ"],
+ [":anchor:", "โ"],
+ [":warning:", "โ "],
+ [":zap:", "โก"],
+ [":white_circle:", "โช"],
+ [":black_circle:", "โซ"],
+ [":soccer:", "โฝ"],
+ [":baseball:", "โพ"],
+ [":snowman:", "โ"],
+ [":partly_sunny:", "โ
"],
+ [":ophiuchus:", "โ"],
+ [":no_entry:", "โ"],
+ [":church:", "โช"],
+ [":fountain:", "โฒ"],
+ [":golf:", "โณ"],
+ [":sailboat:", "โต"],
+ [":tent:", "โบ"],
+ [":fuelpump:", "โฝ"],
+ [":scissors:", "โ"],
+ [":white_check_mark:", "โ
"],
+ [":airplane:", "โ"],
+ [":envelope:", "โ"],
+ [":fist:", "โ"],
+ [":raised_hand:", "โ"],
+ [":v:", "โ"],
+ [":pencil2:", "โ"],
+ [":black_nib:", "โ"],
+ [":heavy_check_mark:", "โ"],
+ [":heavy_multiplication_x:", "โ"],
+ [":sparkles:", "โจ"],
+ [":eight_spoked_asterisk:", "โณ"],
+ [":eight_pointed_black_star:", "โด"],
+ [":snowflake:", "โ"],
+ [":sparkle:", "โ"],
+ [":x:", "โ"],
+ [":negative_squared_cross_mark:", "โ"],
+ [":question:", "โ"],
+ [":grey_question:", "โ"],
+ [":grey_exclamation:", "โ"],
+ [":exclamation:", "โ"],
+ [":heart:", "โค"],
+ [":heavy_plus_sign:", "โ"],
+ [":heavy_minus_sign:", "โ"],
+ [":heavy_division_sign:", "โ"],
+ [":arrow_right:", "โก"],
+ [":curly_loop:", "โฐ"],
+ [":arrow_heading_up:", "โคด"],
+ [":arrow_heading_down:", "โคต"],
+ [":arrow_left:", "โฌ
"],
+ [":arrow_up:", "โฌ"],
+ [":arrow_down:", "โฌ"],
+ [":black_large_square:", "โฌ"],
+ [":white_large_square:", "โฌ"],
+ [":star:", "โญ"],
+ [":o:", "โญ"],
+ [":wavy_dash:", "ใฐ"],
+ [":part_alternation_mark:", "ใฝ"],
+ [":congratulations:", "ใ"],
+ [":secret:", "ใ"],
+ [":mahjong:", "๐"],
+ [":black_joker:", "๐"],
+ [":a:", "๐
ฐ"],
+ [":b:", "๐
ฑ"],
+ [":o2:", "๐
พ"],
+ [":parking:", "๐
ฟ"],
+ [":ab:", "๐"],
+ [":cl:", "๐"],
+ [":cool:", "๐"],
+ [":free:", "๐"],
+ [":id:", "๐"],
+ [":new:", "๐"],
+ [":ng:", "๐"],
+ [":ok:", "๐"],
+ [":sos:", "๐"],
+ [":up:", "๐"],
+ [":vs:", "๐"],
+ [":cn:", "๐จ ๐ณ"],
+ [":de:", "๐ฉ ๐ช"],
+ [":es:", "๐ช ๐ธ"],
+ [":fr:", "๐ซ ๐ท"],
+ [":uk:", "๐ฌ ๐ง"],
+ [":it:", "๐ฎ ๐น"],
+ [":jp:", "๐ฏ ๐ต"],
+ [":kr:", "๐ฐ ๐ท"],
+ [":ru:", "๐ท ๐บ"],
+ [":us:", "๐บ ๐ธ"],
+ [":koko:", "๐"],
+ [":sa:", "๐"],
+ [":u7121:", "๐"],
+ [":u6307:", "๐ฏ"],
+ [":u7981:", "๐ฒ"],
+ [":u7a7a:", "๐ณ"],
+ [":u5408:", "๐ด"],
+ [":u6e80:", "๐ต"],
+ [":u6709:", "๐ถ"],
+ [":u6708:", "๐ท"],
+ [":u7533:", "๐ธ"],
+ [":u5272:", "๐น"],
+ [":u55b6:", "๐บ"],
+ [":ideograph_advantage:", "๐"],
+ [":accept:", "๐"],
+ [":cyclone:", "๐"],
+ [":foggy:", "๐"],
+ [":closed_umbrella:", "๐"],
+ [":night_with_stars:", "๐"],
+ [":sunrise_over_mountains:", "๐"],
+ [":sunrise:", "๐
"],
+ [":city_sunset:", "๐"],
+ [":city_sunrise:", "๐"],
+ [":rainbow:", "๐"],
+ [":bridge_at_night:", "๐"],
+ [":ocean:", "๐"],
+ [":volcano:", "๐"],
+ [":milky_way:", "๐"],
+ [":earth_asia:", "๐"],
+ [":new_moon:", "๐"],
+ [":first_quarter_moon:", "๐"],
+ [":waxing_gibbous_moon:", "๐"],
+ [":full_moon:", "๐"],
+ [":crescent_moon:", "๐"],
+ [":first_quarter_moon_with_face:", "๐"],
+ [":star2:", "๐"],
+ [":stars:", "๐ "],
+ [":chestnut:", "๐ฐ"],
+ [":seedling:", "๐ฑ"],
+ [":palm_tree:", "๐ด"],
+ [":cactus:", "๐ต"],
+ [":tulip:", "๐ท"],
+ [":cherry_blossom:", "๐ธ"],
+ [":rose:", "๐น"],
+ [":hibiscus:", "๐บ"],
+ [":sunflower:", "๐ป"],
+ [":blossom:", "๐ผ"],
+ [":corn:", "๐ฝ"],
+ [":ear_of_rice:", "๐พ"],
+ [":herb:", "๐ฟ"],
+ [":four_leaf_clover:", "๐"],
+ [":maple_leaf:", "๐"],
+ [":fallen_leaf:", "๐"],
+ [":leaves:", "๐"],
+ [":mushroom:", "๐"],
+ [":tomato:", "๐
"],
+ [":eggplant:", "๐"],
+ [":grapes:", "๐"],
+ [":melon:", "๐"],
+ [":watermelon:", "๐"],
+ [":tangerine:", "๐"],
+ [":banana:", "๐"],
+ [":pineapple:", "๐"],
+ [":apple:", "๐"],
+ [":green_apple:", "๐"],
+ [":peach:", "๐"],
+ [":cherries:", "๐"],
+ [":strawberry:", "๐"],
+ [":hamburger:", "๐"],
+ [":pizza:", "๐"],
+ [":meat_on_bone:", "๐"],
+ [":poultry_leg:", "๐"],
+ [":rice_cracker:", "๐"],
+ [":rice_ball:", "๐"],
+ [":rice:", "๐"],
+ [":curry:", "๐"],
+ [":ramen:", "๐"],
+ [":spaghetti:", "๐"],
+ [":bread:", "๐"],
+ [":fries:", "๐"],
+ [":sweet_potato:", "๐ "],
+ [":dango:", "๐ก"],
+ [":oden:", "๐ข"],
+ [":sushi:", "๐ฃ"],
+ [":fried_shrimp:", "๐ค"],
+ [":fish_cake:", "๐ฅ"],
+ [":icecream:", "๐ฆ"],
+ [":shaved_ice:", "๐ง"],
+ [":ice_cream:", "๐จ"],
+ [":doughnut:", "๐ฉ"],
+ [":cookie:", "๐ช"],
+ [":chocolate_bar:", "๐ซ"],
+ [":candy:", "๐ฌ"],
+ [":lollipop:", "๐ญ"],
+ [":custard:", "๐ฎ"],
+ [":honey_pot:", "๐ฏ"],
+ [":cake:", "๐ฐ"],
+ [":bento:", "๐ฑ"],
+ [":stew:", "๐ฒ"],
+ [":egg:", "๐ณ"],
+ [":fork_and_knife:", "๐ด"],
+ [":tea:", "๐ต"],
+ [":sake:", "๐ถ"],
+ [":wine_glass:", "๐ท"],
+ [":cocktail:", "๐ธ"],
+ [":tropical_drink:", "๐น"],
+ [":beer:", "๐บ"],
+ [":beers:", "๐ป"],
+ [":ribbon:", "๐"],
+ [":gift:", "๐"],
+ [":birthday:", "๐"],
+ [":jack_o_lantern:", "๐"],
+ [":christmas_tree:", "๐"],
+ [":santa:", "๐
"],
+ [":fireworks:", "๐"],
+ [":sparkler:", "๐"],
+ [":balloon:", "๐"],
+ [":tada:", "๐"],
+ [":confetti_ball:", "๐"],
+ [":tanabata_tree:", "๐"],
+ [":crossed_flags:", "๐"],
+ [":bamboo:", "๐"],
+ [":dolls:", "๐"],
+ [":flags:", "๐"],
+ [":wind_chime:", "๐"],
+ [":rice_scene:", "๐"],
+ [":school_satchel:", "๐"],
+ [":mortar_board:", "๐"],
+ [":carousel_horse:", "๐ "],
+ [":ferris_wheel:", "๐ก"],
+ [":roller_coaster:", "๐ข"],
+ [":fishing_pole_and_fish:", "๐ฃ"],
+ [":microphone:", "๐ค"],
+ [":movie_camera:", "๐ฅ"],
+ [":cinema:", "๐ฆ"],
+ [":headphones:", "๐ง"],
+ [":art:", "๐จ"],
+ [":tophat:", "๐ฉ"],
+ [":circus_tent:", "๐ช"],
+ [":ticket:", "๐ซ"],
+ [":clapper:", "๐ฌ"],
+ [":performing_arts:", "๐ญ"],
+ [":video_game:", "๐ฎ"],
+ [":dart:", "๐ฏ"],
+ [":slot_machine:", "๐ฐ"],
+ [":_8ball:", "๐ฑ"],
+ [":game_die:", "๐ฒ"],
+ [":bowling:", "๐ณ"],
+ [":flower_playing_cards:", "๐ด"],
+ [":musical_note:", "๐ต"],
+ [":notes:", "๐ถ"],
+ [":saxophone:", "๐ท"],
+ [":guitar:", "๐ธ"],
+ [":musical_keyboard:", "๐น"],
+ [":trumpet:", "๐บ"],
+ [":violin:", "๐ป"],
+ [":musical_score:", "๐ผ"],
+ [":running_shirt_with_sash:", "๐ฝ"],
+ [":tennis:", "๐พ"],
+ [":ski:", "๐ฟ"],
+ [":basketball:", "๐"],
+ [":checkered_flag:", "๐"],
+ [":snowboarder:", "๐"],
+ [":runner:", "๐"],
+ [":surfer:", "๐"],
+ [":trophy:", "๐"],
+ [":football:", "๐"],
+ [":swimmer:", "๐"],
+ [":house:", "๐ "],
+ [":house_with_garden:", "๐ก"],
+ [":office:", "๐ข"],
+ [":post_office:", "๐ฃ"],
+ [":hospital:", "๐ฅ"],
+ [":bank:", "๐ฆ"],
+ [":atm:", "๐ง"],
+ [":hotel:", "๐จ"],
+ [":love_hotel:", "๐ฉ"],
+ [":convenience_store:", "๐ช"],
+ [":school:", "๐ซ"],
+ [":department_store:", "๐ฌ"],
+ [":factory:", "๐ญ"],
+ [":izakaya_lantern:", "๐ฎ"],
+ [":japanese_castle:", "๐ฏ"],
+ [":european_castle:", "๐ฐ"],
+ [":snail:", "๐"],
+ [":snake:", "๐"],
+ [":racehorse:", "๐"],
+ [":sheep:", "๐"],
+ [":monkey:", "๐"],
+ [":chicken:", "๐"],
+ [":boar:", "๐"],
+ [":elephant:", "๐"],
+ [":octopus:", "๐"],
+ [":shell:", "๐"],
+ [":bug:", "๐"],
+ [":ant:", "๐"],
+ [":bee:", "๐"],
+ [":beetle:", "๐"],
+ [":fish:", "๐"],
+ [":tropical_fish:", "๐ "],
+ [":blowfish:", "๐ก"],
+ [":turtle:", "๐ข"],
+ [":hatching_chick:", "๐ฃ"],
+ [":baby_chick:", "๐ค"],
+ [":hatched_chick:", "๐ฅ"],
+ [":bird:", "๐ฆ"],
+ [":penguin:", "๐ง"],
+ [":koala:", "๐จ"],
+ [":poodle:", "๐ฉ"],
+ [":camel:", "๐ซ"],
+ [":dolphin:", "๐ฌ"],
+ [":mouse:", "๐ญ"],
+ [":cow:", "๐ฎ"],
+ [":tiger:", "๐ฏ"],
+ [":rabbit:", "๐ฐ"],
+ [":cat:", "๐ฑ"],
+ [":dragon_face:", "๐ฒ"],
+ [":whale:", "๐ณ"],
+ [":horse:", "๐ด"],
+ [":monkey_face:", "๐ต"],
+ [":dog:", "๐ถ"],
+ [":pig:", "๐ท"],
+ [":frog:", "๐ธ"],
+ [":hamster:", "๐น"],
+ [":wolf:", "๐บ"],
+ [":bear:", "๐ป"],
+ [":panda_face:", "๐ผ"],
+ [":pig_nose:", "๐ฝ"],
+ [":feet:", "๐พ"],
+ [":eyes:", "๐"],
+ [":ear:", "๐"],
+ [":nose:", "๐"],
+ [":lips:", "๐"],
+ [":tongue:", "๐
"],
+ [":point_up_2:", "๐"],
+ [":point_down:", "๐"],
+ [":point_left:", "๐"],
+ [":point_right:", "๐"],
+ [":punch:", "๐"],
+ [":wave:", "๐"],
+ [":ok_hand:", "๐"],
+ [":thumbsup:", "๐"],
+ [":thumbsdown:", "๐"],
+ [":clap:", "๐"],
+ [":open_hands:", "๐"],
+ [":crown:", "๐"],
+ [":womans_hat:", "๐"],
+ [":eyeglasses:", "๐"],
+ [":necktie:", "๐"],
+ [":shirt:", "๐"],
+ [":jeans:", "๐"],
+ [":dress:", "๐"],
+ [":kimono:", "๐"],
+ [":bikini:", "๐"],
+ [":womans_clothes:", "๐"],
+ [":purse:", "๐"],
+ [":handbag:", "๐"],
+ [":pouch:", "๐"],
+ [":mans_shoe:", "๐"],
+ [":athletic_shoe:", "๐"],
+ [":high_heel:", "๐ "],
+ [":sandal:", "๐ก"],
+ [":boot:", "๐ข"],
+ [":footprints:", "๐ฃ"],
+ [":bust_in_silhouette:", "๐ค"],
+ [":boy:", "๐ฆ"],
+ [":girl:", "๐ง"],
+ [":man:", "๐จ"],
+ [":woman:", "๐ฉ"],
+ [":family:", "๐ช"],
+ [":couple:", "๐ซ"],
+ [":cop:", "๐ฎ"],
+ [":dancers:", "๐ฏ"],
+ [":bride_with_veil:", "๐ฐ"],
+ [":person_with_blond_hair:", "๐ฑ"],
+ [":man_with_gua_pi_mao:", "๐ฒ"],
+ [":man_with_turban:", "๐ณ"],
+ [":older_man:", "๐ด"],
+ [":older_woman:", "๐ต"],
+ [":baby:", "๐ถ"],
+ [":construction_worker:", "๐ท"],
+ [":princess:", "๐ธ"],
+ [":japanese_ogre:", "๐น"],
+ [":japanese_goblin:", "๐บ"],
+ [":ghost:", "๐ป"],
+ [":angel:", "๐ผ"],
+ [":alien:", "๐ฝ"],
+ [":space_invader:", "๐พ"],
+ [":robot_face:", "๐ค"],
+ [":imp:", "๐ฟ"],
+ [":skull:", "๐"],
+ [":information_desk_person:", "๐"],
+ [":guardsman:", "๐"],
+ [":dancer:", "๐"],
+ [":lipstick:", "๐"],
+ [":nail_care:", "๐
"],
+ [":massage:", "๐"],
+ [":haircut:", "๐"],
+ [":barber:", "๐"],
+ [":syringe:", "๐"],
+ [":pill:", "๐"],
+ [":kiss:", "๐"],
+ [":love_letter:", "๐"],
+ [":ring:", "๐"],
+ [":gem:", "๐"],
+ [":couplekiss:", "๐"],
+ [":bouquet:", "๐"],
+ [":couple_with_heart:", "๐"],
+ [":wedding:", "๐"],
+ [":heartbeat:", "๐"],
+ [":broken_heart:", "๐"],
+ [":two_hearts:", "๐"],
+ [":sparkling_heart:", "๐"],
+ [":heartpulse:", "๐"],
+ [":cupid:", "๐"],
+ [":blue_heart:", "๐"],
+ [":green_heart:", "๐"],
+ [":yellow_heart:", "๐"],
+ [":purple_heart:", "๐"],
+ [":gift_heart:", "๐"],
+ [":revolving_hearts:", "๐"],
+ [":heart_decoration:", "๐"],
+ [":diamond_shape_with_a_dot_inside:", "๐ "],
+ [":bulb:", "๐ก"],
+ [":anger:", "๐ข"],
+ [":bomb:", "๐ฃ"],
+ [":zzz:", "๐ค"],
+ [":boom:", "๐ฅ"],
+ [":sweat_drops:", "๐ฆ"],
+ [":droplet:", "๐ง"],
+ [":dash:", "๐จ"],
+ [":poop:", "๐ฉ"],
+ [":muscle:", "๐ช"],
+ [":dizzy:", "๐ซ"],
+ [":speech_balloon:", "๐ฌ"],
+ [":white_flower:", "๐ฎ"],
+ [":_100:", "๐ฏ"],
+ [":moneybag:", "๐ฐ"],
+ [":currency_exchange:", "๐ฑ"],
+ [":heavy_dollar_sign:", "๐ฒ"],
+ [":credit_card:", "๐ณ"],
+ [":yen:", "๐ด"],
+ [":dollar:", "๐ต"],
+ [":money_with_wings:", "๐ธ"],
+ [":chart:", "๐น"],
+ [":seat:", "๐บ"],
+ [":computer:", "๐ป"],
+ [":briefcase:", "๐ผ"],
+ [":minidisc:", "๐ฝ"],
+ [":floppy_disk:", "๐พ"],
+ [":cd:", "๐ฟ"],
+ [":dvd:", "๐"],
+ [":file_folder:", "๐"],
+ [":open_file_folder:", "๐"],
+ [":page_with_curl:", "๐"],
+ [":page_facing_up:", "๐"],
+ [":date:", "๐
"],
+ [":calendar:", "๐"],
+ [":card_index:", "๐"],
+ [":chart_with_upwards_trend:", "๐"],
+ [":chart_with_downwards_trend:", "๐"],
+ [":bar_chart:", "๐"],
+ [":clipboard:", "๐"],
+ [":pushpin:", "๐"],
+ [":round_pushpin:", "๐"],
+ [":paperclip:", "๐"],
+ [":straight_ruler:", "๐"],
+ [":triangular_ruler:", "๐"],
+ [":bookmark_tabs:", "๐"],
+ [":ledger:", "๐"],
+ [":notebook:", "๐"],
+ [":notebook_with_decorative_cover:", "๐"],
+ [":closed_book:", "๐"],
+ [":book:", "๐"],
+ [":green_book:", "๐"],
+ [":blue_book:", "๐"],
+ [":orange_book:", "๐"],
+ [":books:", "๐"],
+ [":name_badge:", "๐"],
+ [":scroll:", "๐"],
+ [":pencil:", "๐"],
+ [":telephone_receiver:", "๐"],
+ [":pager:", "๐"],
+ [":fax:", "๐ "],
+ [":satellite:", "๐ก"],
+ [":loudspeaker:", "๐ข"],
+ [":mega:", "๐ฃ"],
+ [":outbox_tray:", "๐ค"],
+ [":inbox_tray:", "๐ฅ"],
+ [":package:", "๐ฆ"],
+ [":e_mail:", "๐ง"],
+ [":incoming_envelope:", "๐จ"],
+ [":envelope_with_arrow:", "๐ฉ"],
+ [":mailbox_closed:", "๐ช"],
+ [":mailbox:", "๐ซ"],
+ [":postbox:", "๐ฎ"],
+ [":newspaper:", "๐ฐ"],
+ [":iphone:", "๐ฑ"],
+ [":calling:", "๐ฒ"],
+ [":vibration_mode:", "๐ณ"],
+ [":mobile_phone_off:", "๐ด"],
+ [":signal_strength:", "๐ถ"],
+ [":camera:", "๐ท"],
+ [":video_camera:", "๐น"],
+ [":tv:", "๐บ"],
+ [":radio:", "๐ป"],
+ [":vhs:", "๐ผ"],
+ [":arrows_clockwise:", "๐"],
+ [":loud_sound:", "๐"],
+ [":battery:", "๐"],
+ [":electric_plug:", "๐"],
+ [":mag:", "๐"],
+ [":mag_right:", "๐"],
+ [":lock_with_ink_pen:", "๐"],
+ [":closed_lock_with_key:", "๐"],
+ [":key:", "๐"],
+ [":lock:", "๐"],
+ [":unlock:", "๐"],
+ [":bell:", "๐"],
+ [":bookmark:", "๐"],
+ [":link:", "๐"],
+ [":radio_button:", "๐"],
+ [":back:", "๐"],
+ [":end:", "๐"],
+ [":on:", "๐"],
+ [":soon:", "๐"],
+ [":top:", "๐"],
+ [":underage:", "๐"],
+ [":keycap_ten:", "๐"],
+ [":capital_abcd:", "๐ "],
+ [":abcd:", "๐ก"],
+ [":_1234:", "๐ข"],
+ [":symbols:", "๐ฃ"],
+ [":abc:", "๐ค"],
+ [":fire:", "๐ฅ"],
+ [":flashlight:", "๐ฆ"],
+ [":wrench:", "๐ง"],
+ [":hammer:", "๐จ"],
+ [":nut_and_bolt:", "๐ฉ"],
+ [":knife:", "๐ช"],
+ [":gun:", "๐ซ"],
+ [":crystal_ball:", "๐ฎ"],
+ [":six_pointed_star:", "๐ฏ"],
+ [":beginner:", "๐ฐ"],
+ [":trident:", "๐ฑ"],
+ [":black_square_button:", "๐ฒ"],
+ [":white_square_button:", "๐ณ"],
+ [":red_circle:", "๐ด"],
+ [":large_blue_circle:", "๐ต"],
+ [":large_orange_diamond:", "๐ถ"],
+ [":large_blue_diamond:", "๐ท"],
+ [":small_orange_diamond:", "๐ธ"],
+ [":small_blue_diamond:", "๐น"],
+ [":small_red_triangle:", "๐บ"],
+ [":small_red_triangle_down:", "๐ป"],
+ [":arrow_up_small:", "๐ผ"],
+ [":arrow_down_small:", "๐ฝ"],
+ [":clock1:", "๐"],
+ [":clock2:", "๐"],
+ [":clock3:", "๐"],
+ [":clock4:", "๐"],
+ [":clock5:", "๐"],
+ [":clock6:", "๐"],
+ [":clock7:", "๐"],
+ [":clock8:", "๐"],
+ [":clock9:", "๐"],
+ [":clock10:", "๐"],
+ [":clock11:", "๐"],
+ [":clock12:", "๐"],
+ [":mount_fuji:", "๐ป"],
+ [":tokyo_tower:", "๐ผ"],
+ [":statue_of_liberty:", "๐ฝ"],
+ [":japan:", "๐พ"],
+ [":moyai:", "๐ฟ"],
+ [":grin:", "๐"],
+ [":joy:", "๐"],
+ [":smiley:", "๐"],
+ [":smile:", "๐"],
+ [":sweat_smile:", "๐
"],
+ [":laughing:", "๐"],
+ [":wink:", "๐"],
+ [":blush:", "๐"],
+ [":yum:", "๐"],
+ [":relieved:", "๐"],
+ [":heart_eyes:", "๐"],
+ [":smirk:", "๐"],
+ [":unamused:", "๐"],
+ [":sweat:", "๐"],
+ [":pensive:", "๐"],
+ [":confounded:", "๐"],
+ [":kissing_heart:", "๐"],
+ [":kissing_closed_eyes:", "๐"],
+ [":stuck_out_tongue_winking_eye:", "๐"],
+ [":stuck_out_tongue_closed_eyes:", "๐"],
+ [":disappointed:", "๐"],
+ [":angry:", "๐ "],
+ [":rage:", "๐ก"],
+ [":cry:", "๐ข"],
+ [":persevere:", "๐ฃ"],
+ [":triumph:", "๐ค"],
+ [":disappointed_relieved:", "๐ฅ"],
+ [":fearful:", "๐จ"],
+ [":weary:", "๐ฉ"],
+ [":sleepy:", "๐ช"],
+ [":tired_face:", "๐ซ"],
+ [":sob:", "๐ญ"],
+ [":cold_sweat:", "๐ฐ"],
+ [":scream:", "๐ฑ"],
+ [":astonished:", "๐ฒ"],
+ [":flushed:", "๐ณ"],
+ [":dizzy_face:", "๐ต"],
+ [":mask:", "๐ท"],
+ [":smile_cat:", "๐ธ"],
+ [":joy_cat:", "๐น"],
+ [":smiley_cat:", "๐บ"],
+ [":heart_eyes_cat:", "๐ป"],
+ [":smirk_cat:", "๐ผ"],
+ [":kissing_cat:", "๐ฝ"],
+ [":pouting_cat:", "๐พ"],
+ [":crying_cat_face:", "๐ฟ"],
+ [":scream_cat:", "๐"],
+ [":no_good:", "๐
"],
+ [":ok_woman:", "๐"],
+ [":bow:", "๐"],
+ [":see_no_evil:", "๐"],
+ [":hear_no_evil:", "๐"],
+ [":speak_no_evil:", "๐"],
+ [":raising_hand:", "๐"],
+ [":raised_hands:", "๐"],
+ [":person_frowning:", "๐"],
+ [":person_with_pouting_face:", "๐"],
+ [":pray:", "๐"],
+ [":rocket:", "๐"],
+ [":railway_car:", "๐"],
+ [":bullettrain_side:", "๐"],
+ [":bullettrain_front:", "๐
"],
+ [":metro:", "๐"],
+ [":station:", "๐"],
+ [":bus:", "๐"],
+ [":busstop:", "๐"],
+ [":ambulance:", "๐"],
+ [":fire_engine:", "๐"],
+ [":police_car:", "๐"],
+ [":taxi:", "๐"],
+ [":red_car:", "๐"],
+ [":blue_car:", "๐"],
+ [":truck:", "๐"],
+ [":ship:", "๐ข"],
+ [":speedboat:", "๐ค"],
+ [":traffic_light:", "๐ฅ"],
+ [":construction:", "๐ง"],
+ [":rotating_light:", "๐จ"],
+ [":triangular_flag_on_post:", "๐ฉ"],
+ [":door:", "๐ช"],
+ [":no_entry_sign:", "๐ซ"],
+ [":smoking:", "๐ฌ"],
+ [":no_smoking:", "๐ญ"],
+ [":bike:", "๐ฒ"],
+ [":walking:", "๐ถ"],
+ [":mens:", "๐น"],
+ [":womens:", "๐บ"],
+ [":restroom:", "๐ป"],
+ [":baby_symbol:", "๐ผ"],
+ [":toilet:", "๐ฝ"],
+ [":wc:", "๐พ"],
+ [":bath:", "๐"],
+ [":articulated_lorry:", "๐"],
+ [":kissing_smiling_eyes:", "๐"],
+ [":pear:", "๐"],
+ [":bicyclist:", "๐ด"],
+ [":rabbit2:", "๐"],
+ [":clock830:", "๐ฃ"],
+ [":train:", "๐"],
+ [":oncoming_automobile:", "๐"],
+ [":expressionless:", "๐"],
+ [":smiling_imp:", "๐"],
+ [":frowning:", "๐ฆ"],
+ [":no_mouth:", "๐ถ"],
+ [":baby_bottle:", "๐ผ"],
+ [":non_potable_water:", "๐ฑ"],
+ [":open_mouth:", "๐ฎ"],
+ [":last_quarter_moon_with_face:", "๐"],
+ [":do_not_litter:", "๐ฏ"],
+ [":sunglasses:", "๐"],
+ [":loop:", "โฟ"],
+ [":last_quarter_moon:", "๐"],
+ [":grinning:", "๐"],
+ [":euro:", "๐ถ"],
+ [":clock330:", "๐"],
+ [":telescope:", "๐ญ"],
+ [":globe_with_meridians:", "๐"],
+ [":postal_horn:", "๐ฏ"],
+ [":stuck_out_tongue:", "๐"],
+ [":clock1030:", "๐ฅ"],
+ [":pound:", "๐ท"],
+ [":two_men_holding_hands:", "๐ฌ"],
+ [":tiger2:", "๐
"],
+ [":anguished:", "๐ง"],
+ [":vertical_traffic_light:", "๐ฆ"],
+ [":confused:", "๐"],
+ [":repeat:", "๐"],
+ [":oncoming_police_car:", "๐"],
+ [":tram:", "๐"],
+ [":dragon:", "๐"],
+ [":earth_americas:", "๐"],
+ [":rugby_football:", "๐"],
+ [":left_luggage:", "๐
"],
+ [":sound:", "๐"],
+ [":clock630:", "๐ก"],
+ [":dromedary_camel:", "๐ช"],
+ [":oncoming_bus:", "๐"],
+ [":horse_racing:", "๐"],
+ [":rooster:", "๐"],
+ [":rowboat:", "๐ฃ"],
+ [":customs:", "๐"],
+ [":repeat_one:", "๐"],
+ [":waxing_crescent_moon:", "๐"],
+ [":mountain_railway:", "๐"],
+ [":clock930:", "๐ค"],
+ [":put_litter_in_its_place:", "๐ฎ"],
+ [":arrows_counterclockwise:", "๐"],
+ [":clock130:", "๐"],
+ [":goat:", "๐"],
+ [":pig2:", "๐"],
+ [":innocent:", "๐"],
+ [":no_bicycles:", "๐ณ"],
+ [":light_rail:", "๐"],
+ [":whale2:", "๐"],
+ [":train2:", "๐"],
+ [":earth_africa:", "๐"],
+ [":shower:", "๐ฟ"],
+ [":waning_gibbous_moon:", "๐"],
+ [":steam_locomotive:", "๐"],
+ [":cat2:", "๐"],
+ [":tractor:", "๐"],
+ [":thought_balloon:", "๐ญ"],
+ [":two_women_holding_hands:", "๐ญ"],
+ [":full_moon_with_face:", "๐"],
+ [":mouse2:", "๐"],
+ [":clock430:", "๐"],
+ [":worried:", "๐"],
+ [":rat:", "๐"],
+ [":ram:", "๐"],
+ [":dog2:", "๐"],
+ [":kissing:", "๐"],
+ [":helicopter:", "๐"],
+ [":clock1130:", "๐ฆ"],
+ [":no_mobile_phones:", "๐ต"],
+ [":european_post_office:", "๐ค"],
+ [":ox:", "๐"],
+ [":mountain_cableway:", "๐ "],
+ [":sleeping:", "๐ด"],
+ [":cow2:", "๐"],
+ [":minibus:", "๐"],
+ [":clock730:", "๐ข"],
+ [":aerial_tramway:", "๐ก"],
+ [":speaker:", "๐"],
+ [":no_bell:", "๐"],
+ [":mailbox_with_mail:", "๐ฌ"],
+ [":no_pedestrians:", "๐ท"],
+ [":microscope:", "๐ฌ"],
+ [":bathtub:", "๐"],
+ [":suspension_railway:", "๐"],
+ [":crocodile:", "๐"],
+ [":mountain_bicyclist:", "๐ต"],
+ [":waning_crescent_moon:", "๐"],
+ [":monorail:", "๐"],
+ [":children_crossing:", "๐ธ"],
+ [":clock230:", "๐"],
+ [":busts_in_silhouette:", "๐ฅ"],
+ [":mailbox_with_no_mail:", "๐ญ"],
+ [":leopard:", "๐"],
+ [":deciduous_tree:", "๐ณ"],
+ [":oncoming_taxi:", "๐"],
+ [":lemon:", "๐"],
+ [":mute:", "๐"],
+ [":baggage_claim:", "๐"],
+ [":twisted_rightwards_arrows:", "๐"],
+ [":sun_with_face:", "๐"],
+ [":trolleybus:", "๐"],
+ [":evergreen_tree:", "๐ฒ"],
+ [":passport_control:", "๐"],
+ [":new_moon_with_face:", "๐"],
+ [":potable_water:", "๐ฐ"],
+ [":high_brightness:", "๐"],
+ [":low_brightness:", "๐
"],
+ [":clock530:", "๐ "],
+ [":hushed:", "๐ฏ"],
+ [":grimacing:", "๐ฌ"],
+ [":water_buffalo:", "๐"],
+ [":neutral_face:", "๐"],
+ [":clock1230:", "๐ง"],
+ [":P", "๐" ],
+ [":)", "๐" ],
+ [":D", "๐" ],
+ [":o", "๐ฎ" ],
+ [":O", "๐ฎ" ],
+ [":(", "โน๏ธ" ],
+ [":|", "๐" ],
+];
+
+// ===========================================================================
+
+// ===========================================================================
+
function makeLargeNumberReadable(num) {
return new Number(num).toLocaleString("en-US");
}
@@ -1459,4 +2416,275 @@ function getConsoleClient() {
}
}
+// ===========================================================================
+
+function getServerColours() {
+ return serverColours;
+}
+
+// ===========================================================================
+
+function getColourByType(typeName) {
+ return getServerColours().byType[typeName];
+}
+
+// ===========================================================================
+
+function getColourByName(colourName) {
+ return getServerColours().byName[colourName];
+}
+
+// ===========================================================================
+
+function getHexColourByName(colourName) {
+ //let rgbaColour = getServerColours().byName[colourName];
+ //let rgbaArray = rgbaArrayFromToColour(rgbaColour);
+ //return rgbToHex(rgbaArray[0], rgbaArray[1], rgbaArray[2]);
+
+ return `#${getServerColours().hex.byName[colourName]}`;
+}
+
+// ===========================================================================
+
+function getHexColourByType(colourName) {
+ //let rgbaColour = getServerColours().byType[colourName];
+ //let rgbaArray = rgbaArrayFromToColour(rgbaColour);
+ //return rgbToHex(rgbaArray[0], rgbaArray[1], rgbaArray[2]);
+
+ return `#${getServerColours().hex.byType[colourName]}`;
+}
+
+// ===========================================================================
+
+function getPlayerColour(client) {
+ if(getPlayerData(client) != false) {
+ if(!isPlayerLoggedIn(client)) {
+ return getColourByName("darkGrey");
+ } else {
+ if(isPlayerWorking(client)) {
+ return getJobData(getJobIndexFromDatabaseId(getPlayerCurrentSubAccount(client).job)).colour;
+ }
+ }
+ }
+
+ return getColourByName("civilianWhite");
+}
+
+// ===========================================================================
+
+/**
+ * Gets the red/green colour depending on bool (red = false, green = true) for inline use in chatbox messages
+ *
+ * @param {Boolean} boolValue The boolean value
+ * @return {String} Red or green inline HEX colour string
+ *
+ */
+function getBoolRedGreenInlineColour(boolValue) {
+ return (!boolValue) ? "{softRed}" : "{softGreen}";
+}
+
+// ===========================================================================
+
+/**
+ * Gets an array of RGB colour values from a HEX colour string
+ *
+ * @param {String} hexColour Hex colour string
+ * @return {Array} 3-slot array where each slot is an RGB colour value
+ *
+ */
+function hexToRgb(h) {
+ return [
+ '0x'+h[1]+h[2]|0,
+ '0x'+h[3]+h[4]|0,
+ '0x'+h[5]+h[6]|0
+ ];
+}
+
+// ===========================================================================
+
+/**
+ * Gets a HEX colour string from RGB values, without brackets (example: #FFFFFF)
+ *
+ * @param {Number} red Red RGB value
+ * @param {Number} green Green RGB value
+ * @param {Number} blue Blue RGB value
+ * @return {String} HEX colour string
+ *
+ */
+function rgbToHex(r, g, b) {
+ return "#"+((1<<24)+(r<<16)+(g<<8)+ b).toString(16).slice(1);
+}
+
+// ===========================================================================
+
+/**
+ * Gets the current colour for a player (affected by job and status)
+ *
+ * @param {Client} client Player client
+ * @return {Number} Colour integer
+ *
+ */
+function getClientChatColour(client) {
+ let tempJob = getPlayerCurrentSubAccount(client).job;
+ if(tempJob != -1) {
+ if(getPlayerData(client).isWorking) {
+ return getJobData(tempJob).jobColour;
+ }
+ }
+ return getColourByName("white");
+}
+
+// ===========================================================================
+
+/**
+ * Gets a toColour-created colour integer with random RGB values (alpha is always 255)
+ *
+ * @return {Number} Colour integer
+ *
+ */
+function getRandomRGB() {
+ return toColour.apply(null, [
+ getRandom(0, 255),
+ getRandom(0, 255),
+ getRandom(0, 255),
+ 255
+ ]);
+}
+
+// ===========================================================================
+
+/**
+ * Gets a hex formatting colour by name for use inline in chatbox messages (example: [#FFFFFF]).
+ *
+ * @param {String} colourName - Colour name
+ * @return {String} HEX-formatted colour string with brackets
+ *
+ */
+function getInlineChatColourByName(colourName) {
+ return `{${colourName}}`;
+}
+
+// ===========================================================================
+
+/**
+ * Gets a hex formatting colour by type for use inline in chatbox messages (example: [#FFFFFF]).
+ *
+ * @param {String} colourName - Colour type
+ * @return {String} HEX-formatted colour string with brackets
+ *
+ */
+function getInlineChatColourByType(colourName) {
+ return `{${colourName}}`;
+}
+
+// ===========================================================================
+
+/**
+ * Gets an array of RGBA colour values from a toColour integer.
+ *
+ * @param {Number} colour - Colour integer created by toColour
+ * @return {Array} 4-slot array where each slot is an RGBA colour value
+ *
+ */
+function rgbaArrayFromToColour(colour) {
+ //return [
+ // (colour >> 24) & 0xFF, // red
+ // (colour >> 16) & 0xFF,
+ // (colour >> 8) & 0xFF,
+ // colour & 0xFF // alpha
+ //];
+ return [
+ (colour >> 16) & 0xFF, // red
+ (colour >> 8) & 0xFF,
+ colour & 0xFF,
+ (colour >> 24) & 0xFF// alpha
+ ];
+}
+
+// ===========================================================================
+
+function hexFromToColour(colour) {
+ let rgba = rgbaArrayFromToColour(colour);
+ return rgbToHex(rgba[0], rgba[1], rgba[2]);
+}
+
+// ===========================================================================
+
+function replaceColoursInMessage(messageText) {
+ if(messageText == null) {
+ return "";
+ }
+
+ let tempFind = `{RESETCOLOUR}`;
+ let tempRegex = new RegExp(tempFind, 'g');
+ messageText = messageText.replace(tempRegex, "[/#]");
+
+ tempFind = `{ALTCOLOUR}`;
+ tempRegex = new RegExp(tempFind, 'g');
+ messageText = messageText.replace(tempRegex, "[#C8C8C8]");
+
+ tempFind = `{MAINCOLOUR}`;
+ tempRegex = new RegExp(tempFind, 'g');
+ messageText = messageText.replace(tempRegex, "[#FFFFFF]");
+
+ for(let i in getServerColours().hex.byName) {
+ let find = `{${i}}`;
+ let re = new RegExp(find, 'g');
+ messageText = messageText.replace(re, `[#${getServerColours().hex.byName[i]}]`);
+ }
+
+ for(let i in getServerColours().hex.byType) {
+ let find = `{${i}}`;
+ let re = new RegExp(find, 'g');
+ messageText = messageText.replace(re, `[#${getServerColours().hex.byType[i]}]`);
+ }
+
+ return messageText;
+}
+
+// ===========================================================================
+
+function removeColoursInMessage(messageText) {
+ if(messageText == null) {
+ return "";
+ }
+
+ let tempFind = `{RESETCOLOUR}`;
+ let tempRegex = new RegExp(tempFind, 'g');
+ messageText = messageText.replace(tempRegex, "");
+
+ tempFind = `{ALTCOLOUR}`;
+ tempRegex = new RegExp(tempFind, 'g');
+ messageText = messageText.replace(tempRegex, "");
+
+ tempFind = `{MAINCOLOUR}`;
+ tempRegex = new RegExp(tempFind, 'g');
+ messageText = messageText.replace(tempRegex, "");
+
+ for(let i in getServerColours().hex.byName) {
+ let find = `{${i}}`;
+ let re = new RegExp(find, 'g');
+ messageText = messageText.replace(re, "");
+ }
+
+ for(let i in getServerColours().hex.byType) {
+ let find = `{${i}}`;
+ let re = new RegExp(find, 'g');
+ messageText = messageText.replace(re, "");
+ }
+
+ return messageText;
+}
+
+// ===========================================================================
+
+function replaceEmojiInString(messageString) {
+ for(let i in emojiReplaceString) {
+ while(messageString.indexOf(emojiReplaceString[i][0]) != -1) {
+ messageString = messageString.replace(emojiReplaceString[i][0], emojiReplaceString[i][1]);
+ }
+ }
+ return messageString;
+}
+
// ===========================================================================
\ No newline at end of file
From 41542493d895942e12406ea19006afdd6a00fc0e Mon Sep 17 00:00:00 2001
From: Vortrex <3858226+VortrexFTW@users.noreply.github.com>
Date: Fri, 25 Feb 2022 05:28:46 -0600
Subject: [PATCH 03/46] Add interior positions for IV
---
scripts/shared/gamedata.js | 29 ++++++++++++++++++++++++++++-
1 file changed, 28 insertions(+), 1 deletion(-)
diff --git a/scripts/shared/gamedata.js b/scripts/shared/gamedata.js
index 497dcdbb..d22f28e4 100644
--- a/scripts/shared/gamedata.js
+++ b/scripts/shared/gamedata.js
@@ -4386,7 +4386,34 @@ let gameData = {
},
{ // GTA IV
-
+ Office2: [toVector3(-1153.30, 417.37, 5.578), 0],
+ House1: [toVector3(-426.16, 1466.52, 38.971), 0],
+ House2: [toVector3(-969.77, 883.27, 18.817), 0],
+ House3: [toVector3(95.75, 851.68, 45.051), 0],
+ House4: [toVector3(603.04, 1404.06, 17.479), 0],
+ House5: [toVector3(892.56, -502.13, 19.407), 0],
+ House6: [toVector3(-524.09, 830.54, 23.627), 0],
+ House7: [toVector3(806.36, 146.68, 29.243), 0],
+ House8: [toVector3(356.91, 1511.28, 21.432), 0],
+ House9: [toVector3(1319.40, -847.02, 8.872), 0],
+ House10: [toVector3(1331.40, 126.60, 36.558), 0],
+ House11: [toVector3(1387.81, 622.66, 35.857), 0],
+ House12: [toVector3(932.74, -189.29, 35.143), 0],
+ House13: [toVector3(-1397.85, 1473.89, 26.447), 0],
+ House14: [toVector3(806.36, 146.68, 29.243), 0],
+ House15: [toVector3(-526.49, 829.41, 23.627), 0],
+ Gym: [toVector3(403.31, 1480.32, 11.834), 0],
+ PoliceStation: [toVector3(-406.52, 286.57, 13.682), 0],
+ FancyRestaurant: [toVector3(-118.24, -259.06, 12.654), 0],
+ Basement: [toVector3(1304.38, -856.66, 5.490), 0],
+ Office1: [toVector3(-409.31, 285.49, 18.592), 0],
+ Office2: [toVector3(-1153.30, 417.37, 5.578), 0],
+ Office3: [toVector3(817.64, -259.77, 15.343), 0],
+ Office4: [toVector3(-86.35, 56.70, 75.953), 0],
+ HospitalRoom: [toVector3(1240.00, 192.44, 33.553), 0],
+ Church: [toVector3(-286.72, -282.36, 15.632), 0],
+ Prison: [toVector3(-1082.69, -364.05, 7.404), 0],
+ Ship: [toVector3(-336.53, -1494.56, 9.945), 0],
},
{}, // GTA IV EFLC
From 36cecc1955218d57106afc8bcde4d1a8cb28b7cf Mon Sep 17 00:00:00 2001
From: Vortrex <3858226+VortrexFTW@users.noreply.github.com>
Date: Fri, 25 Feb 2022 05:29:00 -0600
Subject: [PATCH 04/46] Vehicle fires
---
scripts/client/event.js | 1 +
scripts/client/utilities.js | 15 +++++++++++++++
2 files changed, 16 insertions(+)
diff --git a/scripts/client/event.js b/scripts/client/event.js
index 03ae0839..c2c9b340 100644
--- a/scripts/client/event.js
+++ b/scripts/client/event.js
@@ -95,6 +95,7 @@ function onProcess(event, deltaTime) {
processGameSpecifics();
processNearbyPickups();
processVehiclePurchasing();
+ processVehicleFires();
}
// ===========================================================================
diff --git a/scripts/client/utilities.js b/scripts/client/utilities.js
index 478530ee..bbf48cb2 100644
--- a/scripts/client/utilities.js
+++ b/scripts/client/utilities.js
@@ -901,4 +901,19 @@ function setVehiclePurchaseState(state, vehicleId, position) {
vehiclePurchasePosition = position;
}
+// ===========================================================================
+
+function processVehicleFires() {
+ let vehicles = getElementsByType(ELEMENT_VEHICLE);
+ for(let i in vehicles) {
+ if(vehicles[i].isSyncer) {
+ if(!doesEntityDataExist(vehicles[i], "vrr.fire")) {
+ triggerNetworkEvent("vrr.vehFire", vehicles[i].id);
+ } else {
+ vehicles[i].health = 249;
+ }
+ }
+ }
+}
+
// ===========================================================================
\ No newline at end of file
From dccf8d961d74435eb934c32d61fc1d6d32283de8 Mon Sep 17 00:00:00 2001
From: Vortrex <3858226+VortrexFTW@users.noreply.github.com>
Date: Tue, 8 Mar 2022 12:02:21 -0600
Subject: [PATCH 05/46] Add radar and area name to hud state
---
scripts/client/server.js | 2 ++
1 file changed, 2 insertions(+)
diff --git a/scripts/client/server.js b/scripts/client/server.js
index db892867..7146c918 100644
--- a/scripts/client/server.js
+++ b/scripts/client/server.js
@@ -139,6 +139,8 @@ function setPlayer2DRendering(hudState, labelState, smallGameMessageState, score
natives.displayCash(hudState);
natives.displayAmmo(hudState);
natives.displayHud(hudState);
+ natives.displayRadar(hudState);
+ natives.displayAreaName(hudState);
} else {
if(typeof setHUDEnabled != "undefined") {
setHUDEnabled(hudState);
From 8d1a5c81ea75de9061a9adb8bd720e34f30511bf Mon Sep 17 00:00:00 2001
From: Vortrex <3858226+VortrexFTW@users.noreply.github.com>
Date: Tue, 8 Mar 2022 12:02:33 -0600
Subject: [PATCH 06/46] Remove HUD stuff from initial game setup
---
scripts/client/startup.js | 12 ++++++------
1 file changed, 6 insertions(+), 6 deletions(-)
diff --git a/scripts/client/startup.js b/scripts/client/startup.js
index e2685005..549d2483 100644
--- a/scripts/client/startup.js
+++ b/scripts/client/startup.js
@@ -121,12 +121,12 @@ function setUpInitialGame() {
natives.setPickupsFixCars(false);
// HUD and Display
- natives.displayCash(false);
- natives.displayAmmo(false);
- natives.displayHud(false);
- natives.displayRadar(false);
- natives.displayAreaName(false);
- natives.displayPlayerNames(false);
+ //natives.displayCash(false);
+ //natives.displayAmmo(false);
+ //natives.displayHud(false);
+ //natives.displayRadar(false);
+ //natives.displayAreaName(false);
+ //natives.displayPlayerNames(false);
natives.setPoliceRadarBlips(false);
natives.removeTemporaryRadarBlipsForPickups();
natives.displayNonMinigameHelpMessages(false);
From 22ecb9ea50c7da58f3fe47d0ab05f4f4b62b1f16 Mon Sep 17 00:00:00 2001
From: Vortrex <3858226+VortrexFTW@users.noreply.github.com>
Date: Tue, 8 Mar 2022 12:02:43 -0600
Subject: [PATCH 07/46] Cleanup
---
scripts/server/account.js | 1 +
1 file changed, 1 insertion(+)
diff --git a/scripts/server/account.js b/scripts/server/account.js
index 87be5779..549fcdff 100644
--- a/scripts/server/account.js
+++ b/scripts/server/account.js
@@ -1126,6 +1126,7 @@ function initClient(client) {
updatePlayerSnowState(client);
showConnectCameraToPlayer(client);
+
messageClient(`Please wait ...`, client, getColourByName("softGreen"));
setTimeout(function() {
From ac59e8d9b3d0da76384729f25b90eebc27c77c8f Mon Sep 17 00:00:00 2001
From: Vortrex <3858226+VortrexFTW@users.noreply.github.com>
Date: Tue, 8 Mar 2022 12:02:55 -0600
Subject: [PATCH 08/46] Set rendering states on connect camera
---
scripts/server/utilities.js | 1 +
1 file changed, 1 insertion(+)
diff --git a/scripts/server/utilities.js b/scripts/server/utilities.js
index 92917103..b4f71220 100644
--- a/scripts/server/utilities.js
+++ b/scripts/server/utilities.js
@@ -283,6 +283,7 @@ function showConnectCameraToPlayer(client) {
//setPlayerDimension(client, 0);
setPlayerCameraLookAt(client, getServerConfig().connectCameraPosition, getServerConfig().connectCameraLookAt);
}
+ setPlayer2DRendering(client, false, false, false, false, false, false);
}
// ===========================================================================
From 2d12b7f30771497ed35d6a8a7b21d01bb7a67b5b Mon Sep 17 00:00:00 2001
From: Vortrex <3858226+VortrexFTW@users.noreply.github.com>
Date: Tue, 8 Mar 2022 12:52:24 -0600
Subject: [PATCH 09/46] Fix IV businesses
---
scripts/client/business.js | 30 ++++++++++++++++++++++++++----
scripts/client/main.js | 6 +++---
2 files changed, 29 insertions(+), 7 deletions(-)
diff --git a/scripts/client/business.js b/scripts/client/business.js
index 245826e2..10fb2e10 100644
--- a/scripts/client/business.js
+++ b/scripts/client/business.js
@@ -8,8 +8,9 @@
// ===========================================================================
class BusinessData {
- constructor(index, name, entrancePosition, blipModel, pickupModel, hasInterior, hasItems) {
- this.index = index;
+ constructor(businessId, name, entrancePosition, blipModel, pickupModel, hasInterior, hasItems) {
+ this.index = -1;
+ this.businessId = businessId;
this.name = name;
this.entrancePosition = entrancePosition;
this.blipModel = blipModel;
@@ -28,6 +29,7 @@ function receiveBusinessFromServer(businessId, name, entrancePosition, blipModel
if(blipModel == -1) {
natives.removeBlipAndClearIndex(getBusinessData(businessId).blipId);
businesses.splice(getBusinessData(businessId).index, 1);
+ setAllBusinessDataIndexes();
} else {
natives.setBlipCoordinates(getBusinessData(businessId).blipId, getBusinessData(businessId).entrancePosition);
natives.changeBlipSprite(getBusinessData(businessId).blipId, getBusinessData(businessId).blipModel);
@@ -35,18 +37,38 @@ function receiveBusinessFromServer(businessId, name, entrancePosition, blipModel
}
} else {
if(blipModel != -1) {
+ let tempBusinessData = new BusinessData(businessId, name, entrancePosition, blipModel, pickupModel, hasInterior, hasItems);
let blipId = natives.addBlipForCoord(entrancePosition);
if(blipId) {
- let tempBusinessData = new BusinessData(businessId, name, entrancePosition, blipModel, pickupModel, hasInterior, hasItems);
tempBusinessData.blipId = blipId;
natives.changeBlipSprite(blipId, blipModel);
natives.setBlipMarkerLongDistance(blipId, true);
natives.changeBlipNameFromAscii(blipId, `${name.substr(0, 24)}${(name.length > 24) ? " ...": ""}`);
- businesses.push(tempBusinessData);
}
+ businesses.push(tempBusinessData);
+ setAllBusinessDataIndexes();
}
}
}
}
+// ===========================================================================
+
+/**
+ * @param {number} businessId - The ID of the business (initially provided by server)
+ * @return {BusinessData} The business's data (class instance)
+ */
+function getBusinessData(businessId) {
+ let tempBusinessData = businesses.find((b) => b.businessId == businessId);
+ return (typeof tempBusinessData != "undefined") ? tempBusinessData : false;
+}
+
+// ===========================================================================
+
+function setAllBusinessDataIndexes() {
+ for(let i in businesses) {
+ businesses[i].index = i;
+ }
+}
+
// ===========================================================================
\ No newline at end of file
diff --git a/scripts/client/main.js b/scripts/client/main.js
index 7e56d8ce..6c1719b9 100644
--- a/scripts/client/main.js
+++ b/scripts/client/main.js
@@ -69,8 +69,8 @@ let forceWantedLevel = 0;
// Pre-cache all allowed skins
let allowedSkins = getAllowedSkins(getGame());
-let businesses = {};
-let houses = {};
-let jobs = {};
+let businesses = [];
+let houses = [];
+let jobs = [];
// ===========================================================================
\ No newline at end of file
From cdc54be6925df4935973327d7cdb8246470a2f32 Mon Sep 17 00:00:00 2001
From: Vortrex <3858226+VortrexFTW@users.noreply.github.com>
Date: Tue, 8 Mar 2022 12:55:57 -0600
Subject: [PATCH 10/46] Fix wrong arg in parked car native
---
scripts/client/startup.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/scripts/client/startup.js b/scripts/client/startup.js
index 549d2483..58d85b31 100644
--- a/scripts/client/startup.js
+++ b/scripts/client/startup.js
@@ -140,7 +140,7 @@ function setUpInitialGame() {
// Population
natives.dontSuppressAnyCarModels(5.0);
natives.dontSuppressAnyPedModels(5.0);
- natives.forceGenerateParkedCarsTooCloseToOthers(5.0);
+ natives.forceGenerateParkedCarsTooCloseToOthers(true);
natives.setParkedCarDensityMultiplier(5.0);
natives.setRandomCarDensityMultiplier(5.0);
natives.setPedDensityMultiplier(5.0);
From 1039ac8cfd8abc6f4a1a707cba91dc7cceaf9172 Mon Sep 17 00:00:00 2001
From: Vortrex <3858226+VortrexFTW@users.noreply.github.com>
Date: Tue, 8 Mar 2022 12:56:12 -0600
Subject: [PATCH 11/46] Fix wrong delimiter used in some staff cmd args
---
scripts/server/staff.js | 12 ++++--------
1 file changed, 4 insertions(+), 8 deletions(-)
diff --git a/scripts/server/staff.js b/scripts/server/staff.js
index adc48e5c..e0946934 100644
--- a/scripts/server/staff.js
+++ b/scripts/server/staff.js
@@ -46,7 +46,7 @@ function setStaffTitleCommand(command, params, client) {
return false;
}
- let splitParams = params.split("");
+ let splitParams = params.split(" ");
let targetClient = getPlayerFromParams(getParam(params, " ", 1));
let staffTitle = splitParams.slice(1).join(" ");
@@ -999,20 +999,16 @@ function forcePlayerSkinCommand(command, params, client) {
// return false;
//}
- let splitParams = params.split("");
+ let splitParams = params.split(" ");
let targetClient = getPlayerFromParams(splitParams[0]);
let skinIndex = getSkinModelIndexFromParams(splitParams.slice(1).join(" "), getGame());
- console.warn(targetClient.name);
- console.warn(splitParams.slice(1).join(" "));
- console.warn(skinIndex);
-
if(!targetClient) {
messagePlayerError(client, getLocaleString(client, "InvalidPlayer"));
return false;
}
- if(skinIndex == false) {
+ if(!skinIndex) {
messagePlayerError(client, getLocaleString(client, "InvalidSkin"));
return false;
}
@@ -1036,7 +1032,7 @@ function setPlayerHealthCommand(command, params, client) {
// return false;
//}
- let splitParams = params.split("");
+ let splitParams = params.split(" ");
let targetClient = getParam(params, " ", 1);
let health = getParam(params, " ", 2);
From 48ae78084e53e9ff5c9b5fb70fc80c9f08010c78 Mon Sep 17 00:00:00 2001
From: Vortrex <3858226+VortrexFTW@users.noreply.github.com>
Date: Tue, 8 Mar 2022 15:01:11 -0600
Subject: [PATCH 12/46] Disable skin change
---
scripts/client/server.js | 5 +++--
scripts/client/skin-select.js | 6 ++++--
2 files changed, 7 insertions(+), 4 deletions(-)
diff --git a/scripts/client/server.js b/scripts/client/server.js
index 7146c918..2bd4bf32 100644
--- a/scripts/client/server.js
+++ b/scripts/client/server.js
@@ -303,8 +303,9 @@ function setLocalPlayerInfiniteRun(state) {
function setLocalPlayerSkin(skinId) {
if(getGame() == VRR_GAME_GTA_IV) {
- //natives.changePlayerModel(natives.getPlayerId(), skinId);
- localPlayer.skin = allowedSkins[skinSelectorIndex][0];
+ natives.changePlayerModel(natives.getPlayerId(), skinId);
+ //localPlayer.skin = allowedSkins[skinSelectorIndex][0];
+ //localPlayer.modelIndex = allowedSkins[skinSelectorIndex][0];
} else {
localPlayer.skin = skinId;
}
diff --git a/scripts/client/skin-select.js b/scripts/client/skin-select.js
index 2f3149e7..2b361383 100644
--- a/scripts/client/skin-select.js
+++ b/scripts/client/skin-select.js
@@ -55,7 +55,8 @@ function processSkinSelectKeyPress(keyCode) {
skinSelectMessageTextTop = allowedSkins[skinSelectorIndex][1];
if(getGame() == VRR_GAME_GTA_IV) {
//natives.changePlayerModel(natives.getPlayerId(), allowedSkins[skinSelectorIndex][0]);
- localPlayer.skin = allowedSkins[skinSelectorIndex][0];
+ //localPlayer.skin = allowedSkins[skinSelectorIndex][0];
+ //localPlayer.modelIndex = allowedSkins[skinSelectorIndex][0];
} else {
localPlayer.skin = allowedSkins[skinSelectorIndex][0];
}
@@ -69,7 +70,8 @@ function processSkinSelectKeyPress(keyCode) {
skinSelectMessageTextTop = allowedSkins[skinSelectorIndex][1];
if(getGame() == VRR_GAME_GTA_IV) {
//natives.changePlayerModel(natives.getPlayerId(), allowedSkins[skinSelectorIndex][0]);
- localPlayer.skin = allowedSkins[skinSelectorIndex][0];
+ //localPlayer.skin = allowedSkins[skinSelectorIndex][0];
+ //localPlayer.modelIndex = allowedSkins[skinSelectorIndex][0];
} else {
localPlayer.skin = allowedSkins[skinSelectorIndex][0];
}
From 9ce663c1cdc6812b3316e3f26e91e89612f39073 Mon Sep 17 00:00:00 2001
From: Vortrex <3858226+VortrexFTW@users.noreply.github.com>
Date: Tue, 8 Mar 2022 15:01:22 -0600
Subject: [PATCH 13/46] Don't set population stuff
---
scripts/client/startup.js | 16 ++++++++--------
1 file changed, 8 insertions(+), 8 deletions(-)
diff --git a/scripts/client/startup.js b/scripts/client/startup.js
index 58d85b31..bd38327f 100644
--- a/scripts/client/startup.js
+++ b/scripts/client/startup.js
@@ -138,14 +138,14 @@ function setUpInitialGame() {
natives.setPlayersDropMoneyInNetworkGame(false);
// Population
- natives.dontSuppressAnyCarModels(5.0);
- natives.dontSuppressAnyPedModels(5.0);
- natives.forceGenerateParkedCarsTooCloseToOthers(true);
- natives.setParkedCarDensityMultiplier(5.0);
- natives.setRandomCarDensityMultiplier(5.0);
- natives.setPedDensityMultiplier(5.0);
- natives.setCarDensityMultiplier(5.0);
- natives.setScenarioPedDensityMultiplier(5.0, 5.0);
+ //natives.dontSuppressAnyCarModels(5.0);
+ //natives.dontSuppressAnyPedModels(5.0);
+ //natives.forceGenerateParkedCarsTooCloseToOthers(true);
+ //natives.setParkedCarDensityMultiplier(5.0);
+ //natives.setRandomCarDensityMultiplier(5.0);
+ //natives.setPedDensityMultiplier(5.0);
+ //natives.setCarDensityMultiplier(5.0);
+ //natives.setScenarioPedDensityMultiplier(5.0, 5.0);
natives.switchRandomTrains(true);
natives.switchRandomBoats(true);
natives.switchAmbientPlanes(true);
From dfb0578044fa130b01a01ea11e24d17663951baf Mon Sep 17 00:00:00 2001
From: Vortrex <3858226+VortrexFTW@users.noreply.github.com>
Date: Tue, 8 Mar 2022 15:01:30 -0600
Subject: [PATCH 14/46] Fix for server settings
---
scripts/server/config.js | 32 ++++++++++++++++----------------
1 file changed, 16 insertions(+), 16 deletions(-)
diff --git a/scripts/server/config.js b/scripts/server/config.js
index 815f7df1..829c0be9 100644
--- a/scripts/server/config.js
+++ b/scripts/server/config.js
@@ -84,6 +84,22 @@ function initConfigScript() {
serverConfig = loadServerConfigFromGameAndPort(server.game, server.port, getMultiplayerMod());
logToConsole(LOG_DEBUG, "[VRR.Config]: Applying server config ...");
+
+ getServerConfig().fallingSnow = hasBitFlag(getServerConfig().settings, getServerSettingsFlagValue("FallingSnow"));
+ getServerConfig().groundSnow = hasBitFlag(getServerConfig().settings, getServerSettingsFlagValue("GroundSnow"));
+ getServerConfig().useGUI = hasBitFlag(getServerConfig().settings, getServerSettingsFlagValue("GUI"));
+ getServerConfig().showLogo = hasBitFlag(getServerConfig().settings, getServerSettingsFlagValue("Logo"));
+ getServerConfig().testerOnly = hasBitFlag(getServerConfig().settings, getServerSettingsFlagValue("Testing"));
+ getServerConfig().discordEnabled = hasBitFlag(getServerConfig().settings, getServerSettingsFlagValue("DiscordBot"));
+ getServerConfig().createJobPickups = hasBitFlag(getServerConfig().settings, getServerSettingsFlagValue("JobPickups"));
+ getServerConfig().createBusinessPickups = hasBitFlag(getServerConfig().settings, getServerSettingsFlagValue("BusinessPickups"));
+ getServerConfig().createHousePickups = hasBitFlag(getServerConfig().settings, getServerSettingsFlagValue("HousePickups"));
+ getServerConfig().createJobBlips = hasBitFlag(getServerConfig().settings, getServerSettingsFlagValue("JobBlips"));
+ getServerConfig().createBusinessBlips = hasBitFlag(getServerConfig().settings, getServerSettingsFlagValue("BusinessBlips"));
+ getServerConfig().createHouseBlips = hasBitFlag(getServerConfig().settings, getServerSettingsFlagValue("HouseBlips"));
+ getServerConfig().useRealTime = hasBitFlag(getServerConfig().settings, getServerSettingsFlagValue("RealTime"));
+ getServerConfig().antiCheat.enabled = hasBitFlag(getServerConfig().settings, getServerSettingsFlagValue("Anticheat"));
+
applyConfigToServer(serverConfig);
logToConsole(LOG_DEBUG, "[VRR.Config]: All config loaded and applied successfully!");
@@ -131,22 +147,6 @@ function loadServerConfigFromId(tempServerId) {
if(dbQuery.numRows > 0) {
let dbAssoc = fetchQueryAssoc(dbQuery);
let tempServerConfigData = new ServerData(dbAssoc);
-
- tempServerConfigData.fallingSnow = hasBitFlag(tempServerConfigData.settings, getServerSettingsFlagValue("FallingSnow"));
- tempServerConfigData.groundSnow = hasBitFlag(tempServerConfigData.settings, getServerSettingsFlagValue("GroundSnow"));
- tempServerConfigData.useGUI = hasBitFlag(tempServerConfigData.settings, getServerSettingsFlagValue("GUI"));
- tempServerConfigData.showLogo = hasBitFlag(tempServerConfigData.settings, getServerSettingsFlagValue("Logo"));
- tempServerConfigData.testerOnly = hasBitFlag(tempServerConfigData.settings, getServerSettingsFlagValue("Testing"));
- tempServerConfigData.discordEnabled = hasBitFlag(tempServerConfigData.settings, getServerSettingsFlagValue("DiscordBot"));
- tempServerConfigData.createJobPickups = hasBitFlag(tempServerConfigData.settings, getServerSettingsFlagValue("JobPickups"));
- tempServerConfigData.createBusinessPickups = hasBitFlag(tempServerConfigData.settings, getServerSettingsFlagValue("BusinessPickups"));
- tempServerConfigData.createHousePickups = hasBitFlag(tempServerConfigData.settings, getServerSettingsFlagValue("HousePickups"));
- tempServerConfigData.createJobBlips = hasBitFlag(tempServerConfigData.settings, getServerSettingsFlagValue("JobBlips"));
- tempServerConfigData.createBusinessBlips = hasBitFlag(tempServerConfigData.settings, getServerSettingsFlagValue("BusinessBlips"));
- tempServerConfigData.createHouseBlips = hasBitFlag(tempServerConfigData.settings, getServerSettingsFlagValue("HouseBlips"));
- tempServerConfigData.useRealTime = hasBitFlag(tempServerConfigData.settings, getServerSettingsFlagValue("RealTime"));
- tempServerConfigData.antiCheat.enabled = hasBitFlag(tempServerConfigData.settings, getServerSettingsFlagValue("Anticheat"));
-
freeDatabaseQuery(dbQuery);
return tempServerConfigData;
}
From 9a09dcbe3cb21ca269dfb0ff127cc7f797f7ea34 Mon Sep 17 00:00:00 2001
From: Vortrex <3858226+VortrexFTW@users.noreply.github.com>
Date: Tue, 8 Mar 2022 15:01:36 -0600
Subject: [PATCH 15/46] Testing
---
scripts/server/subaccount.js | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/scripts/server/subaccount.js b/scripts/server/subaccount.js
index e9a16789..af332474 100644
--- a/scripts/server/subaccount.js
+++ b/scripts/server/subaccount.js
@@ -375,6 +375,11 @@ function selectCharacter(client, characterId = -1) {
spawnPlayer(client, spawnPosition, spawnHeading, getGameConfig().skins[getGame()][skin][0], spawnInterior, spawnDimension);
} else if(getGame() == VRR_GAME_GTA_IV) {
spawnPlayer(client, spawnPosition, spawnHeading, getGameConfig().skins[getGame()][skin][0], spawnInterior, spawnDimension);
+ //setPlayerSkin(client, skin);
+ //setPlayerPosition(client, spawnPosition);
+ //setPlayerHeading(client, spawnHeading);
+ //setPlayerInterior(client, spawnInterior);
+ //setPlayerDimension(client, spawnDimension);
} else if(getGame() >= VRR_GAME_MAFIA_ONE) {
spawnPlayer(client, getGameConfig().skins[getGame()][skin][0], spawnPosition, spawnHeading);
}
From 9274a83cf16668e9d5f5b7c4554c3c59121c1580 Mon Sep 17 00:00:00 2001
From: Vortrex <3858226+VortrexFTW@users.noreply.github.com>
Date: Tue, 8 Mar 2022 15:01:47 -0600
Subject: [PATCH 16/46] Add melee weapon data
---
scripts/shared/gamedata.js | 16 ++++++++++++----
1 file changed, 12 insertions(+), 4 deletions(-)
diff --git a/scripts/shared/gamedata.js b/scripts/shared/gamedata.js
index 75a543ac..b7487a02 100644
--- a/scripts/shared/gamedata.js
+++ b/scripts/shared/gamedata.js
@@ -3320,10 +3320,18 @@ let gameData = {
],
meleeWeapons: [
[],
- [1],
- [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11],
- [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15],
- [],
+ [1], // III
+ [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11], // VC
+ [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15], // SA
+ [], // UG
+ [1, 3], // IV
+ [], // Invalid
+ [], // Invalid
+ [], // Invalid
+ [], // M1
+ [], // M2
+ [], // M3
+ [], // M1DE
],
blipSprites: [
false,
From b74e3b1152b5d130a0ab3e186bf7fc6de92ad887 Mon Sep 17 00:00:00 2001
From: Vortrex <3858226+VortrexFTW@users.noreply.github.com>
Date: Tue, 8 Mar 2022 15:09:03 -0600
Subject: [PATCH 17/46] More locale strings
---
locale/chinese.json | 4 +++-
locale/english.json | 4 +++-
locale/polish.json | 4 +++-
locale/russian.json | 4 +++-
locale/spanish.json | 4 +++-
5 files changed, 15 insertions(+), 5 deletions(-)
diff --git a/locale/chinese.json b/locale/chinese.json
index 57eab3d4..5286e7db 100644
--- a/locale/chinese.json
+++ b/locale/chinese.json
@@ -391,5 +391,7 @@
"NotATester": "You are not a tester!",
"AccessDenied": "AccessDenied",
"InvalidSkin": "That skin is invalid!",
- "HeaderInteriorTypes": "Interiors"
+ "HeaderInteriorTypes": "Interiors List",
+ "ViewInventoryKeyPressTip": "Press {1} to see your items",
+ "ViewInventoryCommandTip": "Use {1} to see your items"
}
diff --git a/locale/english.json b/locale/english.json
index db17cb30..5f68c88e 100644
--- a/locale/english.json
+++ b/locale/english.json
@@ -391,5 +391,7 @@
"NotATester": "You are not a tester!",
"AccessDenied": "AccessDenied",
"InvalidSkin": "That skin is invalid!",
- "HeaderInteriorTypes": "Interiors"
+ "HeaderInteriorTypes": "Interiors List",
+ "ViewInventoryKeyPressTip": "Press {1} to see your items",
+ "ViewInventoryCommandTip": "Use {1} to see your items"
}
diff --git a/locale/polish.json b/locale/polish.json
index 02a57f7c..e38d5e1f 100644
--- a/locale/polish.json
+++ b/locale/polish.json
@@ -391,5 +391,7 @@
"NotATester": "You are not a tester!",
"AccessDenied": "AccessDenied",
"InvalidSkin": "That skin is invalid!",
- "HeaderInteriorTypes": "Interiors"
+ "HeaderInteriorTypes": "Interiors List",
+ "ViewInventoryKeyPressTip": "Press {1} to see your items",
+ "ViewInventoryCommandTip": "Use {1} to see your items"
}
diff --git a/locale/russian.json b/locale/russian.json
index b9a0ade7..82a535d2 100644
--- a/locale/russian.json
+++ b/locale/russian.json
@@ -390,5 +390,7 @@
"NotATester": "ะั ะฝะต ัะตััะธัะพะฒัะธะบ!",
"AccessDenied": "ะะพัััะฟ ะทะฐะฟัะตัะตะฝ",
"InvalidSkin": "That skin is invalid!",
- "HeaderInteriorTypes": "Interiors"
+ "HeaderInteriorTypes": "Interiors List",
+ "ViewInventoryKeyPressTip": "Press {1} to see your items",
+ "ViewInventoryCommandTip": "Use {1} to see your items"
}
diff --git a/locale/spanish.json b/locale/spanish.json
index 070a9811..7562b925 100644
--- a/locale/spanish.json
+++ b/locale/spanish.json
@@ -395,5 +395,7 @@
"NotATester": "You are not a tester!",
"AccessDenied": "AccessDenied",
"InvalidSkin": "That skin is invalid!",
- "HeaderInteriorTypes": "Interiors"
+ "HeaderInteriorTypes": "Interiors List",
+ "ViewInventoryKeyPressTip": "Press {1} to see your items",
+ "ViewInventoryCommandTip": "Use {1} to see your items"
}
From 9887536bcc37237dea082bd21f2d2ee01cada170 Mon Sep 17 00:00:00 2001
From: Vortrex <3858226+VortrexFTW@users.noreply.github.com>
Date: Wed, 9 Mar 2022 00:12:44 -0600
Subject: [PATCH 18/46] Start working on checkpoint display
---
scripts/client/label.js | 6 ++++--
1 file changed, 4 insertions(+), 2 deletions(-)
diff --git a/scripts/client/label.js b/scripts/client/label.js
index a8d2664d..d794b549 100644
--- a/scripts/client/label.js
+++ b/scripts/client/label.js
@@ -251,8 +251,10 @@ function processLabelRendering() {
if(localPlayer != null) {
if(!areServerElementsSupported()) {
//for(let i in businesses) {
- // if(pickups[i].getData("vrr.label.type") != null) {
- // if(getDistance(localPlayer.position, pickups[i].position) <= renderLabelDistance) {
+ // if(getDistance(localPlayer.position, businesses[i].entrancePosition) <= 75.0) {
+ // natives.drawColouredCylinder(businesses[i].entrancePosition, 0.0, 0.0, 0, 153, 255);
+ // }
+ //}
// natives.getScreenViewportId
// natives.getGameViewportId
From a5afefaf39b706354a53f62022e0f9b6033e2888 Mon Sep 17 00:00:00 2001
From: Vortrex <3858226+VortrexFTW@users.noreply.github.com>
Date: Wed, 9 Mar 2022 00:12:54 -0600
Subject: [PATCH 19/46] Add client house script
---
meta.xml | 1 +
scripts/client/house.js | 82 +++++++++++++++++++++++++++++++++++++++++
2 files changed, 83 insertions(+)
create mode 100644 scripts/client/house.js
diff --git a/meta.xml b/meta.xml
index dd4d6d07..79e7de37 100644
--- a/meta.xml
+++ b/meta.xml
@@ -119,6 +119,7 @@
+
diff --git a/scripts/client/house.js b/scripts/client/house.js
new file mode 100644
index 00000000..aca1deca
--- /dev/null
+++ b/scripts/client/house.js
@@ -0,0 +1,82 @@
+// ===========================================================================
+// Vortrex's Roleplay Resource
+// https://github.com/VortrexFTW/gtac_roleplay
+// ===========================================================================
+// FILE: house.js
+// DESC: Provides house functions and usage
+// TYPE: Client (JavaScript)
+// ===========================================================================
+
+class HouseData {
+ constructor(houseId, entrancePosition, blipModel, pickupModel, hasInterior) {
+ this.index = -1;
+ this.houseId = houseId;
+ this.entrancePosition = entrancePosition;
+ this.blipModel = blipModel;
+ this.pickupModel = pickupModel;
+ this.hasInterior = hasInterior;
+ this.blipId = -1;
+ }
+}
+
+// ===========================================================================
+
+function receiveHouseFromServer(houseId, entrancePosition, blipModel, pickupModel, hasInterior) {
+ if(getGame() == VRR_GAME_GTA_IV) {
+ if(getHouseData(houseId) != false) {
+ if(blipModel == -1) {
+ natives.removeBlipAndClearIndex(getHouseData(houseId).blipId);
+ getHouseData(houseId).blipId = -1;
+ //houses.splice(getHouseData(houseId).index, 1);
+ //setAllHouseDataIndexes();
+ } else {
+ if(getHouseData(houseId).blipId != -1) {
+ natives.setBlipCoordinates(getHouseData(houseId).blipId, getHouseData(houseId).entrancePosition);
+ natives.changeBlipSprite(getHouseData(houseId).blipId, getHouseData(houseId).blipModel);
+ //natives.changeBlipNameFromAscii(getHouseData(houseId).blipId, `${name.substr(0, 24)}${(name.length > 24) ? " ...": ""}`);
+ } else {
+ let blipId = natives.addBlipForCoord(entrancePosition);
+ if(blipId) {
+ getHouseData(houseId).blipId = blipId;
+ natives.changeBlipSprite(blipId, blipModel);
+ natives.setBlipMarkerLongDistance(blipId, false);
+ }
+ }
+ }
+ } else {
+ if(blipModel != -1) {
+ let tempHouseData = new HouseData(houseId, entrancePosition, blipModel, pickupModel, hasInterior, hasItems);
+ let blipId = natives.addBlipForCoord(entrancePosition);
+ if(blipId) {
+ tempHouseData.blipId = blipId;
+ natives.changeBlipSprite(blipId, blipModel);
+ natives.setBlipMarkerLongDistance(blipId, false);
+ //natives.changeBlipNameFromAscii(blipId, `${name.substr(0, 24)}${(name.length > 24) ? " ...": ""}`);
+ }
+ houses.push(tempHouseData);
+ setAllHouseDataIndexes();
+ }
+ }
+ }
+}
+
+// ===========================================================================
+
+/**
+ * @param {number} houseId - The ID of the house (initially provided by server)
+ * @return {HouseData} The house's data (class instance)
+ */
+function getHouseData(houseId) {
+ let tempHouseData = houses.find((h) => h.houseId == houseId);
+ return (typeof tempHouseData != "undefined") ? tempHouseData : false;
+}
+
+// ===========================================================================
+
+function setAllHouseDataIndexes() {
+ for(let i in houses) {
+ houses[i].index = i;
+ }
+}
+
+// ===========================================================================
\ No newline at end of file
From d1bf0441e98e1ee4d3a5ff8b25b7187145ab311a Mon Sep 17 00:00:00 2001
From: Vortrex <3858226+VortrexFTW@users.noreply.github.com>
Date: Wed, 9 Mar 2022 00:13:10 -0600
Subject: [PATCH 20/46] Fix for blip change (needs tested)
---
scripts/client/business.js | 22 ++++++++++++++++------
1 file changed, 16 insertions(+), 6 deletions(-)
diff --git a/scripts/client/business.js b/scripts/client/business.js
index 10fb2e10..3bcee937 100644
--- a/scripts/client/business.js
+++ b/scripts/client/business.js
@@ -28,12 +28,22 @@ function receiveBusinessFromServer(businessId, name, entrancePosition, blipModel
if(getBusinessData(businessId) != false) {
if(blipModel == -1) {
natives.removeBlipAndClearIndex(getBusinessData(businessId).blipId);
- businesses.splice(getBusinessData(businessId).index, 1);
- setAllBusinessDataIndexes();
+ getBusinessData(businessId).blipId = -1;
+ //businesses.splice(getBusinessData(businessId).index, 1);
+ //setAllBusinessDataIndexes();
} else {
- natives.setBlipCoordinates(getBusinessData(businessId).blipId, getBusinessData(businessId).entrancePosition);
- natives.changeBlipSprite(getBusinessData(businessId).blipId, getBusinessData(businessId).blipModel);
- natives.changeBlipNameFromAscii(getBusinessData(businessId).blipId, `${name.substr(0, 24)}${(name.length > 24) ? " ...": ""}`);
+ if(getBusinessData(businessId).blipId != -1) {
+ natives.setBlipCoordinates(getBusinessData(businessId).blipId, getBusinessData(businessId).entrancePosition);
+ natives.changeBlipSprite(getBusinessData(businessId).blipId, getBusinessData(businessId).blipModel);
+ natives.changeBlipNameFromAscii(getBusinessData(businessId).blipId, `${name.substr(0, 24)}${(name.length > 24) ? " ...": ""}`);
+ } else {
+ let blipId = natives.addBlipForCoord(entrancePosition);
+ if(blipId) {
+ getBusinessData(businessId).blipId = blipId;
+ natives.changeBlipSprite(blipId, blipModel);
+ natives.setBlipMarkerLongDistance(blipId, false);
+ }
+ }
}
} else {
if(blipModel != -1) {
@@ -42,7 +52,7 @@ function receiveBusinessFromServer(businessId, name, entrancePosition, blipModel
if(blipId) {
tempBusinessData.blipId = blipId;
natives.changeBlipSprite(blipId, blipModel);
- natives.setBlipMarkerLongDistance(blipId, true);
+ natives.setBlipMarkerLongDistance(blipId, false);
natives.changeBlipNameFromAscii(blipId, `${name.substr(0, 24)}${(name.length > 24) ? " ...": ""}`);
}
businesses.push(tempBusinessData);
From fa8911c92dfecd4a84e25e5b8dd0daa22b127539 Mon Sep 17 00:00:00 2001
From: Vortrex <3858226+VortrexFTW@users.noreply.github.com>
Date: Wed, 9 Mar 2022 00:13:26 -0600
Subject: [PATCH 21/46] Added client vehicles array
---
scripts/client/main.js | 1 +
1 file changed, 1 insertion(+)
diff --git a/scripts/client/main.js b/scripts/client/main.js
index 6c1719b9..e28117a2 100644
--- a/scripts/client/main.js
+++ b/scripts/client/main.js
@@ -72,5 +72,6 @@ let allowedSkins = getAllowedSkins(getGame());
let businesses = [];
let houses = [];
let jobs = [];
+let vehicles = [];
// ===========================================================================
\ No newline at end of file
From 8d5ca7ed6b1d150a0a1c619339e22caa90f71378 Mon Sep 17 00:00:00 2001
From: Vortrex <3858226+VortrexFTW@users.noreply.github.com>
Date: Wed, 9 Mar 2022 00:13:32 -0600
Subject: [PATCH 22/46] Indentation
---
scripts/shared/gamedata.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/scripts/shared/gamedata.js b/scripts/shared/gamedata.js
index b7487a02..ddccfa16 100644
--- a/scripts/shared/gamedata.js
+++ b/scripts/shared/gamedata.js
@@ -4046,8 +4046,8 @@ let gameData = {
["M4", 500, 2],
["Beretta Shotgun", 500, 2],
["Sniper Rifle", 500, 2],
+ ["Micro Uzi Ammo", 500, 2],
["MP5 Ammo", 500, 2],
- ["Micro Uzi Ammo", 500, 2],
["AK-47 Ammo", 500, 2],
["M4 Ammo", 500, 2],
["Beretta Shotgun Ammo", 500, 2],
From cf6970e3e17874fcaa44599887189268b2a6bff0 Mon Sep 17 00:00:00 2001
From: Vortrex <3858226+VortrexFTW@users.noreply.github.com>
Date: Wed, 9 Mar 2022 02:49:53 -0600
Subject: [PATCH 23/46] Debug logging
---
scripts/client/business.js | 14 +++++++++++---
1 file changed, 11 insertions(+), 3 deletions(-)
diff --git a/scripts/client/business.js b/scripts/client/business.js
index 3bcee937..3eb7aee8 100644
--- a/scripts/client/business.js
+++ b/scripts/client/business.js
@@ -24,19 +24,25 @@ class BusinessData {
// ===========================================================================
function receiveBusinessFromServer(businessId, name, entrancePosition, blipModel, pickupModel, hasInterior, hasItems) {
+ logToConsole(LOG_DEBUG, `[VRR.Business] Received business ${businessId} (${name}) from server`);
if(getGame() == VRR_GAME_GTA_IV) {
if(getBusinessData(businessId) != false) {
+ logToConsole(LOG_DEBUG, `[VRR.Business] Business ${businessId} already exists. Checking blip ...`);
if(blipModel == -1) {
+ logToConsole(LOG_DEBUG, `[VRR.Business] Business ${businessId}'s blip has been removed by the server`);
natives.removeBlipAndClearIndex(getBusinessData(businessId).blipId);
getBusinessData(businessId).blipId = -1;
//businesses.splice(getBusinessData(businessId).index, 1);
//setAllBusinessDataIndexes();
} else {
+ logToConsole(LOG_DEBUG, `[VRR.Business] Business ${businessId}'s blip has been changed by the server`);
if(getBusinessData(businessId).blipId != -1) {
+ logToConsole(LOG_DEBUG, `[VRR.Business] Business ${businessId}'s blip has been modified by the server`);
natives.setBlipCoordinates(getBusinessData(businessId).blipId, getBusinessData(businessId).entrancePosition);
natives.changeBlipSprite(getBusinessData(businessId).blipId, getBusinessData(businessId).blipModel);
natives.changeBlipNameFromAscii(getBusinessData(businessId).blipId, `${name.substr(0, 24)}${(name.length > 24) ? " ...": ""}`);
} else {
+ logToConsole(LOG_DEBUG, `[VRR.Business] Business ${businessId}'s blip has been added by the server`);
let blipId = natives.addBlipForCoord(entrancePosition);
if(blipId) {
getBusinessData(businessId).blipId = blipId;
@@ -46,8 +52,10 @@ function receiveBusinessFromServer(businessId, name, entrancePosition, blipModel
}
}
} else {
+ logToConsole(LOG_DEBUG, `[VRR.Business] Business ${businessId} doesn't exist. Adding ...`);
+ let tempBusinessData = new BusinessData(businessId, name, entrancePosition, blipModel, pickupModel, hasInterior, hasItems);
if(blipModel != -1) {
- let tempBusinessData = new BusinessData(businessId, name, entrancePosition, blipModel, pickupModel, hasInterior, hasItems);
+ logToConsole(LOG_DEBUG, `[VRR.Business] Business ${businessId}'s blip has been added by the server`);
let blipId = natives.addBlipForCoord(entrancePosition);
if(blipId) {
tempBusinessData.blipId = blipId;
@@ -55,9 +63,9 @@ function receiveBusinessFromServer(businessId, name, entrancePosition, blipModel
natives.setBlipMarkerLongDistance(blipId, false);
natives.changeBlipNameFromAscii(blipId, `${name.substr(0, 24)}${(name.length > 24) ? " ...": ""}`);
}
- businesses.push(tempBusinessData);
- setAllBusinessDataIndexes();
}
+ businesses.push(tempBusinessData);
+ setAllBusinessDataIndexes();
}
}
}
From 977e0da97d66ff5a72fcba44a4a58e25253be552 Mon Sep 17 00:00:00 2001
From: Vortrex <3858226+VortrexFTW@users.noreply.github.com>
Date: Wed, 9 Mar 2022 02:50:03 -0600
Subject: [PATCH 24/46] Enter veh event for IV
---
scripts/client/event.js | 20 +++++++-------------
1 file changed, 7 insertions(+), 13 deletions(-)
diff --git a/scripts/client/event.js b/scripts/client/event.js
index 03ae0839..c654229e 100644
--- a/scripts/client/event.js
+++ b/scripts/client/event.js
@@ -144,9 +144,7 @@ function onElementStreamIn(event, element) {
function onLocalPlayerExitedVehicle(event, vehicle, seat) {
logToConsole(LOG_DEBUG, `[VRR.Event] Local player exited vehicle`);
- if(areServerElementsSupported()) {
- sendNetworkEventToServer("vrr.onPlayerExitVehicle", getVehicleForNetworkEvent(vehicle), seat);
- }
+ sendNetworkEventToServer("vrr.onPlayerExitVehicle", getVehicleForNetworkEvent(vehicle), seat);
if(inVehicleSeat) {
parkedVehiclePosition = false;
@@ -159,17 +157,13 @@ function onLocalPlayerExitedVehicle(event, vehicle, seat) {
function onLocalPlayerEnteredVehicle(event, vehicle, seat) {
logToConsole(LOG_DEBUG, `[VRR.Event] Local player entered vehicle`);
- if(areServerElementsSupported()) {
- sendNetworkEventToServer("vrr.onPlayerEnterVehicle", getVehicleForNetworkEvent(vehicle), seat);
+ sendNetworkEventToServer("vrr.onPlayerEnterVehicle", getVehicleForNetworkEvent(vehicle), seat);
- if(inVehicleSeat == 0) {
- if(inVehicle.owner != -1) {
- inVehicle.engine = false;
- if(!inVehicle.engine) {
- parkedVehiclePosition = inVehicle.position;
- parkedVehicleHeading = inVehicle.heading;
- }
- }
+ if(inVehicleSeat == 0) {
+ inVehicle.engine = false;
+ if(!inVehicle.engine) {
+ parkedVehiclePosition = inVehicle.position;
+ parkedVehicleHeading = inVehicle.heading;
}
}
}
From c8d8a84c5d5174140aed7a69b1299cf91d1f2aa5 Mon Sep 17 00:00:00 2001
From: Vortrex <3858226+VortrexFTW@users.noreply.github.com>
Date: Wed, 9 Mar 2022 02:50:19 -0600
Subject: [PATCH 25/46] Fix server enter veh event for IV
---
scripts/client/house.js | 6 +-
scripts/server/event.js | 351 +++++++++++++++++++---------------------
2 files changed, 172 insertions(+), 185 deletions(-)
diff --git a/scripts/client/house.js b/scripts/client/house.js
index aca1deca..19631aad 100644
--- a/scripts/client/house.js
+++ b/scripts/client/house.js
@@ -44,8 +44,8 @@ function receiveHouseFromServer(houseId, entrancePosition, blipModel, pickupMode
}
}
} else {
+ let tempHouseData = new HouseData(houseId, entrancePosition, blipModel, pickupModel, hasInterior, hasItems);
if(blipModel != -1) {
- let tempHouseData = new HouseData(houseId, entrancePosition, blipModel, pickupModel, hasInterior, hasItems);
let blipId = natives.addBlipForCoord(entrancePosition);
if(blipId) {
tempHouseData.blipId = blipId;
@@ -53,9 +53,9 @@ function receiveHouseFromServer(houseId, entrancePosition, blipModel, pickupMode
natives.setBlipMarkerLongDistance(blipId, false);
//natives.changeBlipNameFromAscii(blipId, `${name.substr(0, 24)}${(name.length > 24) ? " ...": ""}`);
}
- houses.push(tempHouseData);
- setAllHouseDataIndexes();
}
+ houses.push(tempHouseData);
+ setAllHouseDataIndexes();
}
}
}
diff --git a/scripts/server/event.js b/scripts/server/event.js
index eb0b6294..b075a17a 100644
--- a/scripts/server/event.js
+++ b/scripts/server/event.js
@@ -240,131 +240,115 @@ async function onPlayerEnteredVehicle(client, clientVehicle, seat) {
return false;
}
- if(client.player == null) {
+ let vehicle = null;
+
+ if(getGame() == VRR_GAME_GTA_IV) {
+ vehicle = getVehicleFromIVNetworkId(clientVehicle);
+ } else {
+ if(client.player == null) {
+ return false;
+ }
+
+ await waitUntil(() => client != null && client.player != null && client.player.vehicle != null);
+
+ vehicle = client.player.vehicle;
+ }
+
+ if(!getVehicleData(vehicle)) {
return false;
}
- await waitUntil(() => client != null && client.player != null && client.player.vehicle != null);
- //setTimeout(function() {
- //if(client.player.vehicle == null) {
- // onPlayerEnteredVehicle(client, clientVehicle, seat);
- //}
+ logToConsole(LOG_DEBUG, `[VRR.Event] ${getPlayerDisplayForConsole(client)} entered a ${getVehicleName(vehicle)} (ID: ${vehicle.getData("vrr.dataSlot")}, Database ID: ${getVehicleData(vehicle).databaseId})`);
- let vehicle = client.player.vehicle;
+ getPlayerData(client).lastVehicle = vehicle;
+ getVehicleData(vehicle).lastActiveTime = getCurrentUnixTimestamp();
- //if(vehicle.syncer != client.index) {
- // if(getPlayerVehicleSeat(client) == VRR_VEHSEAT_DRIVER) {
- // vehicle.setSyncer(client, true);
- // }
- //}
+ if(getPlayerVehicleSeat(client) == VRR_VEHSEAT_DRIVER) {
+ vehicle.engine = getVehicleData(vehicle).engine;
- if(vehicle.owner != -1) {
- return false;
- }
-
- if(!getVehicleData(vehicle)) {
- return false;
- }
-
- //if(getPlayerData(client).enteringVehicle == null || getPlayerData(client).enteringVehicle != vehicle) {
- // messagePlayerError(client, "You can't enter this vehicle!");
- // removePlayerFromVehicle(client);
- // messageAdmins(`{ALTCOLOUR}${getPlayerName(client)} {MAINCOLOUR}tried to warp into a locked vehicle`);
- // return false;
- //}
-
- logToConsole(LOG_DEBUG, `[VRR.Event] ${getPlayerDisplayForConsole(client)} entered a ${getVehicleName(vehicle)} (ID: ${vehicle.getData("vrr.dataSlot")}, Database ID: ${getVehicleData(vehicle).databaseId})`);
-
- getPlayerData(client).lastVehicle = vehicle;
- getVehicleData(vehicle).lastActiveTime = getCurrentUnixTimestamp();
-
- if(getPlayerVehicleSeat(client) == VRR_VEHSEAT_DRIVER) {
- vehicle.engine = getVehicleData(vehicle).engine;
-
- if(getVehicleData(vehicle).buyPrice > 0) {
- messagePlayerAlert(client, getLocaleString(client, "VehicleForSale", getVehicleName(vehicle), `{ALTCOLOUR}$${makeLargeNumberReadable(getVehicleData(vehicle).buyPrice)}{MAINCOLOUR}`, `{ALTCOLOUR}/vehbuy{MAINCOLOUR}`));
+ if(getVehicleData(vehicle).buyPrice > 0) {
+ messagePlayerAlert(client, getLocaleString(client, "VehicleForSale", getVehicleName(vehicle), `{ALTCOLOUR}$${makeLargeNumberReadable(getVehicleData(vehicle).buyPrice)}{MAINCOLOUR}`, `{ALTCOLOUR}/vehbuy{MAINCOLOUR}`));
+ resetVehiclePosition(vehicle);
+ } else if(getVehicleData(vehicle).rentPrice > 0) {
+ if(getVehicleData(vehicle).rentedBy != client) {
+ messagePlayerAlert(client, getLocaleString(client, "VehicleForRent", getVehicleName(vehicle), `{ALTCOLOUR}$${makeLargeNumberReadable(getVehicleData(vehicle).rentPrice)}{MAINCOLOUR}`, `{ALTCOLOUR}/vehrent{MAINCOLOUR}`));
resetVehiclePosition(vehicle);
- } else if(getVehicleData(vehicle).rentPrice > 0) {
- if(getVehicleData(vehicle).rentedBy != client) {
- messagePlayerAlert(client, getLocaleString(client, "VehicleForRent", getVehicleName(vehicle), `{ALTCOLOUR}$${makeLargeNumberReadable(getVehicleData(vehicle).rentPrice)}{MAINCOLOUR}`, `{ALTCOLOUR}/vehrent{MAINCOLOUR}`));
- resetVehiclePosition(vehicle);
- } else {
- messagePlayerAlert(client, `You are renting this ${getVehicleName(vehicle)} for {ALTCOLOUR}$${makeLargeNumberReadable(getVehicleData(vehicle).rentPrice)} per minute. {MAINCOLOUR}Use {ALTCOLOUR}/stoprent {MAINCOLOUR}if you want to stop renting it.`);
- }
} else {
- let ownerName = "Nobody";
- let ownerType = "None";
- ownerType = toLowerCase(getVehicleOwnerTypeText(getVehicleData(vehicle).ownerType));
- switch(getVehicleData(vehicle).ownerType) {
- case VRR_VEHOWNER_CLAN:
- ownerName = getClanData(getClanIdFromDatabaseId(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}`;
- 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 {ALTCOLOUR}${ownerName} (${ownerType})`);
+ messagePlayerAlert(client, `You are renting this ${getVehicleName(vehicle)} for {ALTCOLOUR}$${makeLargeNumberReadable(getVehicleData(vehicle).rentPrice)} per minute. {MAINCOLOUR}Use {ALTCOLOUR}/stoprent {MAINCOLOUR}if you want to stop renting it.`);
}
+ } else {
+ let ownerName = "Nobody";
+ let ownerType = "None";
+ ownerType = toLowerCase(getVehicleOwnerTypeText(getVehicleData(vehicle).ownerType));
+ switch(getVehicleData(vehicle).ownerType) {
+ case VRR_VEHOWNER_CLAN:
+ ownerName = getClanData(getClanIdFromDatabaseId(getVehicleData(vehicle).ownerId)).name;
+ ownerType = "clan";
+ break;
- if(!getVehicleData(vehicle).engine) {
- if(getVehicleData(vehicle).buyPrice == 0 && getVehicleData(vehicle).rentPrice == 0) {
- if(doesPlayerHaveVehicleKeys(client, vehicle)) {
- if(!doesPlayerHaveKeyBindsDisabled(client) && doesPlayerHaveKeyBindForCommand(client, "engine")) {
- messagePlayerTip(client, `This ${getVehicleName(vehicle)}'s engine is off. Press {ALTCOLOUR}${toUpperCase(getKeyNameFromId(getPlayerKeyBindForCommand(client, "engine").key))} {MAINCOLOUR}to start it.`);
- } else {
- messagePlayerAlert(client, `This ${getVehicleName(vehicle)}'s engine is off. Use /engine to start it`);
- }
+ 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}`;
+ 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 {ALTCOLOUR}${ownerName} (${ownerType})`);
+ }
+
+ if(!getVehicleData(vehicle).engine) {
+ if(getVehicleData(vehicle).buyPrice == 0 && getVehicleData(vehicle).rentPrice == 0) {
+ if(doesPlayerHaveVehicleKeys(client, vehicle)) {
+ if(!doesPlayerHaveKeyBindsDisabled(client) && doesPlayerHaveKeyBindForCommand(client, "engine")) {
+ messagePlayerTip(client, `This ${getVehicleName(vehicle)}'s engine is off. Press {ALTCOLOUR}${toUpperCase(getKeyNameFromId(getPlayerKeyBindForCommand(client, "engine").key))} {MAINCOLOUR}to start it.`);
} else {
- messagePlayerAlert(client, `This ${getVehicleName(vehicle)}'s engine is off and you don't have the keys to start it`);
-
+ messagePlayerAlert(client, `This ${getVehicleName(vehicle)}'s engine is off. Use /engine to start it`);
}
- }
- resetVehiclePosition(vehicle);
- }
+ } else {
+ messagePlayerAlert(client, `This ${getVehicleName(vehicle)}'s engine is off and you don't have the keys to start it`);
- let currentSubAccount = getPlayerCurrentSubAccount(client);
-
- if(isPlayerWorking(client)) {
- if(getVehicleData(vehicle).ownerType == VRR_VEHOWNER_JOB) {
- if(getVehicleData(vehicle).ownerId == getPlayerCurrentSubAccount(client).job) {
- getPlayerCurrentSubAccount(client).lastJobVehicle = vehicle;
- messagePlayerInfo(client, `Use /startroute to start working in this vehicle`);
- }
}
}
+ resetVehiclePosition(vehicle);
+ }
- if(isPlayerWorking(client)) {
- if(isPlayerOnJobRoute(client)) {
- if(vehicle == getPlayerJobRouteVehicle(client)) {
- stopReturnToJobVehicleCountdown(client);
- }
+ let currentSubAccount = getPlayerCurrentSubAccount(client);
+
+ if(isPlayerWorking(client)) {
+ if(getVehicleData(vehicle).ownerType == VRR_VEHOWNER_JOB) {
+ if(getVehicleData(vehicle).ownerId == getPlayerCurrentSubAccount(client).job) {
+ getPlayerCurrentSubAccount(client).lastJobVehicle = vehicle;
+ messagePlayerInfo(client, `Use /startroute to start working in this vehicle`);
}
}
}
- if(getVehicleData(vehicle).streamingRadioStation != -1) {
- if(getPlayerData(client).streamingRadioStation != getVehicleData(vehicle).streamingRadioStation) {
- playRadioStreamForPlayer(client, radioStations[getVehicleData(vehicle).streamingRadioStation].url, true, getPlayerStreamingRadioVolume(client));
+ if(isPlayerWorking(client)) {
+ if(isPlayerOnJobRoute(client)) {
+ if(vehicle == getPlayerJobRouteVehicle(client)) {
+ stopReturnToJobVehicleCountdown(client);
+ }
}
}
- //}, client.ping+500);
+ }
+
+ if(getVehicleData(vehicle).streamingRadioStation != -1) {
+ if(getPlayerData(client).streamingRadioStation != getVehicleData(vehicle).streamingRadioStation) {
+ playRadioStreamForPlayer(client, radioStations[getVehicleData(vehicle).streamingRadioStation].url, true, getPlayerStreamingRadioVolume(client));
+ }
+ }
}
// ===========================================================================
@@ -492,120 +476,123 @@ function onPlayerSpawn(client) {
return false;
}
- //logToConsole(LOG_DEBUG, `[VRR.Event] Setting player skin for ${getPlayerDisplayForConsole(client)} to ${getPlayerCurrentSubAccount(client).skin}`);
- //setPlayerSkin(client, getPlayerCurrentSubAccount(client).skin);
-
- //if(getPlayerData(client).pedState != VRR_PEDSTATE_READY) {
+ if(isCustomCameraSupported()) {
restorePlayerCamera(client);
+ }
- logToConsole(LOG_DEBUG, `[VRR.Event] Storing ${getPlayerDisplayForConsole(client)} ped in client data `);
+ logToConsole(LOG_DEBUG, `[VRR.Event] Storing ${getPlayerDisplayForConsole(client)} ped in client data `);
+ if(areServerElementsSupported()) {
getPlayerData(client).ped = client.player;
+ }
- logToConsole(LOG_DEBUG, `[VRR.Event] Sending ${getPlayerDisplayForConsole(client)} the 'now playing as' message`);
- messagePlayerAlert(client, `You are now playing as: {businessBlue}${getCharacterFullName(client)}`, getColourByName("white"));
- messagePlayerNormal(client, "This server is in early development and may restart at any time for updates.", getColourByName("orange"));
- messagePlayerNormal(client, "Please report any bugs using /bug and suggestions using /idea", getColourByName("yellow"));
+ logToConsole(LOG_DEBUG, `[VRR.Event] Sending ${getPlayerDisplayForConsole(client)} the 'now playing as' message`);
+ messagePlayerAlert(client, `You are now playing as: {businessBlue}${getCharacterFullName(client)}`, getColourByName("white"));
+ messagePlayerNormal(client, "This server is in early development and may restart at any time for updates.", getColourByName("orange"));
+ messagePlayerNormal(client, "Please report any bugs using /bug and suggestions using /idea", getColourByName("yellow"));
- logToConsole(LOG_DEBUG, `[VRR.Event] Updating spawned state for ${getPlayerDisplayForConsole(client)} to true`);
- updatePlayerSpawnedState(client, true);
+ logToConsole(LOG_DEBUG, `[VRR.Event] Updating spawned state for ${getPlayerDisplayForConsole(client)} to true`);
+ updatePlayerSpawnedState(client, true);
- logToConsole(LOG_DEBUG, `[VRR.Event] Setting player interior for ${getPlayerDisplayForConsole(client)} to ${getPlayerCurrentSubAccount(client).interior}`);
- setPlayerInterior(client, getPlayerCurrentSubAccount(client).interior);
+ logToConsole(LOG_DEBUG, `[VRR.Event] Setting player interior for ${getPlayerDisplayForConsole(client)} to ${getPlayerCurrentSubAccount(client).interior}`);
+ setPlayerInterior(client, getPlayerCurrentSubAccount(client).interior);
- logToConsole(LOG_DEBUG, `[VRR.Event] Setting player dimension for ${getPlayerDisplayForConsole(client)} to ${getPlayerCurrentSubAccount(client).dimension}`);
- setPlayerDimension(client, getPlayerCurrentSubAccount(client).dimension);
+ logToConsole(LOG_DEBUG, `[VRR.Event] Setting player dimension for ${getPlayerDisplayForConsole(client)} to ${getPlayerCurrentSubAccount(client).dimension}`);
+ setPlayerDimension(client, getPlayerCurrentSubAccount(client).dimension);
- //if(getPlayerCurrentSubAccount(client).interior != 0 || getPlayerCurrentSubAccount(client).dimension != 0) {
- // updateAllInteriorVehiclesForPlayer(client, getPlayerCurrentSubAccount(client).interior, getPlayerCurrentSubAccount(client).dimension);
- //}
+ //if(getPlayerCurrentSubAccount(client).interior != 0 || getPlayerCurrentSubAccount(client).dimension != 0) {
+ // updateAllInteriorVehiclesForPlayer(client, getPlayerCurrentSubAccount(client).interior, getPlayerCurrentSubAccount(client).dimension);
+ //}
- logToConsole(LOG_DEBUG, `[VRR.Event] Setting player health for ${getPlayerDisplayForConsole(client)} to ${getPlayerCurrentSubAccount(client).health}`);
- setPlayerHealth(client, getPlayerCurrentSubAccount(client).health);
+ logToConsole(LOG_DEBUG, `[VRR.Event] Setting player health for ${getPlayerDisplayForConsole(client)} to ${getPlayerCurrentSubAccount(client).health}`);
+ setPlayerHealth(client, getPlayerCurrentSubAccount(client).health);
- logToConsole(LOG_DEBUG, `[VRR.Event] Setting player armour for ${getPlayerDisplayForConsole(client)} to ${getPlayerCurrentSubAccount(client).armour}`);
- setPlayerArmour(client, getPlayerCurrentSubAccount(client).armour);
+ logToConsole(LOG_DEBUG, `[VRR.Event] Setting player armour for ${getPlayerDisplayForConsole(client)} to ${getPlayerCurrentSubAccount(client).armour}`);
+ setPlayerArmour(client, getPlayerCurrentSubAccount(client).armour);
- logToConsole(LOG_DEBUG, `[VRR.Event] Sending ${getPlayerDisplayForConsole(client)}'s job type to their client (${getJobIndexFromDatabaseId(getPlayerCurrentSubAccount(client))})`);
- sendPlayerJobType(client, getPlayerCurrentSubAccount(client).job);
+ logToConsole(LOG_DEBUG, `[VRR.Event] Sending ${getPlayerDisplayForConsole(client)}'s job type to their client (${getJobIndexFromDatabaseId(getPlayerCurrentSubAccount(client))})`);
+ sendPlayerJobType(client, getPlayerCurrentSubAccount(client).job);
- logToConsole(LOG_DEBUG, `[VRR.Event] Enabling all rendering states for ${getPlayerDisplayForConsole(client)}`);
- setPlayer2DRendering(client, true, true, true, true, true, true);
+ logToConsole(LOG_DEBUG, `[VRR.Event] Enabling all rendering states for ${getPlayerDisplayForConsole(client)}`);
+ setPlayer2DRendering(client, true, true, true, true, true, true);
- logToConsole(LOG_DEBUG, `[VRR.Event] Sending snow states to ${getPlayerDisplayForConsole(client)}`);
+ logToConsole(LOG_DEBUG, `[VRR.Event] Sending snow states to ${getPlayerDisplayForConsole(client)}`);
+ if(isSnowSupported()) {
updatePlayerSnowState(client);
+ }
- if(getServerGame() == VRR_GAME_GTA_SA) {
- logToConsole(LOG_DEBUG, `[VRR.Event] Setting player walk and fightstyle for ${getPlayerDisplayForConsole(client)}`);
- setEntityData(client.player, "vrr.walkStyle", getPlayerCurrentSubAccount(client).walkStyle, true);
+ if(areServerElementsSupported() && getServerGame() == VRR_GAME_GTA_SA) {
+ logToConsole(LOG_DEBUG, `[VRR.Event] Setting player walk and fightstyle for ${getPlayerDisplayForConsole(client)}`);
+ setEntityData(client.player, "vrr.walkStyle", getPlayerCurrentSubAccount(client).walkStyle, true);
- setPlayerFightStyle(client, getPlayerCurrentSubAccount(client).fightStyle);
- }
+ setPlayerFightStyle(client, getPlayerCurrentSubAccount(client).fightStyle);
+ }
- logToConsole(LOG_DEBUG, `[VRR.Event] Updating logo state for ${getPlayerDisplayForConsole(client)}`);
- if(getServerConfig().showLogo && doesPlayerHaveLogoEnabled(client)) {
- updatePlayerShowLogoState(client, true);
- }
+ logToConsole(LOG_DEBUG, `[VRR.Event] Updating logo state for ${getPlayerDisplayForConsole(client)}`);
+ if(getServerConfig().showLogo && doesPlayerHaveLogoEnabled(client)) {
+ updatePlayerShowLogoState(client, true);
+ }
- logToConsole(LOG_DEBUG, `[VRR.Event] Caching ${getPlayerDisplayForConsole(client)}'s hotbar items`);
- cachePlayerHotBarItems(client);
+ logToConsole(LOG_DEBUG, `[VRR.Event] Caching ${getPlayerDisplayForConsole(client)}'s hotbar items`);
+ cachePlayerHotBarItems(client);
- logToConsole(LOG_DEBUG, `[VRR.Event] Syncing ${getPlayerDisplayForConsole(client)}'s hotbar`);
- updatePlayerHotBar(client);
+ logToConsole(LOG_DEBUG, `[VRR.Event] Syncing ${getPlayerDisplayForConsole(client)}'s hotbar`);
+ updatePlayerHotBar(client);
- logToConsole(LOG_DEBUG, `[VRR.Event] Setting ${getPlayerDisplayForConsole(client)}'s switchchar state to false`);
- getPlayerData(client).switchingCharacter = false;
+ logToConsole(LOG_DEBUG, `[VRR.Event] Setting ${getPlayerDisplayForConsole(client)}'s switchchar state to false`);
+ getPlayerData(client).switchingCharacter = false;
- if(!doesPlayerHaveKeyBindsDisabled(client) && doesPlayerHaveKeyBindForCommand(client, "enter")) {
- let keyId = getPlayerKeyBindForCommand(client, "enter");
- logToConsole(LOG_DEBUG, `[VRR.Event] Sending custom enter property key ID (${keyId.key}, ${toUpperCase(getKeyNameFromId(keyId.key))}) to ${getPlayerDisplayForConsole(client)}`);
- sendPlayerEnterPropertyKey(client, keyId.key);
- }
+ if(!doesPlayerHaveKeyBindsDisabled(client) && doesPlayerHaveKeyBindForCommand(client, "enter")) {
+ let keyId = getPlayerKeyBindForCommand(client, "enter");
+ logToConsole(LOG_DEBUG, `[VRR.Event] Sending custom enter property key ID (${keyId.key}, ${toUpperCase(getKeyNameFromId(keyId.key))}) to ${getPlayerDisplayForConsole(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);
- //}
+ //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);
+ //}
- if(isGTAIV()) {
- sendPlayerPedPartsAndProps(client);
- }
+ if(isGTAIV()) {
+ //sendPlayerPedPartsAndProps(client);
+ }
- logToConsole(LOG_DEBUG, `[VRR.Event] Setting ${getPlayerDisplayForConsole(client)}'s ped state to ready`);
- getPlayerData(client).pedState = VRR_PEDSTATE_READY;
+ logToConsole(LOG_DEBUG, `[VRR.Event] Setting ${getPlayerDisplayForConsole(client)}'s ped state to ready`);
+ getPlayerData(client).pedState = VRR_PEDSTATE_READY;
+ if(areServerElementsSupported()) {
syncPlayerProperties(client);
//setTimeout(function() {
// syncPlayerProperties(client);
//}, 1000);
+ }
- logToConsole(LOG_DEBUG, `[VRR.Event] Syncing ${getPlayerDisplayForConsole(client)}'s cash ${getPlayerCurrentSubAccount(client).cash}`);
- updatePlayerCash(client);
+ logToConsole(LOG_DEBUG, `[VRR.Event] Syncing ${getPlayerDisplayForConsole(client)}'s cash ${getPlayerCurrentSubAccount(client).cash}`);
+ updatePlayerCash(client);
- logToConsole(LOG_DEBUG, `[VRR.Event] Updating all player name tags`);
- updateAllPlayerNameTags();
+ logToConsole(LOG_DEBUG, `[VRR.Event] Updating all player name tags`);
+ updateAllPlayerNameTags();
- if(!areServerElementsSupported()) {
- sendAllBusinessEntrancesToPlayer(client);
- sendAllHouseEntrancesToPlayer(client);
- //sendAllJobLocationsToPlayer(client);
- }
+ if(!areServerElementsSupported()) {
+ sendAllBusinessesToPlayer(client);
+ sendAllHousesToPlayer(client);
+ //sendAllJobLocationsToPlayer(client);
requestPlayerPedNetworkId(client);
+ }
- getPlayerData(client).payDayTickStart = sdl.ticks;
- //}
+ getPlayerData(client).payDayTickStart = sdl.ticks;
}
// ===========================================================================
From f19e09cd41c6628803419d8e44fcb30e6e1cebb8 Mon Sep 17 00:00:00 2001
From: Vortrex <3858226+VortrexFTW@users.noreply.github.com>
Date: Wed, 9 Mar 2022 02:50:38 -0600
Subject: [PATCH 26/46] Check if has server elements when spawning veh
---
scripts/server/native/connected.js | 6 ++++--
1 file changed, 4 insertions(+), 2 deletions(-)
diff --git a/scripts/server/native/connected.js b/scripts/server/native/connected.js
index 1b0f354e..6c6a7393 100644
--- a/scripts/server/native/connected.js
+++ b/scripts/server/native/connected.js
@@ -526,8 +526,10 @@ function setVehicleColours(vehicle, colour1, colour2, colour3 = -1, colour4 = -1
// ===========================================================================
-function createGameVehicle(modelIndex, position, heading) {
- return game.createVehicle(getGameConfig().vehicles[getGame()][modelIndex][0], position, heading);
+function createGameVehicle(modelIndex, position, heading, toClient = null) {
+ if(areServerElementsSupported()) {
+ return game.createVehicle(getGameConfig().vehicles[getGame()][modelIndex][0], position, heading);
+ }
}
// ===========================================================================
From a78ec09d1351d18c55bb678861c6362fc0d85caa Mon Sep 17 00:00:00 2001
From: Vortrex <3858226+VortrexFTW@users.noreply.github.com>
Date: Wed, 9 Mar 2022 02:50:58 -0600
Subject: [PATCH 27/46] Add IV veh ID to get veh data util
---
scripts/server/vehicle.js | 18 ++++++++++++------
1 file changed, 12 insertions(+), 6 deletions(-)
diff --git a/scripts/server/vehicle.js b/scripts/server/vehicle.js
index a222665c..097f9ad6 100644
--- a/scripts/server/vehicle.js
+++ b/scripts/server/vehicle.js
@@ -174,13 +174,15 @@ function spawnAllVehicles() {
* @return {VehicleData} The vehicles's data (class instance)
*/
function getVehicleData(vehicle) {
- if(isVehicleObject(vehicle)) {
- let dataIndex = getEntityData(vehicle, "vrr.dataSlot");
- if(typeof getServerData().vehicles[dataIndex] != "undefined") {
- return getServerData().vehicles[dataIndex];
+ if(getGame() != VRR_GAME_GTA_IV) {
+ if(isVehicleObject(vehicle)) {
+ let dataIndex = getEntityData(vehicle, "vrr.dataSlot");
+ if(typeof getServerData().vehicles[dataIndex] != "undefined") {
+ return getServerData().vehicles[dataIndex];
+ }
}
} else {
-
+ return getServerVehicles().find((v) => v.ivNetworkId == vehicle);
}
return false;
@@ -1403,7 +1405,11 @@ function createPermanentVehicle(modelIndex, position, heading, interior = 0, dim
}
let slot = getServerData().vehicles.push(tempVehicleData);
- setEntityData(vehicle, "vrr.dataSlot", slot-1, false);
+
+ if(areServerElementsSupported()) {
+ setEntityData(vehicle, "vrr.dataSlot", slot-1, false);
+ }
+
return vehicle;
}
From a9045cab6894cdbd4d80c64d110bd92201045851 Mon Sep 17 00:00:00 2001
From: Vortrex <3858226+VortrexFTW@users.noreply.github.com>
Date: Wed, 9 Mar 2022 02:51:27 -0600
Subject: [PATCH 28/46] Sync plr veh + change plr sync event names
---
scripts/server/client.js | 41 ++++++++++++++++++++--------------------
1 file changed, 20 insertions(+), 21 deletions(-)
diff --git a/scripts/server/client.js b/scripts/server/client.js
index 565fd7b7..36e477c8 100644
--- a/scripts/server/client.js
+++ b/scripts/server/client.js
@@ -68,9 +68,8 @@ function addAllNetworkHandlers() {
addNetworkEventHandler("vrr.weaponDamage", playerDamagedByPlayer);
// Misc
- addNetworkEventHandler("vrr.player.position", updatePositionInPlayerData);
- addNetworkEventHandler("vrr.player.heading", updateHeadingInPlayerData);
- addNetworkEventHandler("vrr.player.lookat", setPlayerHeadLookPosition);
+ addNetworkEventHandler("vrr.plr.pos", updatePositionInPlayerData);
+ addNetworkEventHandler("vrr.plr.rot", updateHeadingInPlayerData);
addNetworkEventHandler("vrr.skinSelected", playerFinishedSkinSelection);
addNetworkEventHandler("vrr.clientInfo", updateConnectionLogOnClientInfoReceive);
addNetworkEventHandler("vrr.vehBuyState", receiveVehiclePurchaseStateUpdateFromClient);
@@ -716,6 +715,18 @@ function updateHeadingInPlayerData(client, heading) {
// ===========================================================================
+function updatePositionInVehicleData(client, vehicle, position) {
+ getVehicleData(vehicle).syncPosition = position;
+}
+
+// ===========================================================================
+
+function updateHeadingInVehicleData(client, vehicle, heading) {
+ getVehicleData(vehicle).syncHeading = heading;
+}
+
+// ===========================================================================
+
function forcePlayerIntoSkinSelect(client) {
if(getGameConfig().skinChangePosition[getServerGame()].length > 0) {
getPlayerData(client).returnToPosition = getPlayerPosition(client);
@@ -1023,14 +1034,6 @@ function hideAllPlayerGUI(client) {
// ===========================================================================
-function setPlayerHeadLookPosition(client, position) {
- if(client.player != null) {
- setEntityData(client.player, "vrr.headLook", position, true);
- }
-}
-
-// ===========================================================================
-
function requestClientInfo(client) {
sendNetworkEventToPlayer("vrr.clientInfo", client);
}
@@ -1111,35 +1114,31 @@ function setPlayerInfiniteRun(client, state) {
// ==========================================================================
-function sendBusinessEntranceToPlayer(client, businessId, name, entrancePosition, blipModel, pickupModel, hasInterior, hasItems) {
+function sendBusinessToPlayer(client, businessId, name, entrancePosition, blipModel, pickupModel, hasInterior, hasItems) {
sendNetworkEventToPlayer("vrr.business", client, businessId, name, entrancePosition, blipModel, pickupModel, hasInterior, hasItems);
}
// ==========================================================================
-function sendHouseEntranceToPlayer(client, houseId, entrancePosition, blipModel, pickupModel, hasInterior) {
+function sendHouseToPlayer(client, houseId, entrancePosition, blipModel, pickupModel, hasInterior) {
sendNetworkEventToPlayer("vrr.house", client, houseId, entrancePosition, blipModel, pickupModel, hasInterior);
}
// ==========================================================================
-function sendAllBusinessEntrancesToPlayer(client) {
+function sendAllBusinessesToPlayer(client) {
let businesses = getServerData().businesses;
for(let i in businesses) {
- if(businesses[i].entranceBlipModel > 0) {
- sendBusinessEntranceToPlayer(client, businesses[i].index, businesses[i].name, businesses[i].entrancePosition, businesses[i].entranceBlipModel, businesses[i].entrancePickupModel, businesses[i].hasInterior, false);
- }
+ sendBusinessToPlayer(client, businesses[i].index, businesses[i].name, businesses[i].entrancePosition, businesses[i].entranceBlipModel, businesses[i].entrancePickupModel, businesses[i].hasInterior, false);
}
}
// ==========================================================================
-function sendAllHouseEntrancesToPlayer(client) {
+function sendAllHousesToPlayer(client) {
let houses = getServerData().houses;
for(let i in houses) {
- if(houses[i].entranceBlipModel > 0) {
- sendBusinessEntranceToPlayer(client, businesses[i].index, houses[i].entrancePosition, houses[i].entranceBlipModel, houses[i].entrancePickupModel, houses[i].hasInterior);
- }
+ sendHouseToPlayer(client, houses[i].index, houses[i].entrancePosition, houses[i].entranceBlipModel, houses[i].entrancePickupModel, houses[i].hasInterior);
}
}
From b263c5a3e0fcfb8d400cba806364d31a1d9599cf Mon Sep 17 00:00:00 2001
From: Vortrex <3858226+VortrexFTW@users.noreply.github.com>
Date: Wed, 9 Mar 2022 02:51:37 -0600
Subject: [PATCH 29/46] Add vehdata class members for IV
---
scripts/server/class.js | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/scripts/server/class.js b/scripts/server/class.js
index a4d92a13..4971aa5c 100644
--- a/scripts/server/class.js
+++ b/scripts/server/class.js
@@ -864,6 +864,11 @@ class VehicleData {
this.index = -1;
this.needsSaved = false;
+ // GTA IV
+ this.ivNetworkId = -1;
+ this.syncPosition = toVector3(0.0, 0.0, 0.0);
+ this.syncHeading = 0.0;
+
// Ownership
this.ownerType = VRR_VEHOWNER_NONE;
this.ownerId = 0;
From 40281d658a302e70900ded79c1a0ed6d64d60bce Mon Sep 17 00:00:00 2001
From: Vortrex <3858226+VortrexFTW@users.noreply.github.com>
Date: Wed, 9 Mar 2022 02:51:53 -0600
Subject: [PATCH 30/46] Rename send biz/house utils
---
scripts/server/business.js | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/scripts/server/business.js b/scripts/server/business.js
index 9335ea09..b6bb7d66 100644
--- a/scripts/server/business.js
+++ b/scripts/server/business.js
@@ -1358,7 +1358,7 @@ function createBusinessEntrancePickup(businessId) {
updateBusinessPickupLabelData(businessId);
addToWorld(getBusinessData(businessId).entrancePickup);
} else {
- sendBusinessEntranceToPlayer(null, businessId, getBusinessData(businessId), getBusinessData(businessId).entrancePosition, getBusinessData(businessId).entranceBlipModel, getBusinessData(businessId).entrancePickupModel, getBusinessData(businessId).hasInterior, false);
+ sendBusinessToPlayer(null, businessId, getBusinessData(businessId), getBusinessData(businessId).entrancePosition, getBusinessData(businessId).entranceBlipModel, getBusinessData(businessId).entrancePickupModel, getBusinessData(businessId).hasInterior, false);
}
}
}
@@ -1389,7 +1389,7 @@ function createBusinessEntranceBlip(businessId) {
setElementDimension(getBusinessData(businessId).entranceBlip, getBusinessData(businessId).entranceDimension);
addToWorld(getBusinessData(businessId).entranceBlip);
} else {
- sendBusinessEntranceToPlayer(null, businessId, getBusinessData(businessId).name, getBusinessData(businessId).entrancePosition, blipModelId, getBusinessData(businessId).entrancePickupModel, getBusinessData(businessId).hasInterior, false);
+ sendBusinessToPlayer(null, businessId, getBusinessData(businessId).name, getBusinessData(businessId).entrancePosition, blipModelId, getBusinessData(businessId).entrancePickupModel, getBusinessData(businessId).hasInterior, false);
}
}
}
From dc127dfdd03670d462deb9dea81d6d983a987028 Mon Sep 17 00:00:00 2001
From: Vortrex <3858226+VortrexFTW@users.noreply.github.com>
Date: Wed, 9 Mar 2022 02:52:06 -0600
Subject: [PATCH 31/46] Add ped parts/props sync event (unfinished)
---
scripts/client/server.js | 14 ++------------
1 file changed, 2 insertions(+), 12 deletions(-)
diff --git a/scripts/client/server.js b/scripts/client/server.js
index 2bd4bf32..5410a2fb 100644
--- a/scripts/client/server.js
+++ b/scripts/client/server.js
@@ -107,6 +107,8 @@ function addAllNetworkHandlers() {
addNetworkEventHandler("vrr.holdObject", makePedHoldObject);
addNetworkEventHandler("vrr.playerPedId", sendLocalPlayerNetworkIdToServer);
+
+ addNetworkEventHandler("vrr.ped", setLocalPlayerPedPartsAndProps);
}
// ===========================================================================
@@ -259,18 +261,6 @@ function setElementCollisionsEnabled(elementId, state) {
// ===========================================================================
-function setLocalPlayerPedPartsAndProps(parts, props) {
- for(let i in parts) {
- localPlayer.changeBodyPart(parts[0], parts[1], parts[2]);
- }
-
- for(let i in props) {
- localPlayer.changeBodyProp(props[0], props[1]);
- }
-}
-
-// ===========================================================================
-
function setLocalPlayerArmour(armour) {
if(typeof localPlayer.armour != "undefined") {
localPlayer.armour = armour;
From eea8ef7397755a017fa321b7f130c79249455629 Mon Sep 17 00:00:00 2001
From: Vortrex <3858226+VortrexFTW@users.noreply.github.com>
Date: Wed, 9 Mar 2022 02:52:29 -0600
Subject: [PATCH 32/46] Rename sync net events + add svr element support checks
---
scripts/client/sync.js | 49 ++++++++++++++++++++++++++++++++++++++++--
1 file changed, 47 insertions(+), 2 deletions(-)
diff --git a/scripts/client/sync.js b/scripts/client/sync.js
index 2ffe01e3..b67e4da9 100644
--- a/scripts/client/sync.js
+++ b/scripts/client/sync.js
@@ -10,8 +10,13 @@
function processSync(event, deltaTime) {
if(localPlayer != null) {
if(!areServerElementsSupported()) {
- sendNetworkEventToServer("vrr.player.position", localPlayer.position);
- sendNetworkEventToServer("vrr.player.heading", localPlayer.heading);
+ sendNetworkEventToServer("vrr.plr.pos", localPlayer.position);
+ sendNetworkEventToServer("vrr.plr.rot", localPlayer.heading);
+
+ if(localPlayer.vehicle != null) {
+ sendNetworkEventToServer("vrr.veh.pos", getVehicleForNetworkEvent(localPlayer.vehicle), localPlayer.vehicle.position);
+ sendNetworkEventToServer("vrr.veh.rot", getVehicleForNetworkEvent(localPlayer.vehicle), localPlayer.vehicle.heading);
+ }
}
if(localPlayer.health <= 0) {
@@ -39,12 +44,20 @@ function setVehicleEngine(vehicleId, state) {
// ===========================================================================
function setVehicleLights(vehicleId, state) {
+
+
if(getGame() != VRR_GAME_MAFIA_ONE) {
if(!state) {
getElementFromId(vehicleId).lightStatus = 2;
} else {
getElementFromId(vehicleId).lightStatus = 1;
}
+ } else if(getGame() == VRR_GAME_GTA_IV) {
+ if(!state) {
+ natives.forceCarLights(natives.getVehicleFromNetworkId(vehicleId, 0));
+ } else {
+ natives.forceCarLights(natives.getVehicleFromNetworkId(vehicleId, 1));
+ }
} else {
if(!state) {
getElementFromId(vehicleId).lights = false;
@@ -63,6 +76,10 @@ function repairVehicle(syncId) {
// ===========================================================================
function syncVehicleProperties(vehicle) {
+ if(!areServerElementsSupported()) {
+ return false;
+ }
+
if(doesEntityDataExist(vehicle, "vrr.lights")) {
let lightStatus = getEntityData(vehicle, "vrr.lights");
if(!lightStatus) {
@@ -134,6 +151,10 @@ function syncVehicleProperties(vehicle) {
// ===========================================================================
function syncCivilianProperties(civilian) {
+ if(!areServerElementsSupported()) {
+ return false;
+ }
+
if(getGame() == VRR_GAME_GTA_III) {
if(doesEntityDataExist(civilian, "vrr.scale")) {
let scaleFactor = getEntityData(civilian, "vrr.scale");
@@ -226,6 +247,10 @@ function syncCivilianProperties(civilian) {
// ===========================================================================
function syncPlayerProperties(player) {
+ if(!areServerElementsSupported()) {
+ return false;
+ }
+
if(getGame() == VRR_GAME_GTA_III) {
if(doesEntityDataExist(player, "vrr.scale")) {
let scaleFactor = getEntityData(player, "vrr.scale");
@@ -335,6 +360,10 @@ function syncPlayerProperties(player) {
// ===========================================================================
function syncObjectProperties(object) {
+ if(!areServerElementsSupported()) {
+ return false;
+ }
+
if(getGame() == VRR_GAME_GTA_III || getGame() == VRR_GAME_GTA_VC) {
if(doesEntityDataExist(object, "vrr.scale")) {
let scaleFactor = getEntityData(object, "vrr.scale");
@@ -351,6 +380,10 @@ function syncObjectProperties(object) {
// ===========================================================================
function syncElementProperties(element) {
+ if(!areServerElementsSupported()) {
+ return false;
+ }
+
if(doesEntityDataExist(element, "vrr.interior")) {
if(typeof element.interior != "undefined") {
element.interior = getEntityData(element, "vrr.interior");
@@ -389,4 +422,16 @@ function receiveHouseFromServer(houseId, entrancePosition, blipModel, pickupMode
}
}
+// ===========================================================================
+
+function setLocalPlayerPedPartsAndProps(parts, props) {
+ for(let i in parts) {
+ localPlayer.changeBodyPart(parts[i][0], parts[i][1], parts[i][2]);
+ }
+
+ for(let j in props) {
+ localPlayer.changeBodyProp(props[j][0], props[j][1]);
+ }
+}
+
// ===========================================================================
\ No newline at end of file
From 11976b4e655512b46d083cf2187aea722d3162cb Mon Sep 17 00:00:00 2001
From: Vortrex <3858226+VortrexFTW@users.noreply.github.com>
Date: Wed, 9 Mar 2022 02:52:40 -0600
Subject: [PATCH 33/46] Add net event veh util
---
scripts/client/utilities.js | 8 +++++---
1 file changed, 5 insertions(+), 3 deletions(-)
diff --git a/scripts/client/utilities.js b/scripts/client/utilities.js
index 64570a19..7bb7a926 100644
--- a/scripts/client/utilities.js
+++ b/scripts/client/utilities.js
@@ -683,9 +683,11 @@ function processLocalPlayerVehicleEntryExitHandling() {
// ===========================================================================
-function getVehicleForNetworkEvent(vehicleArg) {
- // Soon this will also be used to get the IV vehicle via it's ID
- return vehicleArg;
+function getVehicleForNetworkEvent(vehicle) {
+ if(getGame() == VRR_GAME_GTA_IV) {
+ return natives.getNetworkIdFromVehicle(vehicle);
+ }
+ return vehicle;
}
// ===========================================================================
From 1a3d875f78ed0e60959a0b0004b0019937c2057a Mon Sep 17 00:00:00 2001
From: Vortrex <3858226+VortrexFTW@users.noreply.github.com>
Date: Wed, 9 Mar 2022 05:16:43 -0600
Subject: [PATCH 34/46] Fix updating business blips for IV
---
scripts/client/business.js | 67 +++++++++++++++++++++++++-------------
1 file changed, 45 insertions(+), 22 deletions(-)
diff --git a/scripts/client/business.js b/scripts/client/business.js
index 3eb7aee8..48b74bb9 100644
--- a/scripts/client/business.js
+++ b/scripts/client/business.js
@@ -25,44 +25,60 @@ class BusinessData {
function receiveBusinessFromServer(businessId, name, entrancePosition, blipModel, pickupModel, hasInterior, hasItems) {
logToConsole(LOG_DEBUG, `[VRR.Business] Received business ${businessId} (${name}) from server`);
+
if(getGame() == VRR_GAME_GTA_IV) {
if(getBusinessData(businessId) != false) {
+ let businessData = getBusinessData(businessId);
+ businessData.name = name;
+ businessData.entrancePosition = entrancePosition;
+ businessData.blipModel = blipModel;
+ businessData.pickupModel = pickupModel;
+ businessData.hasInterior = hasInterior;
+ businessData.hasItems = hasItems;
+
logToConsole(LOG_DEBUG, `[VRR.Business] Business ${businessId} already exists. Checking blip ...`);
if(blipModel == -1) {
- logToConsole(LOG_DEBUG, `[VRR.Business] Business ${businessId}'s blip has been removed by the server`);
- natives.removeBlipAndClearIndex(getBusinessData(businessId).blipId);
- getBusinessData(businessId).blipId = -1;
- //businesses.splice(getBusinessData(businessId).index, 1);
- //setAllBusinessDataIndexes();
- } else {
- logToConsole(LOG_DEBUG, `[VRR.Business] Business ${businessId}'s blip has been changed by the server`);
- if(getBusinessData(businessId).blipId != -1) {
- logToConsole(LOG_DEBUG, `[VRR.Business] Business ${businessId}'s blip has been modified by the server`);
- natives.setBlipCoordinates(getBusinessData(businessId).blipId, getBusinessData(businessId).entrancePosition);
- natives.changeBlipSprite(getBusinessData(businessId).blipId, getBusinessData(businessId).blipModel);
- natives.changeBlipNameFromAscii(getBusinessData(businessId).blipId, `${name.substr(0, 24)}${(name.length > 24) ? " ...": ""}`);
+ if(businessData.blipId != -1) {
+ logToConsole(LOG_DEBUG, `[VRR.Business] Business ${businessId}'s blip has been removed by the server`);
+ natives.removeBlipAndClearIndex(getBusinessData(businessId).blipId);
+ businessData.blipId = -1;
+ //businesses.splice(businessData.index, 1);
+ //setAllBusinessDataIndexes();
+ } else {
+ logToConsole(LOG_DEBUG, `[VRR.Business] Business ${businessId}'s blip is unchanged`);
+ }
+ } else {
+ if(businessData.blipId != -1) {
+ logToConsole(LOG_DEBUG, `[VRR.Business] Business ${businessId}'s blip has been changed by the server`);
+ natives.setBlipCoordinates(businessData.blipId, businessData.entrancePosition);
+ natives.changeBlipSprite(businessData.blipId, businessData.blipModel);
+ natives.setBlipMarkerLongDistance(businessData.blipId, true);
+ natives.changeBlipNameFromAscii(businessData.blipId, `${businessData.name.substr(0, 24)}${(businessData.name.length > 24) ? " ...": ""}`);
} else {
- logToConsole(LOG_DEBUG, `[VRR.Business] Business ${businessId}'s blip has been added by the server`);
let blipId = natives.addBlipForCoord(entrancePosition);
if(blipId) {
- getBusinessData(businessId).blipId = blipId;
- natives.changeBlipSprite(blipId, blipModel);
- natives.setBlipMarkerLongDistance(blipId, false);
+ businessData.blipId = blipId;
+ natives.changeBlipSprite(businessData.blipId, businessData.blipModel);
+ natives.setBlipMarkerLongDistance(businessData.blipId, true);
+ natives.changeBlipNameFromAscii(businessData.blipId, `${businessData.name.substr(0, 24)}${(businessData.name.length > 24) ? " ...": ""}`);
}
+ logToConsole(LOG_DEBUG, `[VRR.Business] Business ${businessId}'s blip has been added by the server (Model ${blipModel}, ID ${blipId})`);
}
}
} else {
logToConsole(LOG_DEBUG, `[VRR.Business] Business ${businessId} doesn't exist. Adding ...`);
let tempBusinessData = new BusinessData(businessId, name, entrancePosition, blipModel, pickupModel, hasInterior, hasItems);
if(blipModel != -1) {
- logToConsole(LOG_DEBUG, `[VRR.Business] Business ${businessId}'s blip has been added by the server`);
let blipId = natives.addBlipForCoord(entrancePosition);
if(blipId) {
tempBusinessData.blipId = blipId;
- natives.changeBlipSprite(blipId, blipModel);
- natives.setBlipMarkerLongDistance(blipId, false);
- natives.changeBlipNameFromAscii(blipId, `${name.substr(0, 24)}${(name.length > 24) ? " ...": ""}`);
+ natives.changeBlipSprite(tempBusinessData.blipId, blipModel);
+ natives.setBlipMarkerLongDistance(tempBusinessData.blipId, true);
+ natives.changeBlipNameFromAscii(tempBusinessData.blipId, `${name.substr(0, 24)}${(name.length > 24) ? " ...": ""}`);
}
+ logToConsole(LOG_DEBUG, `[VRR.Business] Business ${businessId}'s blip has been added by the server (Model ${blipModel}, ID ${blipId})`);
+ } else {
+ logToConsole(LOG_DEBUG, `[VRR.Business] Business ${businessId} has no blip.`);
}
businesses.push(tempBusinessData);
setAllBusinessDataIndexes();
@@ -77,8 +93,15 @@ function receiveBusinessFromServer(businessId, name, entrancePosition, blipModel
* @return {BusinessData} The business's data (class instance)
*/
function getBusinessData(businessId) {
- let tempBusinessData = businesses.find((b) => b.businessId == businessId);
- return (typeof tempBusinessData != "undefined") ? tempBusinessData : false;
+ //let tempBusinessData = businesses.find((b) => b.businessId == businessId);
+ //return (typeof tempBusinessData != "undefined") ? tempBusinessData[0] : false;
+ for(let i in businesses) {
+ if(businesses[i].businessId == businessId) {
+ return businesses[i];
+ }
+ }
+
+ return false;
}
// ===========================================================================
From d33356b4c2b587ad23eae48f7d1642b97997a20b Mon Sep 17 00:00:00 2001
From: Vortrex <3858226+VortrexFTW@users.noreply.github.com>
Date: Wed, 9 Mar 2022 05:17:02 -0600
Subject: [PATCH 35/46] Add business arrow markers
---
scripts/client/label.js | 26 +++++++++++++-------------
1 file changed, 13 insertions(+), 13 deletions(-)
diff --git a/scripts/client/label.js b/scripts/client/label.js
index d794b549..4f20d67a 100644
--- a/scripts/client/label.js
+++ b/scripts/client/label.js
@@ -247,19 +247,19 @@ function renderJobLabel(name, position, jobType) {
// -------------------------------------------------------------------------
function processLabelRendering() {
- if(renderLabels && areWorldLabelsSupported()) {
- if(localPlayer != null) {
- if(!areServerElementsSupported()) {
- //for(let i in businesses) {
- // if(getDistance(localPlayer.position, businesses[i].entrancePosition) <= 75.0) {
- // natives.drawColouredCylinder(businesses[i].entrancePosition, 0.0, 0.0, 0, 153, 255);
- // }
- //}
-
- // natives.getScreenViewportId
- // natives.getGameViewportId
- // natives.getViewportPositionOfCoord
- } else {
+ if(renderLabels) {
+ if(!areServerElementsSupported()) {
+ if(localPlayer != null) {
+ for(let i in businesses) {
+ if(getDistance(localPlayer.position, businesses[i].entrancePosition) <= 75.0) {
+ natives.drawColouredCylinder(getPosBelowPos(businesses[i].entrancePosition, 1.0), 0.0, 0.0, 0, 153, 255, 255);
+ }
+ }
+ }
+ }
+
+ if(areWorldLabelsSupported()) {
+ if(localPlayer != null) {
let pickups = getElementsByType(ELEMENT_PICKUP);
for(let i in pickups) {
if(pickups[i].getData("vrr.label.type") != null) {
From e371df54b968136bfffb7c40d3d00722492c7938 Mon Sep 17 00:00:00 2001
From: Vortrex <3858226+VortrexFTW@users.noreply.github.com>
Date: Wed, 9 Mar 2022 05:17:39 -0600
Subject: [PATCH 36/46] Remove client pedId member (use "ped")
---
scripts/server/class.js | 2 --
1 file changed, 2 deletions(-)
diff --git a/scripts/server/class.js b/scripts/server/class.js
index 4971aa5c..5ece105d 100644
--- a/scripts/server/class.js
+++ b/scripts/server/class.js
@@ -239,8 +239,6 @@ class ClientData {
this.locale = 0;
this.enteringVehicle = null;
-
- this.pedId = -1;
}
};
From 8ad5c4fff4b173f180085eec9245529a829e5b72 Mon Sep 17 00:00:00 2001
From: Vortrex <3858226+VortrexFTW@users.noreply.github.com>
Date: Wed, 9 Mar 2022 05:17:53 -0600
Subject: [PATCH 37/46] Use ped ID in stop anim func
---
scripts/server/client.js | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/scripts/server/client.js b/scripts/server/client.js
index 36e477c8..ba41871d 100644
--- a/scripts/server/client.js
+++ b/scripts/server/client.js
@@ -1014,8 +1014,8 @@ function makePedPlayAnimation(ped, animationSlot, positionOffset) {
// ===========================================================================
-function makePedStopAnimation(ped) {
- sendNetworkEventToPlayer("vrr.pedStopAnim", null, ped.id);
+function makePedStopAnimation(pedId) {
+ sendNetworkEventToPlayer("vrr.pedStopAnim", null, pedId);
}
// ===========================================================================
@@ -1145,13 +1145,13 @@ function sendAllHousesToPlayer(client) {
// ==========================================================================
function makePlayerHoldObjectModel(client, modelIndex) {
- sendNetworkEventToPlayer("vrr.holdObject", client, getPlayerData(client).pedId, modelIndex);
+ sendNetworkEventToPlayer("vrr.holdObject", client, getPlayerData(client).ped, modelIndex);
}
// ==========================================================================
function receivePlayerPedNetworkId(client, pedId) {
- getPlayerData(client).pedId = pedId;
+ getPlayerData(client).ped = pedId;
}
// ==========================================================================
From 1a1f5d4f5de8572d46c363c4c76394d3516247ab Mon Sep 17 00:00:00 2001
From: Vortrex <3858226+VortrexFTW@users.noreply.github.com>
Date: Wed, 9 Mar 2022 05:18:08 -0600
Subject: [PATCH 38/46] Only send businesses for IV (for now)
---
scripts/server/event.js | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/scripts/server/event.js b/scripts/server/event.js
index b075a17a..b7dea80a 100644
--- a/scripts/server/event.js
+++ b/scripts/server/event.js
@@ -586,8 +586,9 @@ function onPlayerSpawn(client) {
if(!areServerElementsSupported()) {
sendAllBusinessesToPlayer(client);
- sendAllHousesToPlayer(client);
+ //sendAllHousesToPlayer(client);
//sendAllJobLocationsToPlayer(client);
+ //sendAllVehiclesToPlayer(client);
requestPlayerPedNetworkId(client);
}
From 3b6a8cc83800cd4a34613c50ca6bbf8e2f3411fd Mon Sep 17 00:00:00 2001
From: Vortrex <3858226+VortrexFTW@users.noreply.github.com>
Date: Thu, 10 Mar 2022 09:18:01 -0600
Subject: [PATCH 39/46] Set business blips as short range
---
scripts/client/business.js | 9 ++++++---
1 file changed, 6 insertions(+), 3 deletions(-)
diff --git a/scripts/client/business.js b/scripts/client/business.js
index 48b74bb9..69a73600 100644
--- a/scripts/client/business.js
+++ b/scripts/client/business.js
@@ -52,14 +52,16 @@ function receiveBusinessFromServer(businessId, name, entrancePosition, blipModel
logToConsole(LOG_DEBUG, `[VRR.Business] Business ${businessId}'s blip has been changed by the server`);
natives.setBlipCoordinates(businessData.blipId, businessData.entrancePosition);
natives.changeBlipSprite(businessData.blipId, businessData.blipModel);
- natives.setBlipMarkerLongDistance(businessData.blipId, true);
+ natives.setBlipMarkerLongDistance(businessData.blipId, false);
+ natives.setBlipAsShortRange(tempBusinessData.blipId, true);
natives.changeBlipNameFromAscii(businessData.blipId, `${businessData.name.substr(0, 24)}${(businessData.name.length > 24) ? " ...": ""}`);
} else {
let blipId = natives.addBlipForCoord(entrancePosition);
if(blipId) {
businessData.blipId = blipId;
natives.changeBlipSprite(businessData.blipId, businessData.blipModel);
- natives.setBlipMarkerLongDistance(businessData.blipId, true);
+ natives.setBlipMarkerLongDistance(businessData.blipId, false);
+ natives.setBlipAsShortRange(tempBusinessData.blipId, true);
natives.changeBlipNameFromAscii(businessData.blipId, `${businessData.name.substr(0, 24)}${(businessData.name.length > 24) ? " ...": ""}`);
}
logToConsole(LOG_DEBUG, `[VRR.Business] Business ${businessId}'s blip has been added by the server (Model ${blipModel}, ID ${blipId})`);
@@ -73,7 +75,8 @@ function receiveBusinessFromServer(businessId, name, entrancePosition, blipModel
if(blipId) {
tempBusinessData.blipId = blipId;
natives.changeBlipSprite(tempBusinessData.blipId, blipModel);
- natives.setBlipMarkerLongDistance(tempBusinessData.blipId, true);
+ natives.setBlipMarkerLongDistance(tempBusinessData.blipId, false);
+ natives.setBlipAsShortRange(tempBusinessData.blipId, true);
natives.changeBlipNameFromAscii(tempBusinessData.blipId, `${name.substr(0, 24)}${(name.length > 24) ? " ...": ""}`);
}
logToConsole(LOG_DEBUG, `[VRR.Business] Business ${businessId}'s blip has been added by the server (Model ${blipModel}, ID ${blipId})`);
From 1a8b4a439733b81ae50a435f35ebf9b4b12ba89b Mon Sep 17 00:00:00 2001
From: Vortrex <3858226+VortrexFTW@users.noreply.github.com>
Date: Thu, 10 Mar 2022 09:18:17 -0600
Subject: [PATCH 40/46] Don't process vehicle fires (needs finished)
---
scripts/client/event.js | 1 +
1 file changed, 1 insertion(+)
diff --git a/scripts/client/event.js b/scripts/client/event.js
index c654229e..a281fa9d 100644
--- a/scripts/client/event.js
+++ b/scripts/client/event.js
@@ -95,6 +95,7 @@ function onProcess(event, deltaTime) {
processGameSpecifics();
processNearbyPickups();
processVehiclePurchasing();
+ //processVehicleFires();
}
// ===========================================================================
From ae9503cba1196147649e160efe06ef1025338a1d Mon Sep 17 00:00:00 2001
From: Vortrex <3858226+VortrexFTW@users.noreply.github.com>
Date: Thu, 10 Mar 2022 09:18:32 -0600
Subject: [PATCH 41/46] Don't sync vehicle pos to server for IV (needs
finished)
---
scripts/client/sync.js | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/scripts/client/sync.js b/scripts/client/sync.js
index b67e4da9..3a2a3704 100644
--- a/scripts/client/sync.js
+++ b/scripts/client/sync.js
@@ -13,10 +13,10 @@ function processSync(event, deltaTime) {
sendNetworkEventToServer("vrr.plr.pos", localPlayer.position);
sendNetworkEventToServer("vrr.plr.rot", localPlayer.heading);
- if(localPlayer.vehicle != null) {
- sendNetworkEventToServer("vrr.veh.pos", getVehicleForNetworkEvent(localPlayer.vehicle), localPlayer.vehicle.position);
- sendNetworkEventToServer("vrr.veh.rot", getVehicleForNetworkEvent(localPlayer.vehicle), localPlayer.vehicle.heading);
- }
+ //if(localPlayer.vehicle != null) {
+ // sendNetworkEventToServer("vrr.veh.pos", getVehicleForNetworkEvent(localPlayer.vehicle), localPlayer.vehicle.position);
+ // sendNetworkEventToServer("vrr.veh.rot", getVehicleForNetworkEvent(localPlayer.vehicle), localPlayer.vehicle.heading);
+ //}
}
if(localPlayer.health <= 0) {
From b06d573ad53d59511dc891da13c111b391a0e032 Mon Sep 17 00:00:00 2001
From: Vortrex <3858226+VortrexFTW@users.noreply.github.com>
Date: Thu, 10 Mar 2022 09:18:48 -0600
Subject: [PATCH 42/46] Don't use discord chat msg (needs finished)
---
scripts/server/chat.js | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/scripts/server/chat.js b/scripts/server/chat.js
index fbb63857..29678550 100644
--- a/scripts/server/chat.js
+++ b/scripts/server/chat.js
@@ -13,6 +13,8 @@ function initChatScript() {
return true;
}
+// ===========================================================================
+
function processPlayerChat(client, messageText) {
if(!getPlayerData(client)) {
messagePlayerError(client, "You need to login before you can chat!");
@@ -47,7 +49,7 @@ function processPlayerChat(client, messageText) {
}
*/
messagePlayerNormal(null, `๐ฌ ${getCharacterFullName(client)}: ${messageText}`);
- messageDiscordChatChannel(`๐ฌ ${getCharacterFullName(client)}: ${messageText}`);
+ //messageDiscordChatChannel(`๐ฌ ${getCharacterFullName(client)}: ${messageText}`);
}
// ===========================================================================
From 2dc6d65a50a609a2d39167aa352b6f441381acff Mon Sep 17 00:00:00 2001
From: Vortrex <3858226+VortrexFTW@users.noreply.github.com>
Date: Thu, 10 Mar 2022 09:19:01 -0600
Subject: [PATCH 43/46] Use server cvars for some config stuff
---
scripts/server/config.js | 36 +++++++++++++++++-------------------
1 file changed, 17 insertions(+), 19 deletions(-)
diff --git a/scripts/server/config.js b/scripts/server/config.js
index 829c0be9..7e286638 100644
--- a/scripts/server/config.js
+++ b/scripts/server/config.js
@@ -80,29 +80,27 @@ function initConfigScript() {
logToConsole(LOG_DEBUG, "[VRR.Config]: Loading global config ...");
loadGlobalConfig();
- logToConsole(LOG_DEBUG, "[VRR.Config]: Loading server config ...");
+ logToConsole(LOG_INFO, "[VRR.Config]: Loading server config ...");
serverConfig = loadServerConfigFromGameAndPort(server.game, server.port, getMultiplayerMod());
- logToConsole(LOG_DEBUG, "[VRR.Config]: Applying server config ...");
-
- getServerConfig().fallingSnow = hasBitFlag(getServerConfig().settings, getServerSettingsFlagValue("FallingSnow"));
- getServerConfig().groundSnow = hasBitFlag(getServerConfig().settings, getServerSettingsFlagValue("GroundSnow"));
- getServerConfig().useGUI = hasBitFlag(getServerConfig().settings, getServerSettingsFlagValue("GUI"));
- getServerConfig().showLogo = hasBitFlag(getServerConfig().settings, getServerSettingsFlagValue("Logo"));
- getServerConfig().testerOnly = hasBitFlag(getServerConfig().settings, getServerSettingsFlagValue("Testing"));
- getServerConfig().discordEnabled = hasBitFlag(getServerConfig().settings, getServerSettingsFlagValue("DiscordBot"));
- getServerConfig().createJobPickups = hasBitFlag(getServerConfig().settings, getServerSettingsFlagValue("JobPickups"));
- getServerConfig().createBusinessPickups = hasBitFlag(getServerConfig().settings, getServerSettingsFlagValue("BusinessPickups"));
- getServerConfig().createHousePickups = hasBitFlag(getServerConfig().settings, getServerSettingsFlagValue("HousePickups"));
- getServerConfig().createJobBlips = hasBitFlag(getServerConfig().settings, getServerSettingsFlagValue("JobBlips"));
- getServerConfig().createBusinessBlips = hasBitFlag(getServerConfig().settings, getServerSettingsFlagValue("BusinessBlips"));
- getServerConfig().createHouseBlips = hasBitFlag(getServerConfig().settings, getServerSettingsFlagValue("HouseBlips"));
- getServerConfig().useRealTime = hasBitFlag(getServerConfig().settings, getServerSettingsFlagValue("RealTime"));
- getServerConfig().antiCheat.enabled = hasBitFlag(getServerConfig().settings, getServerSettingsFlagValue("Anticheat"));
+ logToConsole(LOG_INFO, "[VRR.Config]: Applying server config ...");
+ getServerConfig().fallingSnow = intToBool(toInteger(server.getCVar("fallingsnow")));
+ getServerConfig().groundSnow = intToBool(toInteger(server.getCVar("groundsnow")));
+ getServerConfig().useGUI = intToBool(toInteger(server.getCVar("gui")));
+ getServerConfig().showLogo = false;
+ getServerConfig().testerOnly = intToBool(toInteger(server.getCVar("testeronly")));
+ getServerConfig().discordEnabled = false;
+ getServerConfig().createJobPickups = intToBool(toInteger(server.getCVar("jobpickups")));
+ getServerConfig().createBusinessPickups = intToBool(toInteger(server.getCVar("businesspickups")));
+ getServerConfig().createHousePickups = intToBool(toInteger(server.getCVar("housepickups")));
+ getServerConfig().createJobBlips = intToBool(toInteger(server.getCVar("jobblips")));
+ getServerConfig().createBusinessBlips = intToBool(toInteger(server.getCVar("businessblips")));
+ getServerConfig().createHouseBlips = intToBool(toInteger(server.getCVar("houseblips")));
+ getServerConfig().useRealTime = intToBool(toInteger(server.getCVar("realtime")));
+ getServerConfig().antiCheat.enabled = intToBool(toInteger(server.getCVar("anticheat")));
applyConfigToServer(serverConfig);
-
- logToConsole(LOG_DEBUG, "[VRR.Config]: All config loaded and applied successfully!");
+ logToConsole(LOG_DEBUG, "[VRR.Config]: Server config applied successfully!");
logToConsole(LOG_INFO, "[VRR.Config]: Config script initialized!");
}
From f3c61a3bb660aaa79bdab581d966d76b6b920972 Mon Sep 17 00:00:00 2001
From: Vortrex <3858226+VortrexFTW@users.noreply.github.com>
Date: Thu, 10 Mar 2022 10:43:28 -0600
Subject: [PATCH 44/46] Woops missing bracket
---
scripts/client/event.js | 1 +
1 file changed, 1 insertion(+)
diff --git a/scripts/client/event.js b/scripts/client/event.js
index b07a21cc..a281fa9d 100644
--- a/scripts/client/event.js
+++ b/scripts/client/event.js
@@ -96,6 +96,7 @@ function onProcess(event, deltaTime) {
processNearbyPickups();
processVehiclePurchasing();
//processVehicleFires();
+}
// ===========================================================================
From 24e70233cb82371c6a81a413bae32fc44f78dc06 Mon Sep 17 00:00:00 2001
From: Vortrex <3858226+VortrexFTW@users.noreply.github.com>
Date: Thu, 10 Mar 2022 10:43:47 -0600
Subject: [PATCH 45/46] Fixed locale string syntax issue
---
scripts/server/business.js | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/scripts/server/business.js b/scripts/server/business.js
index b6bb7d66..3e9faaa2 100644
--- a/scripts/server/business.js
+++ b/scripts/server/business.js
@@ -1765,9 +1765,9 @@ function buyFromBusinessCommand(command, params, client) {
if(!doesPlayerHaveKeyBindsDisabled(client) && doesPlayerHaveKeyBindForCommand("inv")) {
let keyData = getPlayerKeyBindForCommand("inv");
- messagePlayerNewbieTip(client, getLocaleString(client, "ViewInventoryKeyPressTip"), `{ALTCOLOUR}${getKeyNameFromId(keyData.key)}{MAINCOLOUR}`);
+ messagePlayerNewbieTip(client, getLocaleString(client, "ViewInventoryKeyPressTip", `{ALTCOLOUR}${getKeyNameFromId(keyData.key)}{MAINCOLOUR}`));
} else {
- messagePlayerNewbieTip(client, getLocaleString(client, "ViewInventoryKeyPressTip"), `{ALTCOLOUR}/inv{MAINCOLOUR}`);
+ messagePlayerNewbieTip(client, getLocaleString(client, "ViewInventoryKeyPressTip", `{ALTCOLOUR}/inv{MAINCOLOUR}`));
}
}
From 78330aa4b1ad93b0ec138db7180d4511cee37a33 Mon Sep 17 00:00:00 2001
From: Vortrex <3858226+VortrexFTW@users.noreply.github.com>
Date: Fri, 11 Mar 2022 02:47:59 -0600
Subject: [PATCH 46/46] Use normal chat for now
---
scripts/client/chatbox.js | 1 +
scripts/client/event.js | 7 ++++++
scripts/server/chat.js | 43 +++++++++++++++++++++----------------
scripts/server/client.js | 5 ++---
scripts/server/messaging.js | 10 ++++++++-
5 files changed, 43 insertions(+), 23 deletions(-)
diff --git a/scripts/client/chatbox.js b/scripts/client/chatbox.js
index d74eb237..64e454f6 100644
--- a/scripts/client/chatbox.js
+++ b/scripts/client/chatbox.js
@@ -46,6 +46,7 @@ function unBindChatBoxKeys() {
// ===========================================================================
function receiveChatBoxMessageFromServer(messageString, colour) {
+ logToConsole(LOG_DEBUG, `[VRR.ChatBox]: Received chatbox message from server: ${messageString}`);
let colouredString = replaceColoursInMessage(messageString);
if(bottomMessageIndex >= chatBoxHistory.length-1) {
diff --git a/scripts/client/event.js b/scripts/client/event.js
index a281fa9d..2bc8a09d 100644
--- a/scripts/client/event.js
+++ b/scripts/client/event.js
@@ -224,4 +224,11 @@ function onLocalPlayerSwitchWeapon(oldWeapon, newWeapon) {
function onCameraProcess(event) {
}
+// ===========================================================================
+
+function onChatOutput(event, messageText, colour) {
+ //event.preventDefault();
+ //receiveChatBoxMessageFromServer(messageText, colour);
+}
+
// ===========================================================================
\ No newline at end of file
diff --git a/scripts/server/chat.js b/scripts/server/chat.js
index 29678550..554dbeaa 100644
--- a/scripts/server/chat.js
+++ b/scripts/server/chat.js
@@ -16,28 +16,33 @@ function initChatScript() {
// ===========================================================================
function processPlayerChat(client, messageText) {
- if(!getPlayerData(client)) {
- messagePlayerError(client, "You need to login before you can chat!");
- return false;
- }
+ if(!isConsole(client)) {
+ if(!getPlayerData(client)) {
+ messagePlayerError(client, "You need to login before you can chat!");
+ return false;
+ }
- if(!isPlayerLoggedIn(client)) {
- messagePlayerError(client, "You need to login before you can chat!");
- return false;
- }
+ if(!isPlayerLoggedIn(client)) {
+ messagePlayerError(client, "You need to login before you can chat!");
+ return false;
+ }
- if(!isPlayerSpawned(client)) {
- messagePlayerError(client, "You need to spawn before you can chat!");
- return false;
- }
+ if(!isPlayerSpawned(client)) {
+ messagePlayerError(client, "You need to spawn before you can chat!");
+ return false;
+ }
- if(isPlayerMuted(client)) {
- messagePlayerError(client, "You are muted and can't chat!");
- return false;
- }
-
- messageText = messageText.substring(0, 128);
+ if(isPlayerMuted(client)) {
+ messagePlayerError(client, "You are muted and can't chat!");
+ return false;
+ }
+ messageText = messageText.substring(0, 128);
+ messagePlayerNormal(null, `๐ฌ ${getCharacterFullName(client)}: ${messageText}`);
+ } else {
+ messagePlayerNormal(null, `๐ก๏ธ (ADMIN) - ${messageText}`);
+ }
+
/*
let clients = getClients();
for(let i in clients) {
@@ -48,7 +53,7 @@ function processPlayerChat(client, messageText) {
messagePlayerNormal(clients[i], `๐ฌ ${getCharacterFullName(client)}: [#FFFFFF]${translatedText}${original}`, clients[i], getColourByName("mediumGrey"));
}
*/
- messagePlayerNormal(null, `๐ฌ ${getCharacterFullName(client)}: ${messageText}`);
+
//messageDiscordChatChannel(`๐ฌ ${getCharacterFullName(client)}: ${messageText}`);
}
diff --git a/scripts/server/client.js b/scripts/server/client.js
index ba41871d..5bd79c7c 100644
--- a/scripts/server/client.js
+++ b/scripts/server/client.js
@@ -520,9 +520,8 @@ function sendPlayerRemoveFromVehicle(client) {
// ===========================================================================
-function sendChatBoxMessageToPlayer(client, message, colour) {
- sendNetworkEventToPlayer("vrr.m", client, message, colour)
- //messageClient(message, client, colour);
+function sendChatBoxMessageToPlayer(client, messageText, colour) {
+ messageClient(messageText, client, colour);
}
// ===========================================================================
diff --git a/scripts/server/messaging.js b/scripts/server/messaging.js
index c4d11285..e990d2be 100644
--- a/scripts/server/messaging.js
+++ b/scripts/server/messaging.js
@@ -37,7 +37,15 @@ function messagePlayerNormal(client, messageText, colour = COLOUR_WHITE) {
// logToConsole(LOG_INFO, `${removeColoursInMessage(messageText)}`);
//}
- sendChatBoxMessageToPlayer(client, messageText, colour);
+ messageText = replaceColoursInMessage(messageText);
+
+ if(client == null) {
+ message(messageText, colour);
+ } else {
+ messageClient(messageText, client, colour);
+ }
+
+ //sendChatBoxMessageToPlayer(client, messageText, colour);
return true;
}