Merge branch 'nightly' into 1.4.0-prep

This commit is contained in:
Vortrex
2022-03-05 09:55:41 -06:00
213 changed files with 11036 additions and 5867 deletions

View File

@@ -59,9 +59,9 @@ function setAccentCommand(command, params, client) {
// ===========================================================================
function listAccentsCommand(command, params, client) {
let stationList = getGlobalConfig().accents;
let accentList = getGlobalConfig().accents;
let chunkedList = splitArrayIntoChunks(stationList, 8);
let chunkedList = splitArrayIntoChunks(accentList, 8);
messagePlayerInfo(client, `{clanOrange}== {jobYellow}Accents {clanOrange}==================================`);
@@ -70,4 +70,69 @@ function listAccentsCommand(command, params, client) {
}
}
// ===========================================================================
function getAccentFromParams(params) {
if(isNaN(params)) {
for(let i in getGlobalConfig().accents) {
if(toLowerCase(getGlobalConfig().accents[i]).indexOf(toLowerCase(params)) != -1) {
return i;
}
}
} else {
if(typeof getGlobalConfig().accents[params] != "undefined") {
return toInteger(params);
}
}
return false;
}
// ===========================================================================
function reloadAccentConfigurationCommand(command, params, client) {
getGlobalConfig().accents = loadAccentConfig();
messageAdmins(`${client.name} {MAINCOLOUR}has reloaded the accent list`);
}
// ===========================================================================
function addAccentCommand(command, params, client) {
if(areParamsEmpty(params)) {
messagePlayerSyntax(client, getCommandSyntaxText(command));
return false;
}
let newAccentName = params;
if(getAccentFromParams(newAccentName) != false) {
messagePlayerError(client, `That accent already exists!`)
return false;
}
getGlobalConfig().accents.push(newAccentName);
saveAccentConfig();
messageAdmins(`${client.name} {MAINCOLOUR}added a new accent: ${newAccentName}`);
}
// ===========================================================================
function removeAccentCommand(command, params, client) {
if(areParamsEmpty(params)) {
messagePlayerSyntax(client, getCommandSyntaxText(command));
return false;
}
let newAccentName = params;
if(!getAccentFromParams(newAccentName)) {
messagePlayerError(client, `That accent doesn't exist!`)
return false;
}
getGlobalConfig().accents.push(newAccentName);
saveAccentConfig();
messageAdmins(`${client.name} {MAINCOLOUR}added a new accent: ${newAccentName}`);
}
// ===========================================================================

View File

@@ -16,7 +16,7 @@ function initAccountScript() {
function loginCommand(command, params, client) {
if(!isPlayerRegistered(client)) {
messagePlayerError(client, "Your name is not registered! Use /register to make an account.");
messagePlayerError(client, getLocaleString(client, "NameNotRegistered"));
return false;
}
@@ -36,10 +36,10 @@ function toggleAutoLoginByIPCommand(command, params, client) {
if(hasBitFlag(getPlayerData(client).accountData.settings, flagValue)) {
getPlayerData(client).accountData.settings = removeBitFlag(getPlayerData(client).accountData.settings, flagValue);
messagePlayerSuccess(client, `Automatic login by IP is now {softRed}OFF {white}`);
messagePlayerSuccess(client, getLocaleString(client, "AutomaticLoginIPToggle", `{softRed}${toUpperCase(getLocaleString(client, "Off"))}`));
} else {
getPlayerData(client).accountData.settings = addBitFlag(getPlayerData(client).accountData.settings, flagValue);
messagePlayerSuccess(client, `Automatic login by IP is now {softGreen}ON {white}(${client.ip})`);
messagePlayerSuccess(client, getLocaleString(client, "AutomaticLoginIPToggle", `{softGreen}${toUpperCase(getLocaleString(client, "On"))}`));
}
return true;
}
@@ -51,10 +51,10 @@ function toggleNoRandomTipsCommand(command, params, client) {
if(hasBitFlag(getPlayerData(client).accountData.settings, flagValue)) {
getPlayerData(client).accountData.settings = removeBitFlag(getPlayerData(client).accountData.settings, flagValue);
messagePlayerSuccess(client, `Random tips are now {softRed}OFF`);
messagePlayerSuccess(client, getLocaleString(client, "RandomTipsToggle", `{softRed}${toUpperCase(getLocaleString(client, "Off"))}`));
} else {
getPlayerData(client).accountData.settings = addBitFlag(getPlayerData(client).accountData.settings, flagValue);
messagePlayerSuccess(client, `Random tips are now {softGreen}ON`);
messagePlayerSuccess(client, getLocaleString(client, "RandomTipsToggle", `{softGreen}${toUpperCase(getLocaleString(client, "On"))}`));
}
return true;
}
@@ -66,10 +66,10 @@ function toggleNoActionTipsCommand(command, params, client) {
if(hasBitFlag(getPlayerData(client).accountData.settings, flagValue)) {
getPlayerData(client).accountData.settings = removeBitFlag(getPlayerData(client).accountData.settings, flagValue);
messagePlayerSuccess(client, `Action tips are now {softRed}OFF`);
messagePlayerSuccess(client, getLocaleString(client, "ActionTipsToggle", `{softRed}${toUpperCase(getLocaleString(client, "Off"))}`));
} else {
getPlayerData(client).accountData.settings = addBitFlag(getPlayerData(client).accountData.settings, flagValue);
messagePlayerSuccess(client, `Action tips are now {softGreen}ON`);
messagePlayerSuccess(client, getLocaleString(client, "ActionTipsToggle", `{softGreen}${toUpperCase(getLocaleString(client, "On"))}`));
}
return true;
}
@@ -81,10 +81,10 @@ function toggleAutoSelectLastCharacterCommand(command, params, client) {
if(hasBitFlag(getPlayerData(client).accountData.settings, flagValue)) {
getPlayerData(client).accountData.settings = removeBitFlag(getPlayerData(client).accountData.settings, flagValue);
messagePlayerSuccess(client, `Automatic spawn as last used character is now {softRed}OFF`);
messagePlayerSuccess(client, getLocaleString(client, "AutoSpawnLastCharToggle", `{softRed}${toUpperCase(getLocaleString(client, "Off"))}`));
} else {
getPlayerData(client).accountData.settings = addBitFlag(getPlayerData(client).accountData.settings, flagValue);
messagePlayerSuccess(client, `Automatic spawn as last used character is now {softGreen}ON`);
messagePlayerSuccess(client, getLocaleString(client, "AutoSpawnLastCharToggle", `{softGreen}${toUpperCase(getLocaleString(client, "On"))}`));
}
return true;
}
@@ -96,17 +96,17 @@ function toggleAccountGUICommand(command, params, client) {
if(!doesPlayerHaveGUIEnabled(client)) {
getPlayerData(client).accountData.settings = removeBitFlag(getPlayerData(client).accountData.settings, flagValue);
messagePlayerNormal(client, `⚙️ GUI is now {softGreen}ON. {white}(if server has it enabled)`);
messagePlayerNormal(client, getLocaleString(client, "GUIAccountSettingToggle", `{softRed}${toUpperCase(getLocaleString(client, "Off"))}`));
logToConsole(LOG_DEBUG, `[VRR.Account] ${getPlayerDisplayForConsole(client)} has toggled GUI for their account ON.`);
} else {
getPlayerData(client).accountData.settings = addBitFlag(getPlayerData(client).accountData.settings, flagValue);
messagePlayerNormal(client, `⚙️ GUI is now {softRed}OFF. {white}(Any GUI stuff will be use via commands and message in the chatbox)`);
logToConsole(LOG_DEBUG, `[VRR.Account] ${getPlayerDisplayForConsole(client)} has toggled GUI for their account OFF.`);
messagePlayerNormal(client, getLocaleString(client, "GUIAccountSettingToggle", `{softGreen}${toUpperCase(getLocaleString(client, "On"))}`));
logToConsole(LOG_DEBUG, `[VRR.Account] ${getPlayerDisplayForConsole(client)} has toggled GUI for their account ON.`);
}
if(!isPlayerLoggedIn(client)) {
if(getPlayerData().accountData.databaseId != 0) {
if(getServerConfig().useGUI && doesPlayerHaveGUIEnabled(client)) {
if(doesServerHaveGUIEnabled() && doesPlayerHaveGUIEnabled(client)) {
showPlayerLoginGUI(client);
logToConsole(LOG_DEBUG, `[VRR.Account] ${getPlayerDisplayForConsole(client)} is being shown the login GUI`);
} else {
@@ -115,7 +115,7 @@ function toggleAccountGUICommand(command, params, client) {
logToConsole(LOG_DEBUG, `[VRR.Account] ${getPlayerDisplayForConsole(client)} is being shown the login message (GUI disabled)`);
}
} else {
if(getServerConfig().useGUI && doesPlayerHaveGUIEnabled(client)) {
if(doesServerHaveGUIEnabled() && doesPlayerHaveGUIEnabled(client)) {
showPlayerRegistrationGUI(client);
logToConsole(LOG_DEBUG, `[VRR.Account] ${getPlayerDisplayForConsole(client)} is being shown the register GUI`);
} else {
@@ -170,34 +170,30 @@ function toggleAccountServerLogoCommand(command, params, client) {
// ===========================================================================
// UNFINISHED!
// TO-DO: Make GUI, add command to generate code to add to auth app and command to input code returned by auth app
function toggleAccountTwoFactorAuthCommand(command, params, client) {
let flagValue = getAccountSettingsFlagValue("TwoStepAuth");
if(getEmailConfig().enabled) {
if(getPlayerData(client).accountData.emailAddress != "") {
messagePlayerError(client, `You need to add your email to your account to use two-factor authentication.`);
messagePlayerTip(client, `{MAINCOLOUR}Use {ALTCOLOUR}/setemail {MAINCOLOUR}to add your email.`);
if(getPlayerData(client).accountData.emailAddress == "") {
messagePlayerError(client, getLocaleString(client, "NeedEmailFor2FA"));
messagePlayerTip(client, getLocaleString(client, "SetEmailHelpTip", `{ALTCOLOUR}/setemail{MAINCOLOUR}`));
return false;
}
if(isAccountEmailVerified(getPlayerData(client).accountData)) {
messagePlayerError(client, `You need to verify your email to your account to use two-factor authentication.`);
messagePlayerTip(client, `{MAINCOLOUR}Use {ALTCOLOUR}/verifyemail {MAINCOLOUR}to verify your email.`);
if(!isAccountEmailVerified(getPlayerData(client).accountData)) {
messagePlayerError(client, getLocaleString(client, "NeedEmailVerifiedFor2FA"));
messagePlayerTip(client, getLocaleString(client, "VerifyEmailHelpTip", `{ALTCOLOUR}/verifyemail{MAINCOLOUR}`));
return false;
}
}
if(!doesPlayerHaveTwoFactorAuthEnabled(client)) {
getPlayerData(client).accountData.settings = removeBitFlag(getPlayerData(client).accountData.settings, flagValue);
getPlayerData(client).accountData.settings = addBitFlag(getPlayerData(client).accountData.settings, flagValue);
messagePlayerSuccess(client, `{MAINCOLOUR}You have turned ${getBoolRedGreenInlineColour(false)}ON {MAINCOLOUR} two factor authentication!{ALTCOLOUR}${addtoAuthenticatorCode}`);
messagePlayerAlert(client, `You will be required to enter a code sent to your email every time you log on.`);
logToConsole(LOG_DEBUG, `[VRR.Account] ${getPlayerDisplayForConsole(client)} has toggled two-factor authentication ON for their account`);
} else {
getPlayerData(client).accountData.settings = addBitFlag(getPlayerData(client).accountData.settings, flagValue);
getPlayerData(client).accountData.settings = removeBitFlag(getPlayerData(client).accountData.settings, flagValue);
messagePlayerSuccess(client, `You have turned ${getBoolRedGreenInlineColour(false)}OFF {MAINCOLOUR}two-factor authentication for login.`);
messagePlayerAlert(client, `You won't be required to enter a code sent to your email every time you log on anymore.`);
logToConsole(LOG_DEBUG, `[VRR.Account] ${getPlayerDisplayForConsole(client)} has toggled two-factor authentication OFF for their account`);
}
return true;
@@ -230,11 +226,10 @@ function changeAccountPasswordCommand(command, params, client) {
return false;
}
let splitParams = params.split(" ");
let oldPassword = splitParams[0];
let newPassword = splitParams[1];
let oldPassword = getParam(params, " ", 1);
let newPassword = getParam(params, " ", 2);
if(isAccountPasswordCorrect(getPlayerData(client).accountData, hashAccountPassword(getPlayerName(client), oldPassword))) {
if(isAccountPasswordCorrect(getPlayerData(client).accountData, hashAccountPassword(getPlayerData(client).accountData.name, oldPassword))) {
messagePlayerError(client, `The old password is invalid!`);
return false;
}
@@ -282,8 +277,7 @@ function setAccountEmailCommand(command, params, client) {
return false;
}
let splitParams = params.split(" ");
let emailAddress = splitParams[0];
let emailAddress = getParam(params, " ", 1);
if(!isValidEmailAddress(emailAddress)) {
messagePlayerError(client, `The email '${emailAddress} is not valid!`);
@@ -320,8 +314,7 @@ function verifyAccountEmailCommand(command, params, client) {
return false;
}
let splitParams = params.split(" ");
let verificationCode = splitParams[0];
let verificationCode = getParam(params, " ", 1);
if(isAccountEmailVerified(getPlayerData(client).accountData)) {
messagePlayerError(client, `You already verified your email!`);
@@ -353,8 +346,7 @@ function resetAccountPasswordCommand(command, params, client) {
return false;
}
let splitParams = params.split(" ");
let verificationCode = splitParams[0] || "";
let verificationCode = getParam(params, " ", 1) || "";
if(!isAccountEmailVerified(getPlayerData(client).accountData)) {
messagePlayerError(client, `Your email is not verified. Your password will not be reset!`);
@@ -386,8 +378,7 @@ function setAccountDiscordCommand(command, params, client) {
return false;
}
let splitParams = params.split(" ");
let discordName = splitParams[0];
let discordName = getParam(params, " ", 1);
if(!isValidEmailAddress(emailAddress)) {
messagePlayerError(client, `The discord '${discordName} is not valid!`);
@@ -459,7 +450,6 @@ function loadAccountFromName(accountName, fullLoad = false) {
let dbAssoc = fetchQueryAssoc(dbQuery);
let tempAccountData = new AccountData(dbAssoc);
if(fullLoad) {
tempAccountData.keyBinds = loadAccountKeybindsFromDatabase(tempAccountData.databaseId);
tempAccountData.messages = loadAccountMessagesFromDatabase(tempAccountData.databaseId);
tempAccountData.notes = loadAccountStaffNotesFromDatabase(tempAccountData.databaseId);
tempAccountData.contacts = loadAccountContactsFromDatabase(tempAccountData.databaseId);
@@ -486,7 +476,6 @@ function loadAccountFromId(accountId, fullLoad = false) {
let tempAccountData = new AccountData(dbAssoc);
freeDatabaseQuery(dbQuery);
if(fullLoad) {
tempAccountData.keyBinds = loadAccountKeybindsFromDatabase(tempAccountData.databaseId);
tempAccountData.messages = loadAccountMessagesFromDatabase(tempAccountData.databaseId);
tempAccountData.notes = loadAccountStaffNotesFromDatabase(tempAccountData.databaseId);
tempAccountData.contacts = loadAccountContactsFromDatabase(tempAccountData.databaseId);
@@ -577,13 +566,31 @@ function loginSuccess(client) {
client.administrator = true;
}
if(doesServerHaveTesterOnlyEnabled()) {
if(!hasBitFlag(getPlayerData(client).accountData.flags.moderation, getModerationFlagValue("IsTester"))) {
setTimeout(function() {
client.disconnect();
}, 3500);
if(doesServerHaveGUIEnabled() && doesPlayerHaveGUIEnabled(client)) {
logToConsole(LOG_DEBUG, `[VRR.Account] ${getPlayerDisplayForConsole(client)} is being shown the error GUI (not a tester).`);
showPlayerErrorGUI(client, getLocaleString(client, "NotATester"), getLocaleString(client, "AccessDenied"));
return false;
} else {
logToConsole(LOG_DEBUG, `[VRR.Account] ${getPlayerDisplayForConsole(client)} is being shown the "not a tester" error message (GUI disabled).`);
messagePlayerError(client, getLocaleString(client, "NotATester"));
return false;
}
}
}
if(getPlayerData(client).subAccounts.length == 0) {
if(getServerConfig().useGUI && doesPlayerHaveGUIEnabled(client)) {
showPlayerPromptGUI(client, `You have no characters. Would you like to make one?`, "No characters");
if(doesServerHaveGUIEnabled() && doesPlayerHaveGUIEnabled(client)) {
showPlayerPromptGUI(client, getLocaleString(client, "NoCharactersGUIMessage"), getLocaleString(client, "NoCharactersGUIWindowTitle"));
getPlayerData(client).promptType = VRR_PROMPT_CREATEFIRSTCHAR;
logToConsole(LOG_DEBUG, `[VRR.Account] ${getPlayerDisplayForConsole(client)} is being shown the no characters prompt GUI`);
} else {
messagePlayerAlert(client, `You have no characters. Use /newchar to make one.`);
messagePlayerAlert(client, getLocaleString(client, "NoCharactersChatMessage", `{ALTCOLOUR}/newchar{MAINCOLOUR}`));
logToConsole(LOG_DEBUG, `[VRR.Account] ${getPlayerDisplayForConsole(client)} is being shown the no characters message (GUI disabled)`);
}
} else {
@@ -621,6 +628,7 @@ function saveAccountToDatabase(accountData) {
["acct_code_verifyemail", accountData.emailVerificationCode],
["acct_streaming_radio_volume", accountData.streamingRadioVolume],
["acct_ip", accountData.ipAddress],
["acct_locale", accountData.locale],
];
let data2 = [
@@ -749,10 +757,10 @@ function createAccount(name, password, email = "") {
if(getDatabaseInsertId(dbConnection) > 0) {
let tempAccountData = loadAccountFromId(getDatabaseInsertId(dbConnection), false);
createDefaultAccountServerData(tempAccountData.databaseId);
tempAccountData.keyBinds = loadAccountKeybindsFromDatabase(tempAccountData.databaseId);
tempAccountData.messages = loadAccountMessagesFromDatabase(tempAccountData.databaseId);
tempAccountData.notes = loadAccountStaffNotesFromDatabase(tempAccountData.databaseId);
tempAccountData.contacts = loadAccountContactsFromDatabase(tempAccountData.databaseId);
tempAccountData.flags.admin = 0;
return tempAccountData;
}
}
@@ -770,7 +778,7 @@ function checkLogin(client, password) {
if(isPlayerLoggedIn(client)) {
logToConsole(LOG_WARN, `[VRR.Account] ${getPlayerDisplayForConsole(client)} attempted to login but is already logged in`);
if(getServerConfig().useGUI && doesPlayerHaveGUIEnabled(client)) {
if(doesServerHaveGUIEnabled() && doesPlayerHaveGUIEnabled(client)) {
showPlayerLoginSuccessGUI(client);
} else {
messagePlayerError(client, "You are already logged in!");
@@ -781,7 +789,7 @@ function checkLogin(client, password) {
if(!isPlayerRegistered(client)) {
logToConsole(LOG_WARN, `[VRR.Account] ${getPlayerDisplayForConsole(client)} attempted to login but is not registered`);
if(getServerConfig().useGUI && doesPlayerHaveGUIEnabled(client)) {
if(doesServerHaveGUIEnabled() && doesPlayerHaveGUIEnabled(client)) {
showPlayerRegistrationGUI(client);
logToConsole(LOG_DEBUG, `[VRR.Account] ${getPlayerDisplayForConsole(client)} is being shown the register GUI`);
} else {
@@ -793,7 +801,7 @@ function checkLogin(client, password) {
if(areParamsEmpty(password)) {
logToConsole(LOG_WARN, `[VRR.Account] ${getPlayerDisplayForConsole(client)} attempted to login but failed (empty password). ${getPlayerData(client).loginAttemptsRemaining} login attempts remaining`);
if(getServerConfig().useGUI && doesPlayerHaveGUIEnabled(client)) {
if(doesServerHaveGUIEnabled() && doesPlayerHaveGUIEnabled(client)) {
showPlayerLoginFailedGUI(client, `Invalid password! ${getPlayerData(client).loginAttemptsRemaining} tries remaining.`);
logToConsole(LOG_DEBUG, `[VRR.Account] ${getPlayerDisplayForConsole(client)} is being shown the login GUI with ${getPlayerData(client).loginAttemptsRemaining} login attempts remaining alert.`);
} else {
@@ -809,7 +817,7 @@ function checkLogin(client, password) {
if(!isAccountPasswordCorrect(getPlayerData(client).accountData, hashAccountPassword(getPlayerName(client), password))) {
logToConsole(LOG_WARN, `[VRR.Account] ${getPlayerDisplayForConsole(client)} attempted to login but failed (wrong password). ${getPlayerData(client).loginAttemptsRemaining} login attempts remaining`);
if(getServerConfig().useGUI && doesPlayerHaveGUIEnabled(client)) {
if(doesServerHaveGUIEnabled() && doesPlayerHaveGUIEnabled(client)) {
showPlayerLoginFailedGUI(client, `Invalid password! ${getPlayerData(client).loginAttemptsRemaining} tries remaining.`);
logToConsole(LOG_DEBUG, `[VRR.Account] ${getPlayerDisplayForConsole(client)} is being shown the login GUI with ${getPlayerData(client).loginAttemptsRemaining} login attempts remaining alert.`);
} else {
@@ -823,7 +831,13 @@ function checkLogin(client, password) {
return false;
}
if(getServerConfig().useGUI && doesPlayerHaveGUIEnabled(client)) {
//if(doesPlayerHaveTwoFactorAuthEnabled(client)) {
// getPlayerData(client).twoFactorAuthCode = toUpperCase(generateRandomString(6));
// showPlayerTwoFactorAuthenticationGUI(client);
// return true;
//}
if(doesServerHaveGUIEnabled() && doesPlayerHaveGUIEnabled(client)) {
showPlayerLoginSuccessGUI(client);
}
@@ -840,76 +854,84 @@ function checkRegistration(client, password, confirmPassword = "", emailAddress
logToConsole(LOG_DEBUG, `[VRR.Account]: Checking registration for ${getPlayerName(client)}`);
if(isPlayerRegistered(client)) {
if(getServerConfig().useGUI && doesPlayerHaveGUIEnabled(client)) {
if(doesServerHaveGUIEnabled() && doesPlayerHaveGUIEnabled(client)) {
showPlayerLoginGUI(client);
} else {
messagePlayerError(client, "Your name is already registered!");
messagePlayerError(client, getLocaleString(client, "AlreadyRegistered"));
logToConsole(LOG_WARN, `${getPlayerDisplayForConsole(client)} failed to create an account (already registered)`);
}
return false;
}
if(isPlayerLoggedIn(client)) {
if(getServerConfig().useGUI && doesPlayerHaveGUIEnabled(client)) {
if(doesServerHaveGUIEnabled() && doesPlayerHaveGUIEnabled(client)) {
showPlayerLoginSuccessGUI(client);
} else {
messagePlayerError(client, "You are already logged in!");
messagePlayerError(client, getLocaleString(client, "AlreadyLoggedIn"));
logToConsole(LOG_WARN, `${getPlayerDisplayForConsole(client)} failed to create an account (already logged in)`);
}
return false;
}
if(areParamsEmpty(password)) {
if(getServerConfig().useGUI && doesPlayerHaveGUIEnabled(client)) {
showPlayerRegistrationFailedGUI(client, "Password cannot be blank!");
if(doesServerHaveGUIEnabled() && doesPlayerHaveGUIEnabled(client)) {
showPlayerRegistrationFailedGUI(client, getLocaleString(client, "RegistrationFailedNoPassword"));
logToConsole(LOG_WARN, `${getPlayerDisplayForConsole(client)} failed to create an account (password is blank)`);
} else {
messagePlayerError(client, "The password cannot be blank!");
logToConsole(LOG_WARN, `${getPlayerDisplayForConsole(client)} failed to create an account (password is blank)`);
}
return false;
}
if(getServerConfig().useGUI && doesPlayerHaveGUIEnabled(client)) {
if(doesServerHaveGUIEnabled() && doesPlayerHaveGUIEnabled(client)) {
if(areParamsEmpty(confirmPassword)) {
showPlayerRegistrationFailedGUI(client, "Password confirm cannot be blank!");
showPlayerRegistrationFailedGUI(client, getLocaleString(client, "RegistrationFailedNoPasswordConfirm"));
logToConsole(LOG_WARN, `${getPlayerDisplayForConsole(client)} failed to create an account (password confirm is blank)`);
return false;
}
}
if(getServerConfig().useGUI && doesPlayerHaveGUIEnabled(client)) {
if(doesServerHaveGUIEnabled() && doesPlayerHaveGUIEnabled(client)) {
if(areParamsEmpty(emailAddress)) {
showPlayerRegistrationFailedGUI(client, "Email address cannot be blank!");
showPlayerRegistrationFailedGUI(client, getLocaleString(client, "RegistrationFailedNoEmail"));
logToConsole(LOG_WARN, `${getPlayerDisplayForConsole(client)} failed to create an account (email address is blank)`);
return false;
}
}
if(getServerConfig().useGUI && doesPlayerHaveGUIEnabled(client)) {
if(doesServerHaveGUIEnabled() && doesPlayerHaveGUIEnabled(client)) {
if(password != confirmPassword) {
showPlayerRegistrationFailedGUI(client, "The passwords must match!");
showPlayerRegistrationFailedGUI(client, getLocaleString(client, "RegistrationFailedPasswordMismatch"));
logToConsole(LOG_WARN, `${getPlayerDisplayForConsole(client)} failed to create an account (password and confirm don't match)`);
return false;
}
}
if(!doesPasswordMeetRequirements(password)) {
if(getServerConfig().useGUI && doesPlayerHaveGUIEnabled(client)) {
if(doesServerHaveGUIEnabled() && doesPlayerHaveGUIEnabled(client)) {
// Work on this later. Function should return true by default anyway for now.
showPlayerRegistrationFailedGUI(client, "Password doesn't meet requirements!");
showPlayerRegistrationFailedGUI(client, getLocaleString(client, "RegistrationFailedNoPasswordWeak"));
logToConsole(LOG_WARN, `${getPlayerDisplayForConsole(client)} failed to create an account (password doesn't meet requirements)`);
} else {
messagePlayerError(client, "Password doesn't meet requirements!");
}
return false
}
if(getServerConfig().useGUI && doesPlayerHaveGUIEnabled(client)) {
if(doesServerHaveGUIEnabled() && doesPlayerHaveGUIEnabled(client)) {
if(!isValidEmailAddress(emailAddress)) {
showPlayerRegistrationFailedGUI(client, "You must put a valid email!");
showPlayerRegistrationFailedGUI(client, getLocaleString(client, "RegistrationFailedInvalidEmail"));
return false
}
}
let accountData = createAccount(getPlayerName(client), password, emailAddress);
if(!accountData) {
if(getServerConfig().useGUI && doesPlayerHaveGUIEnabled(client)) {
showPlayerRegistrationFailedGUI(client, "Your account could not be created!");
if(doesServerHaveGUIEnabled() && doesPlayerHaveGUIEnabled(client)) {
showPlayerRegistrationFailedGUI(client, getLocaleString(client, "RegistrationFailedCreateError"));
} else {
messagePlayerAlert(client, "Your account could not be created!");
messagePlayerAlert(client, getLocaleString(client, "RegistrationFailedCreateError"));
}
messagePlayerAlert(client, `${getServerName()} staff have been notified of the problem and will fix it shortly.`);
@@ -919,29 +941,123 @@ function checkRegistration(client, password, confirmPassword = "", emailAddress
getPlayerData(client).accountData = accountData;
getPlayerData(client).loggedIn = true;
messagePlayerSuccess(client, "Your account has been created!");
messagePlayerSuccess(client, getLocaleString(client, "RegistrationSuccess"));
if(checkForSMTPModule() && getEmailConfig().enabled) {
messagePlayerAlert(client, "Don't forget to verify your email! A verification code has been sent to you");
messagePlayerAlert(client, getLocaleString(client, "RegistrationEmailVerifyReminder"));
let emailVerificationCode = generateEmailVerificationCode();
setAccountEmailVerificationCode(getPlayerData(client).accountData, emailVerificationCode);
sendEmailVerificationEmail(client, emailVerificationCode);
logToConsole(LOG_WARN, `${getPlayerDisplayForConsole(client)} was sent a registration email verification code`);
}
messagePlayerAlert(client, "To play on the server, you will need to make a character.");
if(getServerConfig().useGUI && doesPlayerHaveGUIEnabled(client)) {
showPlayerRegistrationSuccessGUI(client);
showPlayerPromptGUI(client, "You have no characters. Would you like to make one?", "No Characters");
getPlayerData(client).promptType = VRR_PROMPT_CREATEFIRSTCHAR;
if(doesServerHaveTesterOnlyEnabled() && !isPlayerATester(client)) {
setTimeout(function() {
client.disconnect();
}, 5000);
if(checkForSMTPModule() && getEmailConfig().enabled) {
let emailVerificationCode = generateEmailVerificationCode();
setAccountEmailVerificationCode(getPlayerData(client).accountData, emailVerificationCode);
sendEmailVerificationEmail(client, emailVerificationCode);
}
if(doesServerHaveGUIEnabled() && doesPlayerHaveGUIEnabled(client)) {
logToConsole(LOG_DEBUG, `[VRR.Account] ${getPlayerDisplayForConsole(client)} is being shown the error GUI (not a tester).`);
showPlayerErrorGUI(client, getLocaleString(client, "NotATester"), getLocaleString(client, "AccessDenied"));
return false;
} else {
logToConsole(LOG_DEBUG, `[VRR.Account] ${getPlayerDisplayForConsole(client)} is being shown the "not a tester" error message (GUI disabled).`);
messagePlayerError(client, getLocaleString(client, "NotATester"));
return false;
}
} else {
messagePlayerAlert(client, `You have no characters. Use /newchar to make one.`);
messagePlayerAlert(client, getLocaleString(client, "RegistrationCreateCharReminder"));
if(doesServerHaveGUIEnabled() && doesPlayerHaveGUIEnabled(client)) {
showPlayerRegistrationSuccessGUI(client);
showPlayerPromptGUI(client, getLocaleString(client, "NoCharactersMessage"), getLocaleString(client, "NoCharactersWindowTitle"), getLocaleString(client, "Yes"), getLocaleString(client, "No"));
getPlayerData(client).promptType = VRR_PROMPT_CREATEFIRSTCHAR;
} else {
messagePlayerAlert(client, getLocaleString(client, "NoCharactersChatMessage"), `{ALTCOLOUR}/newchar{MAINCOLOUR}`);
}
}
};
// ===========================================================================
function checkAccountResetPasswordRequest(client, inputText) {
if(getPlayerData(client).passwordResetState == VRR_RESETPASS_STATE_NONE) {
if(toLowerCase(getPlayerData(client).accountData.emailAddress) != toLowerCase(inputText)) {
logToConsole(LOG_DEBUG|LOG_WARN, `${getPlayerDisplayForConsole(client)} failed to reset their password (email not correct)`);
return false;
}
let passwordResetCode = toUpperCase(generateEmailVerificationCode());
getPlayerData(client).passwordResetState = VRR_RESETPASS_STATE_CODEINPUT;
getPlayerData(client).passwordResetCode = passwordResetCode;
sendPasswordResetEmail(client, passwordResetCode);
showPlayerResetPasswordCodeInputGUI(client);
logToConsole(LOG_DEBUG|LOG_WARN, `${getPlayerDisplayForConsole(client)} reset their password. Awaiting verification code input ...`);
} else if(getPlayerData(client).passwordResetState == VRR_RESETPASS_STATE_CODEINPUT) {
if(getPlayerData(client).passwordResetCode == toUpperCase(inputText)) {
getPlayerData(client).passwordResetState = VRR_RESETPASS_STATE_SETPASS;
showPlayerChangePasswordGUI(client);
logToConsole(LOG_DEBUG, `${getPlayerDisplayForConsole(client)} entered the correct reset password verification code. Awaiting new password input ...`);
} else {
getPlayerData(client).passwordResetState = VRR_RESETPASS_STATE_NONE;
client.disconnect();
logToConsole(LOG_DEBUG|LOG_WARN, `${getPlayerDisplayForConsole(client)} failed to reset their password (verification code not correct)`);
}
}
return false;
}
// ===========================================================================
function checkAccountChangePassword(client, newPassword, confirmNewPassword) {
if(!isPlayerLoggedIn(client)) {
if(getPlayerData(client).passwordResetState != VRR_RESETPASS_STATE_SETPASS) {
//getPlayerData(client).passwordResetState = VRR_RESETPASS_STATE_NONE;
//client.disconnect();
logToConsole(LOG_DEBUG|LOG_WARN, `${getPlayerDisplayForConsole(client)} failed to change their password (not logged in or not using reset password)`);
return false;
}
}
//if(isAccountPasswordCorrect(getPlayerData(client).accountData, hashAccountPassword(getPlayerName(client), oldPassword))) {
// messagePlayerError(client, `The old password is incorrect!`);
// return false;
//}
if(!doesPasswordMeetRequirements(newPassword)) {
let passwordRequirementsString = `${needsCapitals}, ${needsNumbers}, ${needsSymbols}`;
let needsCapitals = getLocaleString(client, "PasswordNeedsCapitals", "1");
let needsNumbers = getLocaleString(client, "PasswordNeedsNumbers", "1");
let needsSymbols = getLocaleString(client, "PasswordNeedsSymbols", "1");
messagePlayerError(client, getLocaleString(client, "AccountPasswordNeedsImproved"));
messagePlayerInfo(client, getLocaleString(client, "PasswordNeedsBase", passwordRequirementsString));
logToConsole(LOG_DEBUG|LOG_WARN, `${getPlayerDisplayForConsole(client)} failed to change their password (password doesn't mean requirements)`);
return false;
}
if(newPassword != confirmNewPassword) {
messagePlayerError(client, getLocaleString(client, "PasswordsDontMatch"));
logToConsole(LOG_DEBUG|LOG_WARN, `${getPlayerDisplayForConsole(client)} failed to change their password (password and confirm don't match)`);
return false;
}
getPlayerData(client).accountData.password = hashAccountPassword(getPlayerData(client).accountData.name, newPassword);
getPlayerData(client).accountData.needsSaved = true;
getPlayerData(client).passwordResetCode = "";
saveAccountToDatabase(getPlayerData(client).accountData);
if(getPlayerData(client).passwordResetState == VRR_RESETPASS_STATE_SETPASS) {
getPlayerData(client).passwordResetState = VRR_RESETPASS_STATE_NONE;
}
messagePlayerSuccess(client, getLocaleString(client, "PasswordChanged"));
showPlayerLoginGUI(client);
}
// ===========================================================================
function isValidEmailAddress(emailAddress) {
return true;
}
@@ -985,9 +1101,6 @@ function savePlayerToDatabase(client) {
getPlayerCurrentSubAccount(client).interior = getPlayerInterior(client);
getPlayerCurrentSubAccount(client).dimension = getPlayerDimension(client);
}
getPlayerCurrentSubAccount(client).inHouse = (isPlayerInAnyHouse(client)) ? getPlayerHouse(client) : 0;
getPlayerCurrentSubAccount(client).inBusiness = (isPlayerInAnyBusiness(client)) ? getPlayerBusiness(client) : 0;
}
saveSubAccountToDatabase(getPlayerCurrentSubAccount(client));
@@ -1003,6 +1116,12 @@ function initClient(client) {
return false;
}
if(client.getData("vrr.isInitialized") != null || client.getData("vrr.isInitialized") == true) {
return false;
}
client.setData("vrr.isInitialized", true, false);
sendPlayerGUIColours(client);
sendPlayerGUIInit(client);
updatePlayerSnowState(client);
@@ -1019,36 +1138,37 @@ function initClient(client) {
getServerData().clients[client.index] = new ClientData(client, tempAccountData, tempSubAccounts);
let sessionId = saveConnectionToDatabase(client);
getServerData().clients[client.index].session = sessionId;
getServerData().clients[client.index].connectTime = Math.ceil(sdl.ticks);
getServerData().clients[client.index].sessionId = saveConnectionToDatabase(client);
getServerData().clients[client.index].connectTime = getCurrentUnixTimestamp();
requestClientInfo(client);
if(tempAccountData != false) {
if(isAccountAutoIPLoginEnabled(tempAccountData) && getPlayerData(client).accountData.ipAddress == client.ip) {
messagePlayerAlert(client, "You have been automatically logged in via IP!");
messagePlayerAlert(client, getLocaleString(client, "AutoLoggedInIP"));
loginSuccess(client);
} else {
if(getServerConfig().useGUI && doesPlayerHaveGUIEnabled(client)) {
if(doesServerHaveGUIEnabled() && doesPlayerHaveGUIEnabled(client)) {
logToConsole(LOG_DEBUG, `[VRR.Account] ${getPlayerDisplayForConsole(client)} is being shown the login GUI.`);
showPlayerLoginGUI(client);
addPlayerKeyBind(client, getKeyIdFromParams("insert"), "gui", "");
} else {
logToConsole(LOG_DEBUG, `[VRR.Account] ${getPlayerDisplayForConsole(client)} is being shown the login message (GUI disabled).`);
messagePlayerNormal(client, `Welcome back to ${getServerName()}, ${getPlayerName(client)}! Please /login to continue.`, getColourByName("softGreen"));
messagePlayerNormal(client, getLocaleString(client, "WelcomeBack", getServerName(), getPlayerName(client), "/login"),getColourByName("softGreen"));
}
playRadioStreamForPlayer(client, getServerIntroMusicURL(), true, getPlayerStreamingRadioVolume(client));
}
} else {
if(getServerConfig().useGUI && doesPlayerHaveGUIEnabled(client)) {
if(doesServerHaveGUIEnabled() && doesPlayerHaveGUIEnabled(client)) {
logToConsole(LOG_DEBUG, `[VRR.Account] ${getPlayerDisplayForConsole(client)} is being shown the register GUI.`);
showPlayerRegistrationGUI(client);
addPlayerKeyBind(client, getKeyIdFromParams("insert"), "gui", "");
} else {
logToConsole(LOG_DEBUG, `[VRR.Account] ${getPlayerDisplayForConsole(client)} is being shown the register message (GUI disabled).`);
messagePlayerNormal(client, `Welcome to ${getServerName()}, ${getPlayerName(client)}! Please /register to continue.`, getColourByName("softGreen"));
messagePlayerNormal(client, getLocaleString(client, "WelcomeNewPlayer", getServerName(), getPlayerName(client), "/register"), getColourByName("softGreen"));
}
playRadioStreamForPlayer(client, getServerIntroMusicURL(), true, getPlayerStreamingRadioVolume(client));
}
getServerData().clients[client.index].keyBinds = loadAccountKeybindsFromDatabase(getServerData().clients[client.index].accountData.databaseId);
sendAccountKeyBindsToClient(client);
}
}, 2500);
}
@@ -1061,11 +1181,9 @@ function saveConnectionToDatabase(client) {
let safeName = escapeDatabaseString(dbConnection, getPlayerName(client));
let dbQueryString = `INSERT INTO conn_main (conn_when_connect, conn_server, conn_script_version, conn_game_version, conn_client_version, conn_name, conn_ip) VALUES (NOW(), ${getServerConfig().databaseId}, '${scriptVersion}', '${client.gameVersion}', '0.0.0', '${safeName}', '${client.ip}')`;
queryDatabase(dbConnection, dbQueryString);
let connectionId = getDatabaseInsertId(dbConnection);
setEntityData(client, "vrr.connection", connectionId, false);
getPlayerData(client).connectionId = connectionId;
requestClientInfo(client);
return getDatabaseInsertId(dbConnection);
}
return 0;
}
// ===========================================================================
@@ -1096,19 +1214,21 @@ function loadAccountKeybindsFromDatabase(accountDatabaseID) {
tempAccountKeybinds.push(tempKeyBindData);
}
if(dbConnection) {
dbQuery = queryDatabase(dbConnection, `SELECT * FROM acct_hotkey WHERE acct_hotkey_enabled = 1 AND acct_hotkey_acct = ${accountDatabaseID} AND acct_hotkey_server = ${getServerId()}`);
if(dbQuery) {
if(dbQuery.numRows > 0) {
while(dbAssoc = fetchQueryAssoc(dbQuery)) {
let tempAccountKeyBindData = new KeyBindData(dbAssoc);
tempAccountKeybinds.push(tempAccountKeyBindData);
logToConsole(LOG_DEBUG, `[VRR.Account]: Account keybind '${tempAccountKeyBindData.databaseId}' (Key ${tempAccountKeyBindData.key} '${toUpperCase(getKeyNameFromId(tempAccountKeyBindData.key))}') loaded from database successfully!`);
if(accountDatabaseID != 0 && typeof accountDatabaseId != "undefined") {
if(dbConnection) {
dbQuery = queryDatabase(dbConnection, `SELECT * FROM acct_hotkey WHERE acct_hotkey_enabled = 1 AND acct_hotkey_acct = ${accountDatabaseID} AND acct_hotkey_server = ${getServerId()}`);
if(dbQuery) {
if(dbQuery.numRows > 0) {
while(dbAssoc = fetchQueryAssoc(dbQuery)) {
let tempAccountKeyBindData = new KeyBindData(dbAssoc);
tempAccountKeybinds.push(tempAccountKeyBindData);
logToConsole(LOG_DEBUG, `[VRR.Account]: Account keybind '${tempAccountKeyBindData.databaseId}' (Key ${tempAccountKeyBindData.key} '${toUpperCase(getKeyNameFromId(tempAccountKeyBindData.key))}') loaded from database successfully!`);
}
}
freeDatabaseQuery(dbQuery);
}
freeDatabaseQuery(dbQuery);
disconnectFromDatabase(dbConnection);
}
disconnectFromDatabase(dbConnection);
}
logToConsole(LOG_DEBUG, `[VRR.Account]: ${tempAccountKeybinds.length} account keybinds for account ${accountDatabaseID} loaded from database successfully!`);
@@ -1252,6 +1372,12 @@ function isAccountTwoFactorAuthenticationVerified(accountData) {
// ===========================================================================
function doesPlayerHaveTwoFactorAuthEnabled(client) {
return hasBitFlag(getPlayerData(client).accountData.flags.settings, getAccountSettingsFlagValue("TwoFactorAuth"));
}
// ===========================================================================
function setAccountEmail(accountData, emailAddress) {
accountData.emailAddress = emailAddress;
}
@@ -1280,6 +1406,16 @@ function sendEmailVerificationEmail(client, emailVerificationCode) {
// ===========================================================================
function sendPasswordResetEmail(client, verificationCode) {
let emailBodyText = getEmailConfig().bodyContent.confirmPasswordReset;
emailBodyText = emailBodyText.replace("{VERIFICATIONCODE}", verificationCode);
emailBodyText = emailBodyText.replace("{SERVERNAME}", getServerName());
sendEmail(getPlayerData(client).accountData.emailAddress, getPlayerData(client).accountData.name, `Reset your password on ${getServerName()}`, emailBodyText);
}
// ===========================================================================
function verifyAccountEmail(accountData, verificationCode) {
let emailVerificationCode = generateRandomString(10);
@@ -1321,7 +1457,7 @@ function sendAccountLoginSuccessNotification(emailAddress, name, ip, game = getS
let emailBodyText = getEmailConfig().bodyContent.accountAuthSuccessAlert;
emailBodyText = emailBodyText.replace("{GAMENAME}", getGameName(game));
emailBodyText = emailBodyText.replace("{IPADDRESS}", ip);
emailBodyText = emailBodyText.replace("{LOCATION}", `${cityName}, ${countryName}, ${countryName}`);
emailBodyText = emailBodyText.replace("{LOCATION}", `${cityName}, ${subDivisionName}, ${countryName}`);
emailBodyText = emailBodyText.replace("{SERVERNAME}", getServerName());
emailBodyText = emailBodyText.replace("{TIMESTAMP}", date.toLocaleString('en-US'));
@@ -1341,4 +1477,24 @@ function doesPlayerHaveRandomTipsDisabled(client) {
return isAccountSettingFlagEnabled(getPlayerData(client).accountData, getAccountSettingsFlagValue("NoRandomTips"));
}
// ===========================================================================
function checkPlayerTwoFactorAuthentication(client, authCode) {
if(getPlayerData(client).twoFactorAuthCode != "") {
if(toUpperCase(getPlayerData(client).twoFactorAuthCode) == toUpperCase(authCode)) {
loginSuccess(client);
return true;
}
}
client.disconnect();
return false;
}
// ===========================================================================
function isPlayerATester(client) {
}
// ===========================================================================

View File

@@ -20,41 +20,50 @@ function playPlayerAnimationCommand(command, params, client) {
return false;
}
let splitParams = params.split(" ");
let animationSlot = getAnimationFromParams(splitParams[0]);
let animationPositionOffset = getAnimationFromParams(splitParams[1]) || 1;
let animationSlot = getAnimationFromParams(getParam(params, " ", 1));
let animationPositionOffset = 1;
if(!animationSlot) {
messagePlayerError(client, getLocaleString("AnimationNotFound"));
messagePlayerInfo(client, getLocaleString("AnimationHelpTip"));
messagePlayerError(client, getLocaleString(client, "AnimationNotFound"));
messagePlayerInfo(client, getLocaleString(client, "AnimationHelpTip"), `{ALTCOLOUR}/animlist{MAINCOLOUR}`);
return false;
}
if(toInteger(animationPositionOffset) < 0 || toInteger(animationPositionOffset) > 3) {
messagePlayerError(client, getLocaleString("AnimationInvalidDistance"));
messagePlayerError(client, getLocaleString(client, "AnimationInvalidDistance"));
return false;
}
getPlayerData(client).currentAnimation = animationSlot;
getPlayerData(client).currentAnimationPositionOffset = animationSlot;
getPlayerData(client).currentAnimationPositionReturnTo = getPlayerPosition(client);
getPlayerData(client).animationStart = getCurrentUnixTimestamp();
//setEntityData(getPlayerData(client).ped, "vrr.animation", animationSlot, true);
messagePlayerTip(client, ``);
makePedPlayAnimation(getPlayerData(client).ped, animationSlot, animationPositionOffset);
if(getAnimationData(animationSlot)[9] != VRR_ANIMMOVE_NONE) {
if(getGame() < VRR_GAME_GTA_SA) {
setPlayerMouseCameraState(client, true);
}
if(getAnimationData(animationSlot)[3] == VRR_ANIMTYPE_SURRENDER) {
getPlayerData(client).pedState = VRR_PEDSTATE_HANDSUP;
}
if(isPlayerHandCuffed(client) || isPlayerTazed(client) || isPlayerInForcedAnimation(client)) {
messagePlayerError(client, `You aren't able to do that`);
return false;
}
messagePlayerTip(client, getLocaleString(client, "AnimationStopCommandTip", "{ALTCOLOUR}/stopanim{MAINCOLOUR}"));
makePlayerPlayAnimation(client, animationSlot, animationPositionOffset);
}
// ===========================================================================
function stopPlayerAnimationCommand(command, params, client) {
if(isPlayerHandCuffed(client) || isPlayerTazed(client) || isPlayerInForcedAnimation(client)) {
messagePlayerError(client, `You aren't able to do that`);
return false;
}
setPlayerPosition(client, getPlayerData(client).currentAnimationPositionReturnTo);
makePedStopAnimation(getPlayerData(client).ped);
getPlayerData(client).currentAnimation = -1;
getPlayerData(client).currentAnimationPositionOffset = false;
getPlayerData(client).currentAnimationPositionReturnTo = false;
getPlayerData(client).animationStart = 0;
getPlayerData(client).animationForced = false;
setPlayerMouseCameraState(client, false);
}
@@ -65,17 +74,89 @@ function showAnimationListCommand(command, params, client) {
let chunkedList = splitArrayIntoChunks(animList, 10);
messagePlayerInfo(client, `{clanOrange}== {jobYellow}Animation List {clanOrange}===========================`);
messagePlayerInfo(client, makeChatBoxSectionHeader(getLocaleString(client, "HeaderAnimationsList")));
for(let i in chunkedList) {
messagePlayerInfo(client, chunkedList[i].join(", "));
messagePlayerNormal(client, chunkedList[i].join(", "));
}
}
// ===========================================================================
/**
* @param {number} animationSlot - The slot index of the animation
* @return {Array} The animation's data (array)
*/
function getAnimationData(animationSlot, gameId = getServerGame()) {
return getGameData().animations[gameId][animationSlot];
}
// ===========================================================================
function isPlayerInForcedAnimation(client) {
return getPlayerData(client).animationForced;
}
// ===========================================================================
function makePlayerPlayAnimation(client, animationSlot, offsetPosition = 1) {
getPlayerData(client).currentAnimation = animationSlot;
getPlayerData(client).currentAnimationPositionOffset = offsetPosition;
getPlayerData(client).currentAnimationPositionReturnTo = getPlayerPosition(client);
getPlayerData(client).animationStart = getCurrentUnixTimestamp();
getPlayerData(client).animationForced = false;
makePedPlayAnimation(getPlayerData(client).ped, animationSlot, offsetPosition);
//if(getAnimationData(animationSlot)[9] != VRR_ANIMMOVE_NONE) {
// if(getGame() < VRR_GAME_GTA_SA) {
// setPlayerMouseCameraState(client, true);
// }
//}
}
// ===========================================================================
function forcePlayerPlayAnimation(client, animationSlot, offsetPosition = 1) {
getPlayerData(client).currentAnimation = animationSlot;
getPlayerData(client).currentAnimationPositionOffset = offsetPosition;
getPlayerData(client).currentAnimationPositionReturnTo = getPlayerPosition(client);
getPlayerData(client).animationStart = getCurrentUnixTimestamp();
getPlayerData(client).animationForced = true;
setPlayerControlState(client, false);
forcePedAnimation(getPlayerData(client).ped, animationSlot, offsetPosition);
}
// ===========================================================================
function makePlayerStopAnimation(client) {
//setPlayerPosition(client, getPlayerData(client).currentAnimationPositionReturnTo);
makePedStopAnimation(getPlayerData(client).ped);
getPlayerData(client).currentAnimation = -1;
getPlayerData(client).currentAnimationPositionOffset = false;
getPlayerData(client).currentAnimationPositionReturnTo = false;
getPlayerData(client).animationStart = 0;
getPlayerData(client).animationForced = false;
}
// ===========================================================================
function getAnimationFromParams(params) {
if(isNaN(params)) {
for(let i in getGameData().animations[getServerGame()]) {
if(toLowerCase(getGameData().animations[getServerGame()][i][0]).indexOf(toLowerCase(params)) != -1) {
return i;
}
}
} else {
if(typeof getGameData().animations[getServerGame()][params] != "undefined") {
return toInteger(params);
}
}
return false;
}
// ===========================================================================

View File

@@ -248,4 +248,44 @@ function isPlayerExemptFromAntiCheat(client) {
return false;
}
// ===========================================================================
function canPlayerUsePoliceJob(client) {
if(getPlayerData(client).accountData.flags.moderation & getServerBitFlags().moderationFlags.policeBanned) {
return false;
}
return true;
}
// ===========================================================================
function canClientUseFireJob(client) {
if(getPlayerData(client).accountData.flags.moderation & getServerBitFlags().moderationFlags.fireBanned) {
return false;
}
return true;
}
// ===========================================================================
function canClientUseAmmunations(client) {
if(getPlayerData(client).accountData.flags.moderation & getServerBitFlags().moderationFlags.AmmuBanned) {
return false;
}
return true;
}
// ===========================================================================
function canClientUseGuns(client) {
if(getPlayerData(client).accountData.flags.moderation & getServerBitFlags().moderationFlags.GunBanned) {
return false;
}
return true;
}
// ===========================================================================

View File

@@ -23,7 +23,7 @@ function accountBanCommand(command, params, client) {
}
let splitParams = params.split(" ");
let targetClient = getPlayerFromParams(splitParams[0]);
let targetClient = getPlayerFromParams(getParam(params, " ", 1));
let reason = splitParams.slice(1).join(" ");
if(!targetClient) {
@@ -39,7 +39,7 @@ function accountBanCommand(command, params, client) {
logToConsole(LOG_WARN, `[VRR.Ban]: ${getPlayerDisplayForConsole(targetClient)} (${getPlayerData(targetClient).accountData.name}) account was banned by ${getPlayerDisplayForConsole(client)}. Reason: ${reason}`);
messageAdminAction(`${getPlayerDisplayForConsole(targetClient)} (${getPlayerData(targetClient).accountData.name}) has been account banned.`);
messageAdminAction(`{ALTCOLOUR}${getPlayerData(targetClient).currentSubAccountData.name} {MAINCOLOUR}has been account banned.`);
banAccount(getPlayerData(targetClient).accountData.databaseId, getPlayerData(client).accountData.databaseId, reason);
disconnectPlayer(client);
}
@@ -53,7 +53,7 @@ function subAccountBanCommand(command, params, client, fromDiscord) {
}
let splitParams = params.split(" ");
let targetClient = getPlayerFromParams(splitParams[0]);
let targetClient = getPlayerFromParams(getParam(params, " ", 1));
let reason = splitParams.slice(1).join(" ");
if(!targetClient) {
@@ -69,7 +69,7 @@ function subAccountBanCommand(command, params, client, fromDiscord) {
logToConsole(LOG_WARN, `[VRR.Ban]: ${getPlayerDisplayForConsole(targetClient)} (${getPlayerData(targetClient).accountData.name})'s subaccount was banned by ${getPlayerDisplayForConsole(client)}. Reason: ${reason}`);
messageAdminAction(`${getPlayerData(targetClient).currentSubAccountData.name} has been character banned.`);
messageAdminAction(`{ALTCOLOUR}${getPlayerData(targetClient).currentSubAccountData.name} {MAINCOLOUR}has been character banned.`);
banSubAccount(getPlayerData(targetClient).currentSubAccountData.databaseId, getPlayerData(client).accountData.databaseId, reason);
disconnectPlayer(client);
@@ -84,7 +84,7 @@ function ipBanCommand(command, params, client, fromDiscord) {
}
let splitParams = params.split(" ");
let targetClient = getPlayerFromParams(splitParams[0]);
let targetClient = getPlayerFromParams(getParam(params, " ", 1));
let reason = splitParams.slice(1).join(" ");
if(!targetClient) {
@@ -98,7 +98,7 @@ function ipBanCommand(command, params, client, fromDiscord) {
return false;
}
messageAdminAction(`${targetgetPlayerName(client)} has been IP banned.`);
messageAdminAction(`{ALTCOLOUR}${getPlayerData(targetClient).currentSubAccountData.name} {MAINCOLOUR}has been IP banned.`);
banIPAddress(targetClient.ip, getPlayerData(client).accountData.databaseId, reason);
server.banIP(targetClient.ip);
@@ -114,8 +114,8 @@ function subNetBanCommand(command, params, client, fromDiscord) {
}
let splitParams = params.split(" ");
let targetClient = getPlayerFromParams(splitParams[0]);
let octetAmount = Number(splitParams[1]);
let targetClient = getPlayerFromParams(getParam(params, " ", 1));
let octetAmount = Number(getParam(params, " ", 2));
let reason = splitParams.slice(2).join(" ");
if(!targetClient) {
@@ -129,7 +129,7 @@ function subNetBanCommand(command, params, client, fromDiscord) {
return false;
}
messageAdminAction(`${targetgetPlayerName(client)} has been banned from the server (subnet ban).`);
messageAdminAction(`{ALTCOLOUR}${getPlayerData(targetClient).currentSubAccountData.name} {MAINCOLOUR}has been subnet banned`);
banSubNet(targetClient.ip, getSubNet(targetClient.ip, octetAmount), getPlayerData(client).accountData.databaseId, reason);
server.banIP(targetClient.ip);

View File

@@ -62,6 +62,8 @@ let serverBitFlagKeys = {
"TwoFactorAuthVerified",
"NonRoleplayCharacterName",
"CanHearEverything",
"DontSyncClientElements",
"IsTester"
],
factionFlagKeys: [
"None",
@@ -408,7 +410,7 @@ function getModerationFlagValue(flagName) {
// ===========================================================================
function getServerSettingFlagValue(flagName) {
function getServerSettingsFlagValue(flagName) {
if(flagName == "All") {
return -1;
}
@@ -434,11 +436,12 @@ function givePlayerStaffFlag(client, flagName) {
// ===========================================================================
function takePlayerStaffFlag(client, flagName) {
if(!getStaffFlagValue(flagName)) {
let flagValue = getStaffFlagValue(flagName);
if(!flagValue) {
return false;
}
getPlayerData(client).accountData.flags.admin = getPlayerData(client).accountData.flags.admin & ~getStaffFlagValue(flagName);
getPlayerData(client).accountData.flags.admin = removeBitFlag(getPlayerData(client).accountData.flags.admin, flagValue);
return true;
}

View File

@@ -11,19 +11,13 @@ function initBusinessScript() {
logToConsole(LOG_INFO, "[VRR.Business]: Initializing business script ...");
getServerData().businesses = loadBusinessesFromDatabase();
cacheAllBusinessItems();
if(getServerConfig().createBusinessPickups) {
}
if(getServerConfig().createBusinessBlips) {
}
createAllBusinessPickups();
createAllBusinessBlips();
setAllBusinessIndexes();
cacheAllBusinessItems();
logToConsole(LOG_INFO, "[VRR.Business]: Business script initialized successfully!");
return true;
@@ -143,7 +137,7 @@ function loadBusinessGameScriptsFromDatabase(businessId) {
// ===========================================================================
function createBusinessCommand(command, params, client) {
let tempBusinessData = createBusiness(params, getPlayerPosition(client), toVector3(0.0, 0.0, 0.0), getGameConfig().pickupModels[getServerGame()].business, getGameConfig().blipSprites[getServerGame()].business, getPlayerInterior(client), getPlayerDimension(client));
let tempBusinessData = createBusiness(params, getPlayerPosition(client), toVector3(0.0, 0.0, 0.0), getGameConfig().pickupModels[getServerGame()].Business, getGameConfig().blipSprites[getServerGame()].Business, getPlayerInterior(client), getPlayerDimension(client));
tempBusinessData.needsSaved = true;
let businessId = getServerData().businesses.push(tempBusinessData);
setAllBusinessIndexes();
@@ -166,15 +160,15 @@ function createBusinessLocationCommand(command, params, client) {
return false;
}
let locationType = toString(splitParams[0]);
let businessId = (isPlayerInAnyBusiness(splitParams[1])) ? getPlayerBusiness(client) : getClosestBusinessEntrance(getPlayerPosition(client));
let locationType = toString(getParam(params, " ", 1));
let businessId = (isPlayerInAnyBusiness(getParam(params, " ", 2))) ? getPlayerBusiness(client) : getClosestBusinessEntrance(getPlayerPosition(client));
if(!areParamsEmpty(params)) {
businessId = getBusinessFromParams(params);
}
if(!getBusinessData(businessId)) {
messagePlayerError(client, "Business not found!");
messagePlayerError(client, getLocaleString(client, "InvalidBusiness"));
return false;
}
@@ -217,7 +211,7 @@ function deleteBusinessCommand(command, params, client) {
}
if(!getBusinessData(businessId)) {
messagePlayerError(client, "Business not found!");
messagePlayerError(client, getLocaleString(client, "InvalidBusiness"));
return false;
}
@@ -228,7 +222,7 @@ function deleteBusinessCommand(command, params, client) {
// ===========================================================================
function deleteBusinessLocationCommand(command, params, client) {
//let businessId = toInteger(splitParams[1]);
//let businessId = toInteger(getParam(params, " ", 2));
//deleteBusinessLocation(businessId);
//messagePlayerSuccess(client, `Business '${tempBusinessData.name} deleted!`);
}
@@ -241,7 +235,7 @@ function setBusinessNameCommand(command, params, client) {
let businessId = getPlayerBusiness(client);
if(!getBusinessData(businessId)) {
messagePlayerError(client, "Business not found!");
messagePlayerError(client, getLocaleString(client, "InvalidBusiness"));
return false;
}
@@ -269,12 +263,12 @@ function setBusinessOwnerCommand(command, params, client) {
let businessId = getPlayerBusiness(client);
if(!newBusinessOwner) {
messagePlayerError(client, "Player not found!");
messagePlayerError(client, getLocaleString(client, "InvalidPlayer"));
return false;
}
if(!getBusinessData(businessId)) {
messagePlayerError(client, "Business not found!");
messagePlayerError(client, getLocaleString(client, "InvalidBusiness"));
return false;
}
@@ -287,7 +281,7 @@ function setBusinessOwnerCommand(command, params, client) {
getBusinessData(businessId).ownerId = getPlayerCurrentSubAccount(newBusinessOwner).databaseId;
getBusinessData(businessId).needsSaved = true;
messagePlayerSuccess(`{MAINCOLOUR}You gave business {businessBlue}${getBusinessData(businessId).name} {MAINCOLOUR}to {ALTCOLOUR}${newBusinessOwner.name}`);
messagePlayerSuccess(client, `{MAINCOLOUR}You gave business {businessBlue}${getBusinessData(businessId).name}{MAINCOLOUR} to {ALTCOLOUR}${getCharacterFullName(newBusinessOwner)}`);
}
// ===========================================================================
@@ -302,12 +296,12 @@ function setBusinessJobCommand(command, params, client) {
let businessId = getPlayerBusiness(client);
if(!getJobData(jobId)) {
messagePlayerError(client, "Job not found!");
messagePlayerError(client, getLocaleString(client, "InvalidJob"));
return false;
}
if(!getBusinessData(businessId)) {
messagePlayerError(client, "Business not found!");
messagePlayerError(client, getLocaleString(client, "InvalidBusiness"));
return false;
}
@@ -320,7 +314,7 @@ function setBusinessJobCommand(command, params, client) {
getBusinessData(businessId).ownerId = getJobData(jobId).databaseId;
getBusinessData(businessId).needsSaved = true;
messagePlayerSuccess(`{MAINCOLOUR}You set the owner of business {businessBlue}${getBusinessData(businessId).name} {MAINCOLOUR}to the {jobYellow}${getJobData(jobId).name}`);
messagePlayerSuccess(client, `{MAINCOLOUR}You set the owner of business {businessBlue}${getBusinessData(businessId).name} {MAINCOLOUR}to the {jobYellow}${getJobData(jobId).name}`);
}
// ===========================================================================
@@ -329,14 +323,14 @@ function setBusinessClanCommand(command, params, client) {
let businessId = getPlayerBusiness(client);
if(!getBusinessData(businessId)) {
messagePlayerError("Business not found!");
messagePlayerError(getLocaleString(client, "InvalidBusiness"));
return false;
}
let clanId = getPlayerClan(client);
if(!getClanData(clanId)) {
messagePlayerError(client, "Clan not found!");
messagePlayerError(client, getLocaleString(client, "InvalidClan"));
return false;
}
@@ -349,7 +343,7 @@ function setBusinessClanCommand(command, params, client) {
getBusinessData(businessId).ownerId = getClanData(clanId).databaseId;
getBusinessData(businessId).needsSaved = true;
messagePlayerSuccess(`{MAINCOLOUR}You gave business {businessBlue}${getBusinessData(businessId).name} {MAINCOLOUR}to the {clanOrange}${getClanData(clanId).name} {MAINCOLOUR}clan!`);
messagePlayerSuccess(client, `{MAINCOLOUR}You gave business {businessBlue}${getBusinessData(businessId).name} {MAINCOLOUR}to the {clanOrange}${getClanData(clanId).name} {MAINCOLOUR}clan!`);
}
// ===========================================================================
@@ -358,7 +352,7 @@ function setBusinessRankCommand(command, params, client) {
let businessId = getPlayerBusiness(client);
if(!getBusinessData(businessId)) {
messagePlayerError("Business not found!");
messagePlayerError(getLocaleString(client, "InvalidBusiness"));
return false;
}
@@ -373,14 +367,14 @@ function setBusinessRankCommand(command, params, client) {
let clanId = getClanIdFromDatabaseId(getBusinessData(businessId).ownerId);
rankId = getClanRankFromParams(clanId, params);
if(!getClanRankData(clanId, rankId)) {
messagePlayerError(client, "Clan rank not found!");
messagePlayerError(client, getLocaleString(client, "ClanRankInvalid"));
return false;
}
getBusinessData(businessId).rank = getClanRankData(clanId, rankId).databaseId;
messageAdmins(`{ALTCOLOUR}${getPlayerName(client)} {MAINCOLOUR}set their {businessBlue}${getBusinessData(businessId).name} {MAINCOLOUR}rank to {ALTCOLOUR}${getClanRankData(clanId, rankId).name} {MAINCOLOUR}of the {clanOrange}${getClanData(clanId).name} {MAINCOLOUR}clan!`);
messagePlayerSuccess(client, `{MAINCOLOUR}You set business {businessBlue}${getBusinessData(businessId).name} {MAINCOLOUR}rank to {ALTCOLOUR}${getClanRankData(clanId, rankId).name} {MAINCOLOUR}of the {clanOrange}${getClanData(clanId).name} {MAINCOLOUR}clan!`);
} else if(getBusinessData(businessId).ownerType == VRR_VEHOWNER_JOB) {
getBusinessData(businessId).rank = rankId;
messageAdmins(`{ALTCOLOUR}${getPlayerName(client)} {MAINCOLOUR}set business {businessBlue}${getBusinessData(businessId).name} {MAINCOLOUR}rank to {ALTCOLOUR}${rankId} {MAINCOLOUR}of the {jobYellow}${getJobData(getJobIdFromDatabaseId(getBusinessData(businessId).ownerId)).name} {MAINCOLOUR}job!`);
messagePlayerSuccess(client, `{MAINCOLOUR}You set business {businessBlue}${getBusinessData(businessId).name} {MAINCOLOUR}rank to {ALTCOLOUR}${rankId} {MAINCOLOUR}of the {jobYellow}${getJobData(getJobIdFromDatabaseId(getBusinessData(businessId).ownerId)).name} {MAINCOLOUR}job!`);
}
getBusinessData(businessId).needsSaved = true;
@@ -406,21 +400,21 @@ function setBusinessRankCommand(command, params, client) {
let businessId = getPlayerBusiness(client);
if(!getBusinessData(businessId)) {
messagePlayerError("Business not found!");
messagePlayerError(getLocaleString(client, "InvalidBusiness"));
return false;
}
let clanId = getPlayerClan(client);
if(!getClanData(clanId)) {
messagePlayerError(client, "Clan not found!");
messagePlayerError(client, getLocaleString(client, "InvalidClan"));
return false;
}
let clanRankId = getClanRankFromParams(clanId, params);
if(!getClanRankData(clanId, clanRankId)) {
messagePlayerError(client, "Clan rank not found!");
messagePlayerError(client, getLocaleString(client, "ClanRankInvalid"));
return false;
}
@@ -437,7 +431,7 @@ function setBusinessRankCommand(command, params, client) {
getBusinessData(businessId).clanRank = getClanRankData(clanId, clanRankId).level;
getBusinessData(businessId).needsSaved = true;
messagePlayerSuccess(`{MAINCOLOUR}You set business {businessBlue}${getBusinessData(businessId).name}{MAINCOLOUR}'s clan rank to {clanOrange}${getClanRankData(clanId, clanRankId).name} {MAINCOLOUR}(level ${getClanRankData(clanId, clanRankId).level}) and above!`);
messagePlayerSuccess(client, `{MAINCOLOUR}You set business {businessBlue}${getBusinessData(businessId).name}{MAINCOLOUR}'s clan rank to {clanOrange}${getClanRankData(clanId, clanRankId).name} {MAINCOLOUR}(level ${getClanRankData(clanId, clanRankId).level}) and above!`);
}
// ===========================================================================
@@ -457,12 +451,12 @@ function setBusinessJobCommand(command, params, client) {
}
if(!getBusinessData(businessId)) {
messagePlayerError(client, "Business not found!");
messagePlayerError(client, getLocaleString(client, "InvalidBusiness"));
return false;
}
if(!getJobData(jobId)) {
messagePlayerError(client, "Job not found!");
messagePlayerError(client, getLocaleString(client, "InvalidJob"));
return false;
}
@@ -470,7 +464,7 @@ function setBusinessJobCommand(command, params, client) {
getBusinessData(businessId).ownerId = getJobData(jobId).databaseId;
getBusinessData(businessId).needsSaved = true;
messageAdmins(`{ALTCOLOUR}${getPlayerName(client)} {MAINCOLOUR}set business {businessBlue}${getBusinessData(businessId).name} {MAINCOLOUR}owner to the {jobYellow}${getJobData(jobId).name} {MAINCOLOUR}job`);
messagePlayerSuccess(client, `{MAINCOLOUR}You set business {businessBlue}${getBusinessData(businessId).name} {MAINCOLOUR}owner to the {jobYellow}${getJobData(jobId).name} {MAINCOLOUR}job`);
}
// ===========================================================================
@@ -483,7 +477,7 @@ function setBusinessPublicCommand(command, params, client) {
}
if(!getBusinessData(businessId)) {
messagePlayerError(client, "Business not found!");
messagePlayerError(client, getLocaleString(client, "InvalidBusiness"));
return false;
}
@@ -491,7 +485,28 @@ function setBusinessPublicCommand(command, params, client) {
getBusinessData(businessId).ownerId = 0;
getBusinessData(businessId).needsSaved = true;
messageAdmins(`{ALTCOLOUR}${getPlayerName(client)} {MAINCOLOUR}set business {businessBlue}${getBusinessData(businessId).name} {MAINCOLOUR}owner set to {ALTCOLOUR}public`);
messagePlayerSuccess(client, `{MAINCOLOUR}You set business {businessBlue}${getBusinessData(businessId).name} {MAINCOLOUR}owner set to {ALTCOLOUR}public`);
}
// ===========================================================================
function removeBusinessOwnerCommand(command, params, client) {
let businessId = getPlayerBusiness(client);
if(!areParamsEmpty(params)) {
businessId = getBusinessFromParams(params);
}
if(!getBusinessData(businessId)) {
messagePlayerError(client, getLocaleString(client, "InvalidBusiness"));
return false;
}
getBusinessData(businessId).ownerType = VRR_BIZOWNER_NONE;
getBusinessData(businessId).ownerId = -1;
getBusinessData(businessId).needsSaved = true;
messagePlayerSuccess(client, `{MAINCOLOUR}You removed business {businessBlue}${getBusinessData(businessId).name} {MAINCOLOUR}owner`);
}
// ===========================================================================
@@ -504,7 +519,7 @@ function lockUnlockBusinessCommand(command, params, client) {
}
if(!getBusinessData(businessId)) {
messagePlayerError(client, "Business not found!");
messagePlayerError(client, getLocaleString(client, "InvalidBusiness"));
return false;
}
@@ -517,7 +532,7 @@ function lockUnlockBusinessCommand(command, params, client) {
setEntityData(getBusinessData(businessId).entrancePickup, "vrr.label.locked", getBusinessData(businessId).locked, true);
getBusinessData(businessId).needsSaved = true;
messagePlayerSuccess(client, `${getLockedUnlockedEmojiFromBool((getBusinessData(businessId).locked))} Business {businessBlue}${getBusinessData(businessId).name} {MAINCOLOUR}${getLockedUnlockedTextFromBool((getBusinessData(businessId).locked))}!`);
messagePlayerSuccess(client, `${getLockedUnlockedEmojiFromBool((getBusinessData(businessId).locked))} Business {businessBlue}${getBusinessData(businessId).name} {MAINCOLOUR}${getLockedUnlockedFromBool((getBusinessData(businessId).locked))}!`);
}
// ===========================================================================
@@ -535,7 +550,7 @@ function lockUnlockBusinessCommand(command, params, client) {
let businessId = getPlayerBusiness(client);
if(!getBusinessData(businessId)) {
messagePlayerError(client, "Business not found!");
messagePlayerError(client, getLocaleString(client, "InvalidBusiness"));
return false;
}
@@ -554,12 +569,11 @@ function lockUnlockBusinessCommand(command, params, client) {
// ===========================================================================
function setBusinessEntranceFeeCommand(command, params, client) {
let splitParams = params.split(" ");
let entranceFee = toInteger(splitParams[0]) || 0;
let entranceFee = toInteger(getParam(params, " ", 1)) || 0;
let businessId = getPlayerBusiness(client);
if(!getBusinessData(businessId)) {
messagePlayerError(client, "Business not found!");
messagePlayerError(client, getLocaleString(client, "InvalidBusiness"));
return false;
}
@@ -570,7 +584,7 @@ function setBusinessEntranceFeeCommand(command, params, client) {
getBusinessData(businessId).entranceFee = entranceFee;
getBusinessData(businessId).needsSaved = true;
messageAdmins(`{ALTCOLOUR}${getPlayerName(client)} {MAINCOLOUR}set business {businessBlue}${getBusinessData(businessId).name} {MAINCOLOUR}entrance fee to [#AAAAAAA]$${entranceFee}`);
messagePlayerSuccess(client, `{MAINCOLOUR}You set business {businessBlue}${getBusinessData(businessId).name} {MAINCOLOUR}entrance fee to [#AAAAAAA]$${entranceFee}`);
}
// ===========================================================================
@@ -583,7 +597,7 @@ function getBusinessInfoCommand(command, params, client) {
}
if(!getBusinessData(businessId)) {
messagePlayerError(client, "Business not found!");
messagePlayerError(client, getLocaleString(client, "InvalidBusiness"));
return false;
}
@@ -624,7 +638,7 @@ function getBusinessFloorItemsCommand(command, params, client) {
}
if(!getBusinessData(businessId)) {
messagePlayerError(client, "Business not found!");
messagePlayerError(client, getLocaleString(client, "InvalidBusiness"));
return false;
}
@@ -641,7 +655,7 @@ function getBusinessStorageItemsCommand(command, params, client) {
}
if(!getBusinessData(businessId)) {
messagePlayerError(client, "Business not found!");
messagePlayerError(client, getLocaleString(client, "InvalidBusiness"));
return false;
}
@@ -651,19 +665,24 @@ function getBusinessStorageItemsCommand(command, params, client) {
// ===========================================================================
function setBusinessPickupCommand(command, params, client) {
let splitParams = params.split(" ");
let typeParam = splitParams[0] || "business";
let typeParam = getParam(params, " ", 1) || "business";
let businessId = getPlayerBusiness(client);
if(!getBusinessData(businessId)) {
messagePlayerError(client, "Business not found!");
messagePlayerError(client, getLocaleString(client, "InvalidBusiness"));
return false;
}
if(isNaN(typeParam)) {
if(isNull(getGameConfig().pickupModels[getServerGame()][typeParam])) {
messagePlayerError(client, "Invalid business type! Use a business type name or a pickup model ID");
messagePlayerInfo(client, `Pickup Types: {ALTCOLOUR}${Object.keys(getGameConfig().pickupModels[getServerGame()]).join(", ")}`)
messagePlayerError(client, "Invalid pickup type! Use a pickup type name or a model ID");
let pickupTypes = Object.keys(getGameConfig().pickupModels[getServerGame()]);
let chunkedList = splitArrayIntoChunks(pickupTypes, 10);
messagePlayerNormal(client, makeChatBoxSectionHeader(getLocaleString(client, "HeaderPickupTypes")));
for(let i in chunkedList) {
messagePlayerInfo(client, chunkedList[i].join(", "));
}
return false;
}
@@ -676,18 +695,17 @@ function setBusinessPickupCommand(command, params, client) {
getBusinessData(businessId).needsSaved = true;
messageAdmins(`{ALTCOLOUR}${getPlayerName(client)} {MAINCOLOUR}set business {businessBlue}${getBusinessData(businessId).name} {MAINCOLOUR}pickup display to {ALTCOLOUR}${toLowerCase(typeParam)}'!`);
messageAdmins(`{ALTCOLOUR}${getPlayerName(client)}{MAINCOLOUR} set business {businessBlue}${getBusinessData(businessId).name} {MAINCOLOUR}pickup display to {ALTCOLOUR}${typeParam}!`);
}
// ===========================================================================
function setBusinessInteriorTypeCommand(command, params, client) {
let splitParams = params.split(" ");
let typeParam = splitParams[0] || "business";
let typeParam = getParam(params, " ", 1) || "business";
let businessId = getPlayerBusiness(client);
if(!getBusinessData(businessId)) {
messagePlayerError(client, "Business not found!");
messagePlayerError(client, getLocaleString(client, "InvalidBusiness"));
return false;
}
@@ -698,26 +716,26 @@ function setBusinessInteriorTypeCommand(command, params, client) {
getBusinessData(businessId).exitInterior = -1;
getBusinessData(businessId).hasInterior = false;
getBusinessData(businessId).exitPickupModel = -1;
messageAdmins(`{ALTCOLOUR}${getPlayerName(client)} {MAINCOLOUR}removed business {businessBlue}${getBusinessData(businessId).name} {MAINCOLOUR}interior`);
messageAdmins(`{ALTCOLOUR}${getPlayerName(client)} {MAINCOLOUR}removed business {businessBlue}${getBusinessData(businessId).name}{MAINCOLOUR} interior`);
return false;
}
if(isNull(getGameConfig().interiorTemplates[getServerGame()][typeParam])) {
if(isNull(getGameConfig().interiors[getServerGame()][typeParam])) {
messagePlayerError(client, "Invalid interior type! Use an interior type name");
let interiorTypesList = Object.keys(getGameConfig().interiorTemplates[getServerGame()]);
let interiorTypesList = Object.keys(getGameConfig().interiors[getServerGame()]);
let chunkedList = splitArrayIntoChunks(interiorTypesList, 10);
messagePlayerInfo(client, `{clanOrange}== {jobYellow}Interior Types {clanOrange}=======================`);
messagePlayerNormal(client, makeChatBoxSectionHeader(getLocaleString(client, "HeaderInteriorTypes")));
for(let i in chunkedList) {
messagePlayerInfo(client, chunkedList[i].join(", "));
}
return false;
}
getBusinessData(businessId).exitPosition = getGameConfig().interiorTemplates[getServerGame()][typeParam][0];
getBusinessData(businessId).exitInterior = getGameConfig().interiorTemplates[getServerGame()][typeParam][1];
getBusinessData(businessId).exitPosition = getGameConfig().interiors[getServerGame()][typeParam][0];
getBusinessData(businessId).exitInterior = getGameConfig().interiors[getServerGame()][typeParam][1];
getBusinessData(businessId).exitDimension = getBusinessData(businessId).databaseId+getGlobalConfig().businessDimensionStart;
getBusinessData(businessId).exitPickupModel = getGameConfig().pickupModels[getServerGame()].exit;
getBusinessData(businessId).exitPickupModel = getGameConfig().pickupModels[getServerGame()].Exit;
getBusinessData(businessId).hasInterior = true;
}
@@ -730,26 +748,31 @@ function setBusinessInteriorTypeCommand(command, params, client) {
getBusinessData(businessId).needsSaved = true;
messageAdmins(`{ALTCOLOUR}${getPlayerName(client)} {MAINCOLOUR}set business {businessBlue}${getBusinessData(businessId).name} {MAINCOLOUR}interior type to {ALTCOLOUR}${toLowerCase(typeParam)}`);
messageAdmins(`{ALTCOLOUR}${getPlayerName(client)}{MAINCOLOUR} set business {businessBlue}${getBusinessData(businessId).name}{MAINCOLOUR} interior type to {ALTCOLOUR}${typeParam}`);
}
// ===========================================================================
function setBusinessBlipCommand(command, params, client) {
let splitParams = params.split(" ");
let typeParam = splitParams[0] || "business";
let typeParam = getParam(params, " ", 1) || "business";
let businessId = getPlayerBusiness(client);
if(!getBusinessData(businessId)) {
messagePlayerError(client, "Business not found!");
messagePlayerError(client, getLocaleString(client, "InvalidBusiness"));
return false;
}
if(isNaN(typeParam)) {
if(isNull(getGameConfig().blipSprites[getServerGame()][typeParam])) {
messagePlayerError(client, "Invalid business type! Use a business type name or a blip image ID");
messagePlayerInfo(client, `Blip Types: {ALTCOLOUR}${Object.keys(getGameConfig().blipSprites[getServerGame()]).join(", ")}`)
let blipTypes = Object.keys(getGameConfig().blipSprites[getServerGame()]);
let chunkedList = splitArrayIntoChunks(blipTypes, 10);
messagePlayerNormal(client, makeChatBoxSectionHeader(getLocaleString(client, "HeaderBlipTypes")));
for(let i in chunkedList) {
messagePlayerInfo(client, chunkedList[i].join(", "));
}
return false;
}
@@ -761,28 +784,34 @@ function setBusinessBlipCommand(command, params, client) {
resetBusinessBlips(businessId);
getBusinessData(businessId).needsSaved = true;
messageAdmins(`{ALTCOLOUR}${getPlayerName(client)} {MAINCOLOUR}set business {businessBlue}${getBusinessData(businessId).name} {MAINCOLOUR}blip display to {ALTCOLOUR}${toLowerCase(typeParam)}`);
messageAdmins(`{ALTCOLOUR}${getPlayerName(client)} {MAINCOLOUR}set business {businessBlue}${getBusinessData(businessId).name}{MAINCOLOUR} blip display to {ALTCOLOUR}${typeParam}`);
}
// ===========================================================================
function giveDefaultItemsToBusinessCommand(command, params, client) {
let splitParams = params.split(" ");
let typeParam = splitParams[0] || "business";
let typeParam = getParam(params, " ", 1) || "business";
let businessId = getPlayerBusiness(client);
if(!getBusinessData(businessId)) {
messagePlayerError(client, "Business not found!");
messagePlayerError(client, getLocaleString(client, "InvalidBusiness"));
return false;
}
if(!isNaN(typeParam)) {
messagePlayerError(client, getLocaleString(client, "InvalidBusiness"));
return false;
}
if(isNull(getGameConfig().defaultBusinessItems[getServerGame()][typeParam])) {
messagePlayerError(client, "Invalid business items type! Use a business items type name");
messagePlayerInfo(client, `Blip Types: {ALTCOLOUR}${Object.keys(getGameConfig().defaultBusinessItems[getServerGame()]).join(", ")}`)
let businessItemTypes = Object.keys(getGameConfig().defaultBusinessItems[getServerGame()]);
let chunkedList = splitArrayIntoChunks(businessItemTypes, 10);
messagePlayerNormal(client, makeChatBoxSectionHeader(getLocaleString(client, "HeaderDefaultBusinessItemTypes")));
for(let i in chunkedList) {
messagePlayerInfo(client, chunkedList[i].join(", "));
}
return false;
}
@@ -806,7 +835,7 @@ function setBusinessEntranceLabelToDealershipCommand(command, params, client) {
let businessId = getPlayerBusiness(client);
if(!getBusinessData(businessId)) {
messagePlayerError(client, "Business not found!");
messagePlayerError(client, getLocaleString(client, "InvalidBusiness"));
return false;
}
@@ -818,17 +847,16 @@ function setBusinessEntranceLabelToDealershipCommand(command, params, client) {
// ===========================================================================
function deleteBusinessFloorItemsCommand(command, params, client) {
let splitParams = params.split(" ");
let businessId = getPlayerBusiness(client);
if(!getBusinessData(businessId)) {
messagePlayerError(client, "Business not found!");
messagePlayerError(client, getLocaleString(client, "InvalidBusiness"));
return false;
}
for(let i in getBusinessData(businessId).floorItemCache) {
deleteItem(getBusinessData(businessId).floorItemCache);
let tempCache = getBusinessData(businessId).floorItemCache;
for(let i in tempCache) {
deleteItem(tempCache[i]);
}
cacheBusinessItems(businessId);
@@ -839,17 +867,16 @@ function deleteBusinessFloorItemsCommand(command, params, client) {
// ===========================================================================
function deleteBusinessStorageItemsCommand(command, params, client) {
let splitParams = params.split(" ");
let businessId = getPlayerBusiness(client);
if(!getBusinessData(businessId)) {
messagePlayerError(client, "Business not found!");
messagePlayerError(client, getLocaleString(client, "InvalidBusiness"));
return false;
}
for(let i in getBusinessData(businessId).storageItemCache) {
deleteItem(getBusinessData(businessId).storageItemCache);
let tempCache = getBusinessData(businessId).storageItemCache;
for(let i in tempCache) {
deleteItem(tempCache[i]);
}
cacheBusinessItems(businessId);
@@ -865,13 +892,11 @@ function withdrawFromBusinessCommand(command, params, client) {
return false;
}
let splitParams = params.split(" ");
let amount = toInteger(splitParams[0]) || 0;
let amount = toInteger(getParam(params, " ", 1)) || 0;
let businessId = getPlayerBusiness(client);
if(!getBusinessData(businessId)) {
messagePlayerError(client, "Business not found!");
messagePlayerError(client, getLocaleString(client, "InvalidBusiness"));
return false;
}
@@ -901,13 +926,11 @@ function setBusinessBuyPriceCommand(command, params, client) {
return false;
}
let splitParams = params.split(" ");
let amount = toInteger(splitParams[0]) || 0;
let amount = toInteger(getParam(params, " ", 1)) || 0;
let businessId = getPlayerBusiness(client);
if(!getBusinessData(businessId)) {
messagePlayerError(client, "Business not found!");
messagePlayerError(client, getLocaleString(client, "InvalidBusiness"));
return false;
}
@@ -936,13 +959,11 @@ function depositIntoBusinessCommand(command, params, client) {
return false;
}
let splitParams = params.split(" ");
let amount = toInteger(splitParams[0]) || 0;
let amount = toInteger(getParam(params, " ", 1)) || 0;
let businessId = getPlayerBusiness(client);
if(!getBusinessData(businessId)) {
messagePlayerError(client, "Business not found!");
messagePlayerError(client, getLocaleString(client, "InvalidBusiness"));
return false;
}
@@ -995,7 +1016,7 @@ function orderItemForBusinessCommand(command, params, client) {
logToConsole(LOG_DEBUG, `[VRR.Business] ${getPlayerDisplayForConsole(client)} is ordering ${amount} ${splitParams.slice(0,-2).join(" ")} (${value})`);
if(!getBusinessData(businessId)) {
messagePlayerError(client, "Business not found!");
messagePlayerError(client, getLocaleString(client, "InvalidBusiness"));
return false;
}
@@ -1041,7 +1062,7 @@ function viewBusinessTillAmountCommand(command, params, client) {
}
if(!getBusinessData(businessId)) {
messagePlayerError(client, "Business not found!");
messagePlayerError(client, getLocaleString(client, "InvalidBusiness"));
return false;
}
@@ -1059,17 +1080,17 @@ function buyBusinessCommand(command, params, client) {
let businessId = getPlayerBusiness(client);
if(!getBusinessData(businessId)) {
messagePlayerError(client, "Business not found!");
messagePlayerError(client, getLocaleString(client, "InvalidBusiness"));
return false;
}
if(getBusinessData(businessId).buyPrice <= 0) {
messagePlayerError(client, `Business {businessBlue}${getBusinessData(businessId).name} {MAINCOLOUR}is not for sale!`);
messagePlayerError(client, getLocaleString(client, "BusinessNotForSale"));
return false;
}
if(getPlayerCurrentSubAccount(client).cash < getBusinessData(businessId).buyPrice) {
messagePlayerError(client, `You don't have enough money to buy business {businessBlue}${getBusinessData(businessId).name}!`);
messagePlayerError(client, getLocaleString(client, "BusinessPurchaseNotEnoughMoney"));
return false;
}
@@ -1093,7 +1114,7 @@ function moveBusinessEntranceCommand(command, params, client) {
}
if(!getBusinessData(businessId)) {
messagePlayerError(client, "Business not found!");
messagePlayerError(client, getLocaleString(client, "InvalidBusiness"));
return false;
}
@@ -1124,7 +1145,7 @@ function moveBusinessExitCommand(command, params, client) {
}
if(!getBusinessData(businessId)) {
messagePlayerError(client, "Business not found!");
messagePlayerError(client, getLocaleString(client, "InvalidBusiness"));
return false;
}
@@ -1223,7 +1244,12 @@ function saveAllBusinessesToDatabase() {
// ===========================================================================
function saveBusinessToDatabase(businessId) {
let tempBusinessData = getServerData().businesses[businessId]
let tempBusinessData = getServerData().businesses[businessId];
if(!tempBusinessData.needsSaved) {
return false;
}
logToConsole(LOG_DEBUG, `[VRR.Business]: Saving business '${tempBusinessData.name}' to database ...`);
let dbConnection = connectToDatabase();
if(dbConnection) {
@@ -1315,17 +1341,17 @@ function createBusinessEntrancePickup(businessId) {
}
if(getBusinessData(businessId).entrancePickupModel != -1) {
let pickupModelId = getGameConfig().pickupModels[getServerGame()].business;
let pickupModelId = getGameConfig().pickupModels[getServerGame()].Business;
if(getServerData().businesses[businessId].entrancePickupModel != 0) {
pickupModelId = getBusinessData(businessId).entrancePickupModel;
}
logToConsole(LOG_VERBOSE, `[VRR.Job]: Creating entrance pickup for business ${getBusinessData(businessId).name} (model ${pickupModelId})`);
getBusinessData(businessId).entrancePickup = createGamePickup(pickupModelId, getBusinessData(businessId).entrancePosition, getGameConfig().pickupTypes[getServerGame()].business);
setElementOnAllDimensions(getBusinessData(businessId).entrancePickup, false);
setElementDimension(getBusinessData(businessId).entrancePickup, getBusinessData(businessId).entranceDimension);
setElementStreamInDistance(getBusinessData(businessId).entrancePickup, getGlobalConfig().businessPickupStreamInDistance);
setElementStreamOutDistance(getBusinessData(businessId).entrancePickup, getGlobalConfig().businessPickupStreamOutDistance);
updateBusinessPickupLabelData(businessId);
addToWorld(getBusinessData(businessId).entrancePickup);
}
@@ -1339,17 +1365,17 @@ function createBusinessEntranceBlip(businessId) {
}
if(getBusinessData(businessId).entranceBlipModel != -1) {
let blipModelId = getGameConfig().blipSprites[getServerGame()].business;
let blipModelId = getGameConfig().blipSprites[getServerGame()].Business;
if(getServerData().businesses[businessId].entranceBlipModel != 0) {
blipModelId = getBusinessData(businessId).entranceBlipModel;
}
logToConsole(LOG_VERBOSE, `[VRR.Job]: Creating entrance blip for business ${getBusinessData(businessId).name} (model ${blipModelId})`);
getBusinessData(businessId).entranceBlip = createGameBlip(getBusinessData(businessId).entrancePosition, blipModelId, 1, getColourByName("businessBlue"));
setElementOnAllDimensions(getBusinessData(businessId).entranceBlip, false);
setElementDimension(getBusinessData(businessId).entranceBlip, getBusinessData(businessId).entranceDimension);
setElementStreamInDistance(getBusinessData(businessId).entranceBlip, getGlobalConfig().businessBlipStreamInDistance);
setElementStreamOutDistance(getBusinessData(businessId).entranceBlip, getGlobalConfig().businessBlipStreamOutDistance);
addToWorld(getBusinessData(businessId).entranceBlip);
}
}
@@ -1363,17 +1389,17 @@ function createBusinessExitPickup(businessId) {
if(getBusinessData(businessId).hasInterior) {
if(getBusinessData(businessId).exitPickupModel != -1) {
let pickupModelId = getGameConfig().pickupModels[getServerGame()].exit;
let pickupModelId = getGameConfig().pickupModels[getServerGame()].Exit;
if(getServerData().businesses[businessId].exitPickupModel != 0) {
pickupModelId = getBusinessData(businessId).exitPickupModel;
}
logToConsole(LOG_VERBOSE, `[VRR.Job]: Creating exit pickup for business ${getBusinessData(businessId).name} (model ${pickupModelId})`);
getBusinessData(businessId).exitPickup = createGamePickup(pickupModelId, getBusinessData(businessId).exitPosition, getGameConfig().pickupTypes[getServerGame()].business);
setElementDimension(getBusinessData(businessId).exitPickup, getBusinessData(businessId).exitDimension);
setElementOnAllDimensions(getBusinessData(businessId).exitPickup, false);
setElementStreamInDistance(getBusinessData(businessId).exitPickup, getGlobalConfig().businessPickupStreamInDistance);
setElementStreamOutDistance(getBusinessData(businessId).exitPickup, getGlobalConfig().businessPickupStreamOutDistance);
updateBusinessPickupLabelData(businessId);
addToWorld(getBusinessData(businessId).exitPickup);
}
@@ -1389,17 +1415,20 @@ function createBusinessExitBlip(businessId) {
if(getBusinessData(businessId).hasInterior) {
if(getBusinessData(businessId).exitBlipModel != -1) {
let blipModelId = getGameConfig().blipSprites[getServerGame()].business;
let blipModelId = getGameConfig().blipSprites[getServerGame()].Business;
if(getServerData().businesses[businessId].exitBlipModel != 0) {
blipModelId = getBusinessData(businessId).exitBlipModel;
}
logToConsole(LOG_VERBOSE, `[VRR.Job]: Creating exit blip for business ${getBusinessData(businessId).name} (model ${blipModelId})`);
getBusinessData(businessId).exitBlip = createGameBlip(getBusinessData(businessId).exitPosition, blipModelId, 1, getColourByName("businessBlue"));
setElementDimension(getBusinessData(businessId).exitBlip, getBusinessData(businessId).entranceDimension);
setElementOnAllDimensions(getBusinessData(businessId).exitBlip, false);
setElementStreamInDistance(getBusinessData(businessId).exitBlip, getGlobalConfig().businessBlipStreamInDistance);
setElementStreamOutDistance(getBusinessData(businessId).exitBlip, getGlobalConfig().businessBlipStreamOutDistance);
//getBusinessData(businessId).exitBlip.interior = getBusinessData(businessId).exitInterior;
//setEntityData(getBusinessData(businessId).exitBlip, "vrr.owner.type", VRR_BLIP_BUSINESS_EXIT, false);
//setEntityData(getBusinessData(businessId).exitBlip, "vrr.owner.id", businessId, false);
addToWorld(getBusinessData(businessId).exitBlip);
}
}
@@ -1421,8 +1450,8 @@ function deleteBusiness(businessId, deletedBy = 0) {
disconnectFromDatabase(dbConnection);
}
deleteAllBusinessBlips(businessId);
deleteAllBusinessPickups(businessId);
deleteBusinessBlips(businessId);
deleteBusinessPickups(businessId);
removePlayersFromBusiness(businessId);
@@ -1457,8 +1486,8 @@ function exitBusiness(client) {
let businessId = getPlayerBusiness(client);
if(isPlayerSpawned(client)) {
setPlayerInterior(client, getServerData().businesses[businessId].entranceInterior);
setPlayerDimension(client, client, getServerData().businesses[businessId].entranceDimension);
setPlayerPosition(client, client, getServerData().businesses[businessId].entrancePosition);
setPlayerDimension(client, getServerData().businesses[businessId].entranceDimension);
setPlayerPosition(client, getServerData().businesses[businessId].entrancePosition);
}
}
@@ -1486,6 +1515,10 @@ function getBusinessOwnerTypeText(ownerType) {
// ===========================================================================
/**
* @param {number} businessId - The data index of the business
* @return {BusinessData} The business's data (class instance)
*/
function getBusinessData(businessId) {
if(typeof getServerData().businesses[businessId] != null) {
return getServerData().businesses[businessId];
@@ -1561,6 +1594,8 @@ function reloadAllBusinessesCommand(command, params, client) {
getServerData().businesses = loadBusinessesFromDatabase();
createAllBusinessPickups();
createAllBusinessBlips();
setAllBusinessIndexes();
cacheAllBusinessItems();
messageAdminAction(`All businesses have been reloaded by an admin!`);
}
@@ -1612,10 +1647,8 @@ function buyFromBusinessCommand(command, params, client) {
return false;
}
let splitParams = params.split(" ");
if(!getBusinessData(businessId)) {
messagePlayerError(client, "Business not found!");
messagePlayerError(client, getLocaleString(client, "InvalidBusiness"));
return false;
}
@@ -1627,15 +1660,15 @@ function buyFromBusinessCommand(command, params, client) {
if(getBusinessData(businessId).hasInterior) {
if(!getPlayerBusiness(client)) {
if(!doesPlayerHaveKeyBindsDisabled(client) && doesPlayerHaveKeyBindForCommand(client, "enter")) {
messagePlayerTip(client, `You need to enter the business first! Press {ALTCOLOUR}${toUpperCase(getKeyNameFromId(getPlayerKeyBindForCommand(client, "enter")).key)} {MAINCOLOUR}to enter and exit a business`);
messagePlayerTip(client, getLocaleString(client, "NeedToEnterPropertyKeyPress", "business", `{ALTCOLOUR}${toUpperCase(getKeyNameFromId(getPlayerKeyBindForCommand(client, "enter")).key)}{MAINCOLOUR}`));
} else {
messagePlayerNormal(client, `You need to enter the business first! Use /enter to enter and exit a business`);
messagePlayerNormal(client, getLocaleString(client, "NeedToEnterBusinessCommand", "business", "{ALTCOLOUR}/enter{MAINCOLOUR}"));
}
return false;
}
}
let itemSlot = toInteger(splitParams[0]) || 1;
let itemSlot = toInteger(getParam(params, " ", 1)) || 1;
if(typeof getBusinessData(businessId).floorItemCache[itemSlot-1] == "undefined") {
messagePlayerError(client, `Item slot ${itemSlot} doesn't exist!`);
@@ -1649,9 +1682,9 @@ function buyFromBusinessCommand(command, params, client) {
let amount = 1;
if(areThereEnoughParams(params, 2, " ")) {
amount = toInteger(splitParams[1]) || 1;
amount = toInteger(getParam(params, " ", 2)) || 1;
if(amount <= 0) {
messagePlayerError(client, "The amount must be more than 0!");
messagePlayerError(client, getLocaleString(client, "AmountMustBeMoreThan", "0"));
return false;
}
}
@@ -1663,17 +1696,15 @@ function buyFromBusinessCommand(command, params, client) {
let firstSlot = getPlayerFirstEmptyHotBarSlot(client);
if(firstSlot == -1) {
messagePlayerError(client, `You don't have any space to carry this (full inventory)!`);
messagePlayerError(client, messagePlayerError(client, getLocaleString(client, "InventoryFullCantCarry")));
return false;
}
let totalCost = getItemData(getBusinessData(businessId).floorItemCache[itemSlot-1]).buyPrice*amount;
let individualCost = getItemData(getBusinessData(businessId).floorItemCache[itemSlot-1]).buyPrice;
let itemName = getItemTypeData(getItemData(getBusinessData(businessId).floorItemCache[itemSlot-1]).itemTypeIndex).name;
let priceEach = (amount > 1) ? `($${individualCost} each)` : ``;
if(getPlayerCurrentSubAccount(client).cash < totalCost) {
messagePlayerError(client, `You don't have enough money! You need {ALTCOLOUR}${getBusinessData(businessId).floorItemCache[itemSlot-1].buyPrice*amount-getPlayerCurrentSubAccount(client).cash} {MAINCOLOUR}more!`);
messagePlayerError(client, getLocaleString(client, "NotEnoughCashNeedAmountMore", `{ALTCOLOUR}${getBusinessData(businessId).floorItemCache[itemSlot-1].buyPrice*amount-getPlayerCurrentSubAccount(client).cash}{MAINCOLOUR}`));
return false;
}
@@ -1688,9 +1719,9 @@ function buyFromBusinessCommand(command, params, client) {
}
let useType = getItemTypeData(getItemData(getBusinessData(businessId).floorItemCache[itemSlot-1]).itemTypeIndex).useType;
if(useType == VRR_ITEM_USETYPE_WEAPON || VRR_ITEM_USETYPE_TAZER) {
if(useType == VRR_ITEM_USETYPE_WEAPON || VRR_ITEM_USETYPE_TAZER || useType == VRR_ITEM_USETYPE_AMMO_CLIP) {
if(isPlayerWeaponBanned(client) && !isPlayerExemptFromAntiCheat(client)) {
messagePlayerError(client, `You are not allowed to buy weapons`);
messagePlayerError(client, getLocaleString(client, "WeaponBanned"));
return false;
}
}
@@ -1700,24 +1731,23 @@ function buyFromBusinessCommand(command, params, client) {
if(!doesPlayerHaveKeyBindsDisabled(client) && doesPlayerHaveKeyBindForCommand("inv")) {
let keyData = getPlayerKeyBindForCommand("inv");
messagePlayerNewbieTip(client, `Press ${getKeyNameFromId(keyData.key)} to see your items.`);
messagePlayerNewbieTip(client, getLocaleString(client, "ViewInventoryKeyPressTip"), `{ALTCOLOUR}${getKeyNameFromId(keyData.key)}{MAINCOLOUR}`);
} else {
messagePlayerNewbieTip(client, `Use /inv to see your items.`);
messagePlayerNewbieTip(client, getLocaleString(client, "ViewInventoryKeyPressTip"), `{ALTCOLOUR}/inv{MAINCOLOUR}`);
}
}
// ===========================================================================
function setBusinessItemSellPriceCommand(command, params, client) {
let splitParams = params.split(" ");
let businessId = getBusinessFromParams(splitParams[2]) || getPlayerBusiness(client);
let businessId = getBusinessFromParams(getParam(params, " ", 3)) || getPlayerBusiness(client);
if(!getBusinessData(businessId)) {
messagePlayerError(client, "Business not found!");
messagePlayerError(client, getLocaleString(client, "InvalidBusiness"));
return false;
}
let itemSlot = toInteger(splitParams[0]) || 0;
let itemSlot = toInteger(getParam(params, " ", 1)) || 0;
if(typeof getBusinessData(businessId).floorItemCache[itemSlot-1] == "undefined") {
messagePlayerError(client, `Item slot ${itemSlot-1} doesn't exist!`);
@@ -1730,7 +1760,7 @@ function setBusinessItemSellPriceCommand(command, params, client) {
}
let oldPrice = getBusinessData(businessId).floorItemCache[itemSlot-1].buyPrice;
let newPrice = toInteger(splitParams[1]) || oldPrice;
let newPrice = toInteger(getParam(params, " ", 2)) || oldPrice;
if(newPrice < 0) {
messagePlayerError(client, "The price can't be negative!");
return false;
@@ -1744,15 +1774,14 @@ function setBusinessItemSellPriceCommand(command, params, client) {
// ===========================================================================
function storeItemInBusinessStorageCommand(command, params, client) {
let splitParams = params.split(" ");
let businessId = getBusinessFromParams(splitParams[2]) || getPlayerBusiness(client);
let businessId = getBusinessFromParams(getParam(params, " ", 3)) || getPlayerBusiness(client);
if(!getBusinessData(businessId)) {
messagePlayerError(client, "Business not found!");
messagePlayerError(client, getLocaleString(client, "InvalidBusiness"));
return false;
}
let itemSlot = toInteger(splitParams[0]) || 0;
let itemSlot = toInteger(getParam(params, " ", 1)) || 0;
if(typeof getBusinessData(businessId).floorItemCache[itemSlot-1] == "undefined") {
messagePlayerError(client, `Item slot ${itemSlot} doesn't exist!`);
@@ -1780,15 +1809,14 @@ function storeItemInBusinessStorageCommand(command, params, client) {
// ===========================================================================
function stockItemOnBusinessFloorCommand(command, params, client) {
let splitParams = params.split(" ");
let businessId = getPlayerBusiness(client);
if(!getBusinessData(businessId)) {
messagePlayerError(client, "Business not found!");
messagePlayerError(client, getLocaleString(client, "InvalidBusiness"));
return false;
}
let itemSlot = toInteger(splitParams[0]) || 0;
let itemSlot = toInteger(getParam(params, " ", 1)) || 0;
if(typeof getBusinessData(businessId).storageItemCache[itemSlot-1] == "undefined") {
messagePlayerError(client, `Item slot ${itemSlot} doesn't exist!`);
@@ -1850,8 +1878,8 @@ function cacheAllBusinessItems() {
// ===========================================================================
function cacheBusinessItems(businessId) {
getBusinessData(businessId).floorItemCache = [];
getBusinessData(businessId).storageItemCache = [];
getBusinessData(businessId).floorItemCache.splice(0, getBusinessData(businessId).floorItemCache.length);
getBusinessData(businessId).storageItemCache.splice(0, getBusinessData(businessId).storageItemCache.length);
logToConsole(LOG_VERBOSE, `[VRR.Business] Caching business items for business ${businessId} (${getBusinessData(businessId).name}) ...`);
for(let i in getServerData().items) {
@@ -2123,3 +2151,35 @@ function deleteBusinessPickups(business) {
// ===========================================================================
function getBusinessFromParams(params) {
if(isNaN(params)) {
for(let i in getServerData().businesses) {
if(toLowerCase(getServerData().businesses[i].name).indexOf(toLowerCase(params)) != -1) {
return i;
}
}
} else {
if(typeof getServerData().businesses[params] != "undefined") {
return toInteger(params);
}
}
return false;
}
// ===========================================================================
function deleteAllBusinessBlips() {
for(let i in getServerData().businesses) {
deleteBusinessBlips(i);
}
}
// ===========================================================================
function deleteAllBusinessPickups() {
for(let i in getServerData().businesses) {
deleteBusinessPickups(i);
}
}
// ===========================================================================

View File

@@ -13,6 +13,43 @@ function initChatScript() {
return true;
}
function processPlayerChat(client, messageText) {
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(!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);
/*
let clients = getClients();
for(let i in clients) {
let translatedText;
translatedText = await translateMessage(messageText, getPlayerData(client).locale, getPlayerData(clients[i]).locale);
let original = (getPlayerData(client).locale == getPlayerData(clients[i]).locale) ? `` : ` {ALTCOLOUR}(${messageText})`;
messagePlayerNormal(clients[i], `💬 ${getCharacterFullName(client)}: [#FFFFFF]${translatedText}${original}`, clients[i], getColourByName("mediumGrey"));
}
*/
messagePlayerNormal(null, `💬 ${getCharacterFullName(client)}: ${messageText}`);
messageDiscordChatChannel(`💬 ${getCharacterFullName(client)}: ${messageText}`);
}
// ===========================================================================
function meActionCommand(command, params, client) {
@@ -152,8 +189,10 @@ function clanChatCommand(command, params, client) {
function talkToNearbyPlayers(client, messageText) {
let clients = getClients();
for(let i in clients) {
if(hasBitFlag(getPlayerData(clients[i]).accountData.flags.moderation, getModerationFlagValue("CanHearEverything")) || (getDistance(getPlayerPosition(client), getPlayerPosition(clients[i])) <= getGlobalConfig().talkDistance && getPlayerDimension(client) == getPlayerDimension(clients[i]))) {
messagePlayerTalk(clients[i], client, messageText);
if(isPlayerSpawned(clients[i])) {
if(hasBitFlag(getPlayerData(clients[i]).accountData.flags.moderation, getModerationFlagValue("CanHearEverything")) || (getDistance(getPlayerPosition(client), getPlayerPosition(clients[i])) <= getGlobalConfig().talkDistance && getPlayerDimension(client) == getPlayerDimension(clients[i]))) {
messagePlayerTalk(clients[i], client, messageText);
}
}
}
}
@@ -163,8 +202,10 @@ function talkToNearbyPlayers(client, messageText) {
function phoneOutgoingToNearbyPlayers(client, messageText) {
let clients = getClients();
for(let i in clients) {
if(hasBitFlag(getPlayerData(clients[i]).accountData.flags.moderation, getModerationFlagValue("CanHearEverything")) || (getDistance(getPlayerPosition(client), getPlayerPosition(clients[i])) <= getGlobalConfig().talkDistance && getPlayerDimension(client) == getPlayerDimension(clients[i]))) {
messagePlayerNormal(`[#CCCCCC]${getCharacterFullName(client)} {ALTCOLOUR}(to phone): {MAINCOLOUR}${messageText}`);
if(isPlayerSpawned(clients[i])) {
if(hasBitFlag(getPlayerData(clients[i]).accountData.flags.moderation, getModerationFlagValue("CanHearEverything")) || (getDistance(getPlayerPosition(client), getPlayerPosition(clients[i])) <= getGlobalConfig().talkDistance && getPlayerDimension(client) == getPlayerDimension(clients[i]))) {
messagePlayerNormal(`[#CCCCCC]${getCharacterFullName(client)} {ALTCOLOUR}(to phone): {MAINCOLOUR}${messageText}`);
}
}
}
}
@@ -174,8 +215,10 @@ function phoneOutgoingToNearbyPlayers(client, messageText) {
function phoneIncomingToNearbyPlayers(client, messageText) {
let clients = getClients();
for(let i in clients) {
if(hasBitFlag(getPlayerData(clients[i]).accountData.flags.moderation, getModerationFlagValue("CanHearEverything")) || (getDistance(getPlayerPosition(client), getPlayerPosition(clients[i])) <= getGlobalConfig().phoneSpeakerDistance && getPlayerDimension(client) == getPlayerDimension(clients[i]))) {
messagePlayerNormal(`[#CCCCCC]${getCharacterFullName(client)} {ALTCOLOUR}(from phone): {MAINCOLOUR}${messageText}`);
if(isPlayerSpawned(clients[i])) {
if(hasBitFlag(getPlayerData(clients[i]).accountData.flags.moderation, getModerationFlagValue("CanHearEverything")) || (getDistance(getPlayerPosition(client), getPlayerPosition(clients[i])) <= getGlobalConfig().phoneSpeakerDistance && getPlayerDimension(client) == getPlayerDimension(clients[i]))) {
messagePlayerNormal(`[#CCCCCC]${getCharacterFullName(client)} {ALTCOLOUR}(from phone): {MAINCOLOUR}${messageText}`);
}
}
}
}
@@ -185,8 +228,10 @@ function phoneIncomingToNearbyPlayers(client, messageText) {
function whisperToNearbyPlayers(client, messageText) {
let clients = getClients();
for(let i in clients) {
if(hasBitFlag(getPlayerData(clients[i]).accountData.flags.moderation, getModerationFlagValue("CanHearEverything")) || (getDistance(getPlayerPosition(client), getPlayerPosition(clients[i])) <= getGlobalConfig().whisperDistance && getPlayerDimension(client) == getPlayerDimension(clients[i]))) {
messagePlayerWhisper(clients[i], client, messageText);
if(isPlayerSpawned(clients[i])) {
if(hasBitFlag(getPlayerData(clients[i]).accountData.flags.moderation, getModerationFlagValue("CanHearEverything")) || (getDistance(getPlayerPosition(client), getPlayerPosition(clients[i])) <= getGlobalConfig().whisperDistance && getPlayerDimension(client) == getPlayerDimension(clients[i]))) {
messagePlayerWhisper(clients[i], client, messageText);
}
}
}
}
@@ -196,19 +241,23 @@ function whisperToNearbyPlayers(client, messageText) {
function shoutToNearbyPlayers(client, messageText) {
let clients = getClients();
for(let i in clients) {
if(hasBitFlag(getPlayerData(clients[i]).accountData.flags.moderation, getModerationFlagValue("CanHearEverything")) || (getDistance(getPlayerPosition(client), getPlayerPosition(clients[i])) <= getGlobalConfig().shoutDistance && getPlayerDimension(client) == getPlayerDimension(clients[i]))) {
messagePlayerShout(clients[i], client, messageText);
if(isPlayerSpawned(clients[i])) {
if(hasBitFlag(getPlayerData(clients[i]).accountData.flags.moderation, getModerationFlagValue("CanHearEverything")) || (getDistance(getPlayerPosition(client), getPlayerPosition(clients[i])) <= getGlobalConfig().shoutDistance && getPlayerDimension(client) == getPlayerDimension(clients[i]))) {
messagePlayerShout(clients[i], client, messageText);
}
}
}
}
// ===========================================================================
function megaphoneToNearbyPlayers(client, messageText) {
function megaPhoneToNearbyPlayers(client, messageText) {
let clients = getClients();
for(let i in clients) {
if(hasBitFlag(getPlayerData(clients[i]).accountData.flags.moderation, getModerationFlagValue("CanHearEverything")) || (getDistance(getPlayerPosition(client), getPlayerPosition(clients[i])) <= getGlobalConfig().megaphoneDistance && getPlayerDimension(client) == getPlayerDimension(clients[i]))) {
messagePlayerShout(clients[i], client, messageText);
if(isPlayerSpawned(clients[i])) {
if(hasBitFlag(getPlayerData(clients[i]).accountData.flags.moderation, getModerationFlagValue("CanHearEverything")) || (getDistance(getPlayerPosition(client), getPlayerPosition(clients[i])) <= getGlobalConfig().megaphoneDistance && getPlayerDimension(client) == getPlayerDimension(clients[i]))) {
messagePlayerMegaPhone(clients[i], client, messageText);
}
}
}
}
@@ -218,8 +267,10 @@ function megaphoneToNearbyPlayers(client, messageText) {
function doActionToNearbyPlayers(client, messageText) {
let clients = getClients();
for(let i in clients) {
if(hasBitFlag(getPlayerData(clients[i]).accountData.flags.moderation, getModerationFlagValue("CanHearEverything")) || (getDistance(getPlayerPosition(client), getPlayerPosition(clients[i])) <= getGlobalConfig().doActionDistance && getPlayerDimension(client) == getPlayerDimension(clients[i]))) {
messagePlayerDoAction(clients[i], client, messageText);
if(isPlayerSpawned(clients[i])) {
if(hasBitFlag(getPlayerData(clients[i]).accountData.flags.moderation, getModerationFlagValue("CanHearEverything")) || (getDistance(getPlayerPosition(client), getPlayerPosition(clients[i])) <= getGlobalConfig().doActionDistance && getPlayerDimension(client) == getPlayerDimension(clients[i]))) {
messagePlayerDoAction(clients[i], client, messageText);
}
}
}
}
@@ -229,8 +280,10 @@ function doActionToNearbyPlayers(client, messageText) {
function meActionToNearbyPlayers(client, messageText) {
let clients = getClients();
for(let i in clients) {
if(hasBitFlag(getPlayerData(clients[i]).accountData.flags.moderation, getModerationFlagValue("CanHearEverything")) || (getDistance(getPlayerPosition(client), getPlayerPosition(clients[i])) <= getGlobalConfig().meActionDistance && getPlayerDimension(client) == getPlayerDimension(clients[i]))) {
messagePlayerMeAction(clients[i], client, messageText);
if(isPlayerSpawned(clients[i])) {
if(hasBitFlag(getPlayerData(clients[i]).accountData.flags.moderation, getModerationFlagValue("CanHearEverything")) || (getDistance(getPlayerPosition(client), getPlayerPosition(clients[i])) <= getGlobalConfig().meActionDistance && getPlayerDimension(client) == getPlayerDimension(clients[i]))) {
messagePlayerMeAction(clients[i], client, messageText);
}
}
}
}
@@ -240,8 +293,10 @@ function meActionToNearbyPlayers(client, messageText) {
function clanChat(client, messageText) {
let clients = getClients();
for(let i in clients) {
if(hasBitFlag(getPlayerData(clients[i]).accountData.flags.moderation, getModerationFlagValue("CanHearEverything")) || arePlayersInSameClan(client, clients[i])) {
messagePlayerClanChat(clients[i], client, messageText);
if(isPlayerSpawned(clients[i])) {
if(hasBitFlag(getPlayerData(clients[i]).accountData.flags.moderation, getModerationFlagValue("CanHearEverything")) || arePlayersInSameClan(client, clients[i])) {
messagePlayerClanChat(clients[i], client, messageText);
}
}
}
}

View File

@@ -163,7 +163,7 @@ function listClanRanksCommand(command, params, client) {
}
if(!getClanData(clanId)) {
messagePlayerError(client, "Clan not found!");
messagePlayerError(client, getLocaleString(client, "InvalidClan"));
return false;
}
@@ -207,7 +207,7 @@ function deleteClanCommand(command, params, client) {
let clanId = getClanFromParams(params);
if(!getClanData(clanId)) {
messagePlayerError(client, "Clan not found!");
messagePlayerError(client, getLocaleString(client, "InvalidClan"));
return false;
}
@@ -228,17 +228,16 @@ function setClanOwnerCommand(command, params, client) {
return false;
}
let splitParams = params.split(" ");
let clanId = getClanFromParams(splitParams[0]);
let targetClient = getPlayerFromParams(splitParams[1]);
let clanId = getClanFromParams(getParam(params, " ", 1));
let targetClient = getPlayerFromParams(getParam(params, " ", 2));
if(!targetClient) {
messagePlayerError(client, "Player not found!");
messagePlayerError(client, getLocaleString(client, "InvalidPlayer"));
return false;
}
if(!getClanData(clanId)) {
messagePlayerError(client, "Clan not found!");
messagePlayerError(client, getLocaleString(client, "InvalidClan"));
return false;
}
@@ -265,7 +264,7 @@ function setClanTagCommand(command, params, client) {
let clanId = getPlayerClan(client);
if(!getClanData(clanId)) {
messagePlayerError(client, "Clan not found!");
messagePlayerError(client, getLocaleString(client, "InvalidClan"));
return false;
}
@@ -290,7 +289,7 @@ function setClanNameCommand(command, params, client) {
let clanId = getPlayerClan(client);
if(!getClanData(clanId)) {
messagePlayerError(client, "Clan not found!");
messagePlayerError(client, getLocaleString(client, "InvalidClan"));
return false;
}
@@ -315,13 +314,12 @@ function createClanRankCommand(command, params, client) {
let clanId = getPlayerClan(client);
if(!getClanData(clanId)) {
messagePlayerError(client, "Clan not found!");
messagePlayerError(client, getLocaleString(client, "InvalidClan"));
return false;
}
let splitParams = params.split(" ");
let rankId = toInteger(splitParams[0]);
let rankName = splitParams[1];
let rankId = toInteger(getParam(params, " ", 1));
let rankName = getParam(params, " ", 2);
let rankIndex = createClanRank(clanId, rankId, rankName);
@@ -345,7 +343,7 @@ function deleteClanRankCommand(command, params, client) {
let clanId = getPlayerClan(client);
if(!getClanData(clanId)) {
messagePlayerError(client, "Clan not found!");
messagePlayerError(client, getLocaleString(client, "InvalidClan"));
return false;
}
@@ -353,7 +351,7 @@ function deleteClanRankCommand(command, params, client) {
let tempRankName = getClanRankData(clanId, rankId);
if(!getClanRankData(clanId, rankId)) {
messagePlayerError(client, "Clan rank not found!");
messagePlayerError(client, getLocaleString(client, "ClanRankInvalid"));
return false;
}
@@ -375,11 +373,10 @@ function setClanMemberTagCommand(command, params, client) {
return false;
}
let splitParams = params.split(" ");
let targetClient = getPlayerFromParams(splitParams[0]);
let targetClient = getPlayerFromParams(getParam(params, " ", 1));
if(!targetClient) {
messagePlayerError(client, "Player not found!");
messagePlayerError(client, getLocaleString(client, "InvalidPlayer"));
return false;
}
@@ -402,10 +399,10 @@ function setClanMemberTagCommand(command, params, client) {
}
}
getPlayerCurrentSubAccount(targetClient).ClanTag = splitParams[1];
getPlayerCurrentSubAccount(targetClient).ClanTag = getParam(params, " ", 2);
messagePlayerSuccess(client, `You set {ALTCOLOUR}${getCharacterFullName(targetClient)}'s {MAINCOLOUR}clan tag to {ALTCOLOUR}${splitParams[1]}`);
messagePlayerAlert(client, `{ALTCOLOUR}${getCharacterFullName(targetClient)} {MAINCOLOUR}set your clan tag to {ALTCOLOUR}${splitParams[1]}`);
messagePlayerSuccess(client, `You set {ALTCOLOUR}${getCharacterFullName(targetClient)}'s {MAINCOLOUR}clan tag to {ALTCOLOUR}${getParam(params, " ", 2)}`);
messagePlayerAlert(client, `{ALTCOLOUR}${getCharacterFullName(targetClient)} {MAINCOLOUR}set your clan tag to {ALTCOLOUR}${getParam(params, " ", 2)}`);
}
// ===========================================================================
@@ -425,7 +422,7 @@ function setClanRankTagCommand(command, params, client) {
let newTag = splitParams[splitParams.length-1];
if(!getClanRankData(clanId, rankId)) {
messagePlayerError(client, "Clan rank not found!");
messagePlayerError(client, getLocaleString(client, "ClanRankInvalid"));
return false;
}
@@ -452,11 +449,10 @@ function setClanRankLevelCommand(command, params, client) {
return false;
}
let splitParams = params.split(" ");
let clanId = getPlayerClan(client);
if(!getClanData(clanId)) {
messagePlayerError(client, "Clan not found!");
messagePlayerError(client, getLocaleString(client, "InvalidClan"));
return false;
}
@@ -464,7 +460,7 @@ function setClanRankLevelCommand(command, params, client) {
let newLevel = splitParams[splitParams.length-1];
if(!getClanRankData(clanId, rankId)) {
messagePlayerError(client, "Clan rank not found!");
messagePlayerError(client, getLocaleString(client, "ClanRankInvalid"));
return false;
}
@@ -504,15 +500,14 @@ function addClanMemberFlagCommand(command, params, client) {
let clanId = getPlayerClan(client);
if(!getClanData(clanId)) {
messagePlayerError(client, "Clan not found!");
messagePlayerError(client, getLocaleString(client, "InvalidClan"));
return false;
}
let splitParams = params.split(" ");
let targetClient = getPlayerFromParams(splitParams[0]);
let targetClient = getPlayerFromParams(getParam(params, " ", 1));
if(!targetClient) {
messagePlayerError(client, "Player not found!");
messagePlayerError(client, getLocaleString(client, "InvalidPlayer"));
return false;
}
@@ -535,9 +530,9 @@ function addClanMemberFlagCommand(command, params, client) {
}
}
let flagValue = getClanFlagValue(splitParams[1]);
let flagValue = getClanFlagValue(getParam(params, " ", 2));
getPlayerCurrentSubAccount(client).clanFlags = getPlayerCurrentSubAccount(client).clanFlags | flagValue;
messagePlayerSuccess(client, `You added the {ALTCOLOUR}${splitParams[1]} {MAINCOLOUR}clan flag to {ALTCOLOUR}${getCharacterFullName(client)}`);
messagePlayerSuccess(client, `You added the {ALTCOLOUR}${getParam(params, " ", 2)} {MAINCOLOUR}clan flag to {ALTCOLOUR}${getCharacterFullName(client)}`);
}
// ===========================================================================
@@ -556,15 +551,14 @@ function removeClanMemberFlagCommand(command, params, client) {
let clanId = getPlayerClan(client);
if(!getClanData(clanId)) {
messagePlayerError(client, "Clan not found!");
messagePlayerError(client, getLocaleString(client, "InvalidClan"));
return false;
}
let splitParams = params.split(" ");
let targetClient = getPlayerFromParams(splitParams[0]);
let targetClient = getPlayerFromParams(getParam(params, " ", 1));
if(!targetClient) {
messagePlayerError(client, "Player not found!");
messagePlayerError(client, getLocaleString(client, "InvalidPlayer"));
return false;
}
@@ -587,9 +581,9 @@ function removeClanMemberFlagCommand(command, params, client) {
}
}
let flagValue = getClanFlagValue(splitParams[1]);
let flagValue = getClanFlagValue(getParam(params, " ", 2));
getPlayerCurrentSubAccount(client).clanFlags = getPlayerCurrentSubAccount(client).clanFlags & ~flagValue;
messagePlayerSuccess(client, `You removed the {ALTCOLOUR}${splitParams[1]} {MAINCOLOUR}clan flag from {ALTCOLOUR}${getCharacterFullName(client)}`);
messagePlayerSuccess(client, `You removed the {ALTCOLOUR}${getParam(params, " ", 2)} {MAINCOLOUR}clan flag from {ALTCOLOUR}${getCharacterFullName(client)}`);
}
// ===========================================================================
@@ -608,27 +602,26 @@ function addClanRankFlagCommand(command, params, client) {
let clanId = getPlayerClan(client);
if(!getClanData(clanId)) {
messagePlayerError(client, "Clan not found!");
messagePlayerError(client, getLocaleString(client, "InvalidClan"));
return false;
}
let splitParams = params.split(" ");
let rankId = getClanRankFromParams(clanId, splitParams[0]);
let rankId = getClanRankFromParams(clanId, getParam(params, " ", 1));
if(!getClanRankData(clanId, rankId)) {
messagePlayerError(client, "Clan rank not found!");
messagePlayerError(client, getLocaleString(client, "ClanRankInvalid"));
return false;
}
if(!getClanFlagValue(splitParams[1])) {
if(!getClanFlagValue(getParam(params, " ", 2))) {
messagePlayerError(client, "Clan flag not found!");
return false;
}
let flagValue = getClanFlagValue(splitParams[1]);
let flagValue = getClanFlagValue(getParam(params, " ", 2));
addBitFlag(getClanRankData(clanId, rankId).flags, flagValue);
messagePlayerSuccess(client, `You added the {ALTCOLOUR}${splitParams[1]} {MAINCOLOUR}clan flag to rank {ALTCOLOUR}${getClanRankData(clanId, rankId).name}`);
messagePlayerSuccess(client, `You added the {ALTCOLOUR}${getParam(params, " ", 2)} {MAINCOLOUR}clan flag to rank {ALTCOLOUR}${getClanRankData(clanId, rankId).name}`);
}
// ===========================================================================
@@ -647,27 +640,26 @@ function removeClanRankFlagCommand(command, params, client) {
let clanId = getPlayerClan(client);
if(!getClanData(clanId)) {
messagePlayerError(client, "Clan not found!");
messagePlayerError(client, getLocaleString(client, "InvalidClan"));
return false;
}
let splitParams = params.split(" ");
let rankId = getClanRankFromParams(clanId, splitParams[0]);
let rankId = getClanRankFromParams(clanId, getParam(params, " ", 1));
if(!getClanRankData(clanId, rankId)) {
messagePlayerError(client, "Clan rank not found!");
messagePlayerError(client, getLocaleString(client, "ClanRankInvalid"));
return false;
}
if(!getClanFlagValue(splitParams[1])) {
if(!getClanFlagValue(getParam(params, " ", 2))) {
messagePlayerError(client, "Clan flag not found!");
return false;
}
let flagValue = getClanFlagValue(splitParams[1]);
let flagValue = getClanFlagValue(getParam(params, " ", 2));
removeBitFlag(getClanRankData(clanId, rankId).flags, flagValue);
messagePlayerSuccess(client, `You removed the {ALTCOLOUR}${splitParams[1]} {MAINCOLOUR}clan flag from rank {ALTCOLOUR}${getClanRankData(clanId, rankId).name}`);
messagePlayerSuccess(client, `You removed the {ALTCOLOUR}${getParam(params, " ", 2)} {MAINCOLOUR}clan flag from rank {ALTCOLOUR}${getClanRankData(clanId, rankId).name}`);
}
// ===========================================================================
@@ -686,15 +678,14 @@ function showClanRankFlagsCommand(command, params, client) {
let clanId = getPlayerClan(client);
if(!getClanData(clanId)) {
messagePlayerError(client, "Clan not found!");
messagePlayerError(client, getLocaleString(client, "InvalidClan"));
return false;
}
let splitParams = params.split(" ");
let rankId = getClanRankFromParams(clanId, splitParams[0]);
let rankId = getClanRankFromParams(clanId, getParam(params, " ", 1));
if(!getClanRankData(clanId, rankId)) {
messagePlayerError(client, "Clan rank not found!");
messagePlayerError(client, getLocaleString(client, "ClanRankInvalid"));
return false;
}
@@ -734,15 +725,14 @@ function setClanMemberTitleCommand(command, params, client) {
let clanId = getPlayerClan(client);
if(!getClanData(clanId)) {
messagePlayerError(client, "Clan not found!");
messagePlayerError(client, getLocaleString(client, "InvalidClan"));
return false;
}
let splitParams = params.split(" ");
let targetClient = getPlayerFromParams(splitParams[0]);
let targetClient = getPlayerFromParams(getParam(params, " ", 1));
if(!targetClient) {
messagePlayerError(client, "Player not found!");
messagePlayerError(client, getLocaleString(client, "InvalidPlayer"));
return false;
}
@@ -761,7 +751,7 @@ function setClanMemberTitleCommand(command, params, client) {
}
let oldMemberTitle = getPlayerCurrentSubAccount(client).clanTitle;
getPlayerCurrentSubAccount(client).clanTitle = splitParams[1];
getPlayerCurrentSubAccount(client).clanTitle = getParam(params, " ", 2);
messagePlayerSuccess(client, `You changed the name of {ALTCOLOUR}${getCharacterFullName(client)} {MAINCOLOUR}from {ALTCOLOUR}${oldMemberTitle} {MAINCOLOUR}to {ALTCOLOUR}${params}`);
}
@@ -781,20 +771,19 @@ function setClanRankTitleCommand(command, params, client) {
let clanId = getPlayerClan(client);
if(!getClanData(clanId)) {
messagePlayerError(client, "Clan not found!");
messagePlayerError(client, getLocaleString(client, "InvalidClan"));
return false;
}
let splitParams = params.split(" ");
let rankId = getClanRankFromParams(clanId, splitParams[0]);
let rankId = getClanRankFromParams(clanId, getParam(params, " ", 1));
if(!getClanRankData(clanId, rankId)) {
messagePlayerError(client, "Clan rank not found!");
messagePlayerError(client, getLocaleString(client, "ClanRankInvalid"));
return false;
}
let oldRankName = getClanRankData(clanId, rankId).name;
getClanRankData(clanId, rankId).name = splitParams[1];
getClanRankData(clanId, rankId).name = getParam(params, " ", 2);
messagePlayerSuccess(client, `You changed the name of rank ${rankId} from {ALTCOLOUR}${oldRankName} {MAINCOLOUR}to {ALTCOLOUR}${params}`);
}
@@ -814,21 +803,20 @@ function setClanMemberRankCommand(command, params, client) {
let clanId = getPlayerClan(client);
if(!getClanData(clanId)) {
messagePlayerError(client, "Clan not found!");
messagePlayerError(client, getLocaleString(client, "InvalidClan"));
return false;
}
let splitParams = params.split(" ");
let targetClient = getPlayerFromParams(splitParams[0]);
let rankId = getClanRankFromParams(clanId, splitParams[1]);
let targetClient = getPlayerFromParams(getParam(params, " ", 1));
let rankId = getClanRankFromParams(clanId, getParam(params, " ", 2));
if(!targetClient) {
messagePlayerError(client, "Player not found!");
messagePlayerError(client, getLocaleString(client, "InvalidPlayer"));
return false;
}
if(!getClanRankData(clanId, rankId)) {
messagePlayerError(client, "Clan rank not found!");
messagePlayerError(client, getLocaleString(client, "ClanRankInvalid"));
return false;
}
@@ -899,6 +887,10 @@ function deleteClan(clanId) {
// ===========================================================================
/**
* @param {number} clanId - The data index of the clan
* @return {ClanData} The clan's data (class instance)
*/
function getClanData(clanId) {
if(typeof getServerData().clans[clanId] != null) {
return getServerData().clans[clanId];
@@ -956,6 +948,10 @@ function saveClanToDatabase(clanId) {
return false;
}
if(!tempClanData.needsSaved) {
return false;
}
let dbConnection = connectToDatabase();
if(dbConnection) {
if(tempClanData.needsSaved) {
@@ -998,40 +994,41 @@ function saveClanToDatabase(clanId) {
function saveClanRankToDatabase(clanId, rankId) {
let tempClanRankData = getClanRankData(clanId, rankId);
if(!tempClanRankData.needsSaved) {
return false;
}
let dbConnection = connectToDatabase();
if(dbConnection) {
if(tempClanRankData.needsSaved) {
let safeName = escapeDatabaseString(dbConnection, tempClanRankData.name);
let safeTag = escapeDatabaseString(dbConnection, tempClanRankData.customTag);
//let safeTitle = escapeDatabaseString(dbConnection, tempClanRankData.name);
let safeName = escapeDatabaseString(dbConnection, tempClanRankData.name);
let safeTag = escapeDatabaseString(dbConnection, tempClanRankData.customTag);
//let safeTitle = escapeDatabaseString(dbConnection, tempClanRankData.name);
let data = [
["clan_rank_name", safeName],
["clan_rank_clan", tempClanRankData.clan],
["clan_rank_custom_tag", safeTag],
//["clan_rank_title", safeTitle],
["clan_rank_flags", tempClanRankData.flags],
["clan_rank_level", tempClanRankData.level],
["clan_rank_enabled", boolToInt(tempClanRankData.enabled)],
];
let data = [
["clan_rank_name", safeName],
["clan_rank_clan", tempClanRankData.clan],
["clan_rank_custom_tag", safeTag],
//["clan_rank_title", safeTitle],
["clan_rank_flags", tempClanRankData.flags],
["clan_rank_level", tempClanRankData.level],
["clan_rank_enabled", boolToInt(tempClanRankData.enabled)],
];
let dbQuery = null;
if(tempClanRankData.databaseId == 0) {
let queryString = createDatabaseInsertQuery("clan_rank", data);
dbQuery = queryDatabase(dbConnection, queryString);
getClanRankData(clanId, rankId).databaseId = getDatabaseInsertId(dbConnection);
getClanRankData(clanId, rankId).needsSaved = false;
} else {
let queryString = createDatabaseUpdateQuery("clan_rank", data, `clan_rank_id=${tempClanRankData.databaseId} LIMIT 1`);
dbQuery = queryDatabase(dbConnection, queryString);
getClanRankData(clanId, rankId).needsSaved = false;
}
freeDatabaseQuery(dbQuery);
disconnectFromDatabase(dbConnection);
return true;
}
let dbQuery = null;
if(tempClanRankData.databaseId == 0) {
let queryString = createDatabaseInsertQuery("clan_rank", data);
dbQuery = queryDatabase(dbConnection, queryString);
getClanRankData(clanId, rankId).databaseId = getDatabaseInsertId(dbConnection);
getClanRankData(clanId, rankId).needsSaved = false;
} else {
let queryString = createDatabaseUpdateQuery("clan_rank", data, `clan_rank_id=${tempClanRankData.databaseId} LIMIT 1`);
dbQuery = queryDatabase(dbConnection, queryString);
getClanRankData(clanId, rankId).needsSaved = false;
}
freeDatabaseQuery(dbQuery);
disconnectFromDatabase(dbConnection);
return true;
}
return false;
@@ -1189,15 +1186,14 @@ function showClanFlagListCommand(command, params, client) {
let clanId = getPlayerClan(client);
if(!getClanData(clanId)) {
messagePlayerError(client, "Clan not found!");
messagePlayerError(client, getLocaleString(client, "InvalidClan"));
return false;
}
let splitParams = params.split(" ");
let rankId = getClanRankFromParams(clanId, splitParams[0]);
let rankId = getClanRankFromParams(clanId, getParam(params, " ", 1));
if(!getClanRankData(clanId, rankId)) {
messagePlayerError(client, "Clan rank not found!");
messagePlayerError(client, getLocaleString(client, "ClanRankInvalid"));
return false;
}
@@ -1215,4 +1211,42 @@ function showClanFlagListCommand(command, params, client) {
messagePlayerInfo(client, chunkedList[i].join(", "));
}
}
*/
*/
function getClanFromParams(params) {
if(isNaN(params)) {
for(let i in getServerData().clans) {
if(toLowerCase(getServerData().clans[i].name).indexOf(toLowerCase(params)) != -1) {
return i;
}
}
} else {
if(typeof getServerData().clans[params] != "undefined") {
return toInteger(params);
}
}
return false;
}
// ===========================================================================
function getClanRankFromParams(clanId, params) {
if(isNaN(params)) {
for(let i in getClanData(clanId).ranks) {
if((toLowerCase(getClanData(clanId).ranks[i].name).indexOf(toLowerCase(params)) != -1)) {
return i;
}
}
} else {
for(let i in getClanData(clanId).ranks) {
if(getClanData(clanId).ranks[i].level == toInteger(params)) {
return i;
}
}
}
return false;
}
// ===========================================================================

View File

@@ -22,8 +22,6 @@ function initClassScript() {
class ServerData {
constructor(dbAssoc = false) {
this.databaseId = 0;
this.name = "";
this.password = "";
this.needsSaved = false;
this.newCharacter = {
@@ -59,6 +57,8 @@ class ServerData {
this.guiTextColourSecondary = [0, 0, 0];
this.showLogo = true;
this.inflationMultiplier = 1;
this.testerOnly = false;
this.settings = 0;
this.antiCheat = {
enabled: false,
@@ -104,52 +104,47 @@ class ServerData {
bank: dbAssoc["svr_newchar_bank"],
skin: dbAssoc["svr_newchar_skin"],
},
this.settings = toInteger(dbAssoc["svr_settings"]);
this.connectCameraPosition = toVector3(dbAssoc["svr_connectcam_pos_x"], dbAssoc["svr_connectcam_pos_y"], dbAssoc["svr_connectcam_pos_z"]);
this.connectCameraLookAt = toVector3(dbAssoc["svr_connectcam_lookat_x"], dbAssoc["svr_connectcam_lookat_y"], dbAssoc["svr_connectcam_lookat_z"]);
//this.characterSelectCameraPosition = toVector3(dbAssoc["svr_charselect_cam_pos_x"], dbAssoc["svr_charselect_cam_pos_y"], dbAssoc["svr_charselect_cam_pos_z"]);
//this.characterSelectCameraLookAt = toVector3(dbAssoc["svr_charselect_cam_lookat_x"], dbAssoc["svr_charselect_cam_lookat_y"], dbAssoc["svr_charselect_cam_lookat_z"]);
//this.characterSelectPedPosition = toVector3(dbAssoc["svr_charselect_ped_pos_x"], dbAssoc["svr_charselect_ped_pos_y"], dbAssoc["svr_charselect_ped_pos_z"]);
//this.characterSelectPedHeading = toFloat(dbAssoc["svr_charselect_ped_rot_z"]);
//this.characterSelectInterior = toInteger(dbAssoc["svr_charselect_int"]);
//this.characterSelectDimension = toInteger(dbAssoc["svr_charselect_int"]);
this.hour = toInteger(dbAssoc["svr_start_time_hour"]);
this.minute = toInteger(dbAssoc["svr_start_time_min"]);
this.minuteDuration = toInteger(dbAssoc["svr_time_min_duration"]);
this.weather = toInteger(dbAssoc["svr_start_weather"]);
this.fallingSnow = intToBool(dbAssoc["svr_start_snow_falling"]);
this.groundSnow = intToBool(dbAssoc["svr_start_snow_ground"]);
this.useGUI = intToBool(dbAssoc["svr_gui"]);
this.fallingSnow = hasBitFlag(this.settings, getServerSettingsFlagValue("FallingSnow"));
this.groundSnow = hasBitFlag(this.settings, getServerSettingsFlagValue("GroundSnow"));
this.useGUI = hasBitFlag(this.settings, getServerSettingsFlagValue("GUI"));
this.guiColourPrimary = [toInteger(dbAssoc["svr_gui_col1_r"]), toInteger(dbAssoc["svr_gui_col1_g"]), toInteger(dbAssoc["svr_gui_col1_b"])];
this.guiColourSecondary = [toInteger(dbAssoc["svr_gui_col2_r"]), toInteger(dbAssoc["svr_gui_col2_g"]), toInteger(dbAssoc["svr_gui_col2_b"])];
this.guiTextColourPrimary = [toInteger(dbAssoc["svr_gui_textcol1_r"]), toInteger(dbAssoc["svr_gui_textcol1_g"]), toInteger(dbAssoc["svr_gui_textcol1_b"])];
//this.guiTextColourSecondary = [toInteger(dbAssoc["svr_gui_textcol2_r"]), toInteger(dbAssoc["svr_gui_textcol2_g"]), toInteger(dbAssoc["svr_gui_textcol2_b"])];
this.showLogo = intToBool(dbAssoc["svr_logo"]);
this.showLogo = hasBitFlag(this.settings, getServerSettingsFlagValue("Logo"));
this.inflationMultiplier = toFloat(dbAssoc["svr_inflation_multiplier"]);
this.testerOnly = hasBitFlag(this.settings, getServerSettingsFlagValue("Testing"));
this.antiCheat = {
enabled: intToBool(dbAssoc["svr_ac_enabled"]),
checkGameScripts: intToBool(dbAssoc["svr_ac_check_scripts"]),
gameScriptBlackListEnabled: intToBool(dbAssoc["svr_ac_script_bl"]),
gameScriptWhiteListEnabled: intToBool(dbAssoc["svr_ac_script_wl"]),
enabled: hasBitFlag(this.settings, getServerSettingsFlagValue("Anticheat")),
checkGameScripts: hasBitFlag(this.settings, getServerSettingsFlagValue("CheckGameScripts")),
gameScriptBlackListEnabled: hasBitFlag(this.settings, getServerSettingsFlagValue("GameScriptBlackList")),
gameScriptWhiteListEnabled: hasBitFlag(this.settings, getServerSettingsFlagValue("GameScriptWhiteList")),
gameScriptWhiteList: [],
gameScriptBlackList: [],
};
this.discordBotToken = intToBool(dbAssoc["svr_discord_bot_token"]);
this.discordEnabled = intToBool(dbAssoc["svr_discord_bot_enabled"]);
this.discordEnabled = hasBitFlag(this.settings, getServerSettingsFlagValue("DiscordBot"));
this.createJobPickups = intToBool(dbAssoc["svr_job_pickups"]);
this.createBusinessPickups = intToBool(dbAssoc["svr_biz_pickups"]);
this.createHousePickups = intToBool(dbAssoc["svr_house_pickups"]);
this.createJobBlips = intToBool(dbAssoc["svr_job_blips"]);
this.createBusinessBlips = intToBool(dbAssoc["svr_biz_blips"]);
this.createHouseBlips = intToBool(dbAssoc["svr_house_blips"]);
this.createJobPickups = hasBitFlag(this.settings, getServerSettingsFlagValue("JobPickups"));
this.createBusinessPickups = hasBitFlag(this.settings, getServerSettingsFlagValue("BusinessPickups"));
this.createHousePickups = hasBitFlag(this.settings, getServerSettingsFlagValue("HousePickups"));
this.createJobBlips = hasBitFlag(this.settings, getServerSettingsFlagValue("JobBlips"));
this.createBusinessBlips = hasBitFlag(this.settings, getServerSettingsFlagValue("BusinessBlips"));
this.createHouseBlips = hasBitFlag(this.settings, getServerSettingsFlagValue("HouseBlips"));
this.introMusicURL = dbAssoc["svr_intro_music"];
this.useRealTime = intToBool(dbAssoc["svr_time_realtime_enabled"]);
this.useRealTime = hasBitFlag(this.settings, getServerSettingsFlagValue("RealTime"));
this.realTimeZone = dbAssoc["svr_time_realtime_timezone"];
this.discordConfig = {
@@ -178,10 +173,10 @@ class ClientData {
this.connectTime = 0;
this.clientVersion = "0.0.0";
this.loginAttemptsRemaining = 3;
this.afk = false;
this.jobRoute = false;
this.jobRouteStop = false;
this.jobRouteIsland = false;
this.jobRoute = -1;
this.jobRouteLocation = -1;
this.jobRouteVehicle = false;
this.spawned = false;
@@ -247,10 +242,27 @@ class ClientData {
this.returnToType = VRR_RETURNTO_TYPE_NONE;
this.changingCharacterName = false;
this.currentPickup = false;
this.usingSkinSelect = false;
this.keyBinds = [];
this.sessionId = 0;
this.incomingDamageMultiplier = 1;
this.weaponDamageEvent = VRR_WEAPON_DAMAGE_EVENT_NORMAL;
this.currentAnimation = -1;
this.currentAnimationPositionOffset = false;
this.currentAnimationPositionReturnTo = false;
this.animationStart = 0;
this.animationForced = false;
this.passwordResetState = VRR_RESETPASS_STATE_NONE;
this.passwordResetCode = "";
this.lastJobVehicle = null;
this.health = 100;
this.locale = 0;
this.enteringVehicle = null;
}
};
@@ -276,7 +288,6 @@ class AccountData {
this.notes = [];
this.messages = [];
this.keyBinds = [];
this.contacts = [];
this.subAccounts = [];
@@ -286,6 +297,7 @@ class AccountData {
this.chatScrollLines = 1;
this.streamingRadioVolume = 20;
this.locale = 0;
if(dbAssoc) {
this.databaseId = dbAssoc["acct_id"];
@@ -306,7 +318,6 @@ class AccountData {
this.notes = [];
this.messages = [];
this.keyBinds = [];
this.contacts = [];
this.subAccounts = [];
@@ -314,6 +325,7 @@ class AccountData {
this.twoFactorAuthVerificationCode = dbAssoc["acct_code_2fa"];
this.chatScrollLines = toInteger(dbAssoc["acct_svr_chat_scroll_lines"]);
this.streamingRadioVolume = toInteger(dbAssoc["acct_streaming_radio_volume"]);
this.locale = toInteger(dbAssoc["acct_locale"]);
}
}
};
@@ -420,7 +432,6 @@ class SubAccountData {
this.clanTitle = 0;
this.isWorking = false;
this.jobUniform = this.skin;
this.lastJobVehicle = null;
this.job = 0;
this.jobRank = 0;
this.weapons = [];
@@ -893,10 +904,6 @@ class VehicleData {
this.colour2IsRGBA = 0;
this.colour3IsRGBA = 0;
this.colour4IsRGBA = 0;
this.colour1RGBA = toColour(255, 255, 255, 255);
this.colour2RGBA = toColour(255, 255, 255, 255);
this.colour3RGBA = toColour(255, 255, 255, 255);
this.colour4RGBA = toColour(255, 255, 255, 255);
this.colour1 = (vehicle) ? vehicle.colour1 : 1;
this.colour2 = (vehicle) ? vehicle.colour2 : 1;
this.colour3 = (vehicle) ? vehicle.colour3 : 1;
@@ -944,7 +951,7 @@ class VehicleData {
this.interior = 0;
this.dimension = 0;
this.respawnTime = 0;
this.lastActiveTime = false;
if(dbAssoc) {
// General Info
@@ -968,10 +975,6 @@ class VehicleData {
this.colour2IsRGBA = intToBool(toInteger(dbAssoc["veh_col2_isrgba"]));
this.colour3IsRGBA = intToBool(toInteger(dbAssoc["veh_col3_isrgba"]));
this.colour4IsRGBA = intToBool(toInteger(dbAssoc["veh_col4_isrgba"]));
this.colour1RGBA = toColour(toInteger(dbAssoc["veh_col1_r"]), toInteger(dbAssoc["veh_col1_g"]), toInteger(dbAssoc["veh_col1_b"]), toInteger(dbAssoc["veh_col1_a"]));
this.colour2RGBA = toColour(toInteger(dbAssoc["veh_col2_r"]), toInteger(dbAssoc["veh_col2_g"]), toInteger(dbAssoc["veh_col2_b"]), toInteger(dbAssoc["veh_col2_a"]));
this.colour3RGBA = toColour(toInteger(dbAssoc["veh_col3_r"]), toInteger(dbAssoc["veh_col3_g"]), toInteger(dbAssoc["veh_col3_b"]), toInteger(dbAssoc["veh_col3_a"]));
this.colour4RGBA = toColour(toInteger(dbAssoc["veh_col4_r"]), toInteger(dbAssoc["veh_col4_g"]), toInteger(dbAssoc["veh_col4_b"]), toInteger(dbAssoc["veh_col4_a"]));
this.colour1 = toInteger(dbAssoc["veh_col1"]);
this.colour2 = toInteger(dbAssoc["veh_col2"]);
this.colour3 = toInteger(dbAssoc["veh_col3"]);
@@ -1085,6 +1088,7 @@ class JobData {
this.locations = [];
this.whiteList = [];
this.blackList = [];
this.routes = [];
if(dbAssoc) {
this.databaseId = dbAssoc["job_id"];
@@ -1104,6 +1108,7 @@ class JobData {
this.locations = [];
this.whiteList = [];
this.blackList = [];
this.routes = [];
}
}
};
@@ -1229,7 +1234,7 @@ class JobUniformData {
class JobLocationData {
constructor(dbAssoc = false) {
this.databaseId = 0;
this.job = 0;
this.jobId = 0;
this.position = toVector3(0.0, 0.0, 0.0);
this.blip = false;
this.pickup = false;
@@ -1239,10 +1244,11 @@ class JobLocationData {
this.index = -1;
this.jobIndex = -1;
this.needsSaved = false;
this.routeCache = [];
if(dbAssoc) {
this.databaseId = dbAssoc["job_loc_id"];
this.job = dbAssoc["job_loc_job"];
this.jobId = dbAssoc["job_loc_job"];
this.position = toVector3(dbAssoc["job_loc_pos_x"], dbAssoc["job_loc_pos_y"], dbAssoc["job_loc_pos_z"]);
this.blip = false;
this.pickup = false;
@@ -1445,6 +1451,20 @@ class ItemTypeData {
this.takeDelay = 0;
this.giveDelay = 0;
this.dropDelay = 0;
this.useAnimationName = "";
this.dropAnimationName = "";
this.pickupAnimationName = "";
this.giveAnimationName = "";
this.putAnimationName = "";
this.takeAnimationName = "";
this.switchAnimationName = "";
this.useAnimationIndex = false;
this.dropAnimationIndex = false;
this.pickupAnimationIndex = false;
this.giveAnimationIndex = false;
this.putAnimationIndex = false;
this.takeAnimationIndex = false;
this.switchAnimationIndex = false;
if(dbAssoc) {
this.databaseId = toInteger(dbAssoc["item_type_id"]);
@@ -1475,6 +1495,13 @@ class ItemTypeData {
this.takeDelay = toInteger(dbAssoc["item_type_delay_take"]);
this.giveDelay = toInteger(dbAssoc["item_type_delay_give"]);
this.dropDelay = toInteger(dbAssoc["item_type_delay_drop"]);
this.useAnimationName = toInteger(dbAssoc["item_type_anim_use"]);
this.switchAnimationName = toInteger(dbAssoc["item_type_anim_switch"]);
this.pickupAnimationName = toInteger(dbAssoc["item_type_anim_pickup"]);
this.putAnimationName = toInteger(dbAssoc["item_type_anim_put"]);
this.takeAnimationName = toInteger(dbAssoc["item_type_anim_take"]);
this.giveAnimationName = toInteger(dbAssoc["item_type_anim_give"]);
this.dropAnimationName = toInteger(dbAssoc["item_type_anim_drop"]);
}
}
};
@@ -1578,6 +1605,7 @@ class NPCTriggerData {
this.npcId = 0;
this.index = 0;
this.npc = 0;
this.npcIndex = -1;
this.triggerType = 0;
this.conditions = [];
this.responses = [];
@@ -1595,6 +1623,7 @@ class NPCTriggerConditionData {
this.databaseId = 0;
this.triggerId = 0;
this.index = 0;
this.triggerIndex = 0;
this.conditionType = 0;
this.conditionValue = false;
this.matchType = false;
@@ -1614,6 +1643,7 @@ class NPCTriggerResponseData {
this.databaseId = 0;
this.triggerId = 0;
this.index = 0;
this.triggerIndex = 0;
this.responseType = 0;
this.responseValue = false;
@@ -1672,26 +1702,35 @@ class JobRouteData {
this.databaseId = 0;
this.name = "";
this.jobId = 0;
this.locationId = 0;
this.enabled = false;
this.index = -1;
this.jobIndex = -1;
this.locationIndex = -1;
this.needsSaved = false;
this.pay = 0;
this.vehicleColour1 = toColour(255, 255, 255, 255);
this.vehicleColour2 = toColour(255, 255, 255, 255);
this.vehicleColour1 = 1;
this.vehicleColour2 = 1;
this.detail = 0;
this.startMessage = "";
this.finishMessage = "";
this.locationArriveMessage = "";
this.locationNextMessage = "";
this.locations = [];
if(dbAssoc) {
this.databaseId = toInteger(dbAssoc["job_route_id"]);
this.name = toString(dbAssoc["job_route_name"]);
this.jobId = toInteger(dbAssoc["job_route_job"]);
this.locationId = toInteger(dbAssoc["job_route_job_loc"]);
this.enabled = intToBool(toInteger(dbAssoc["job_route_enabled"]));
this.pay = toInteger(dbAssoc["job_route_pay"]);
this.startMessage = toString(dbAssoc["job_route_start_msg"]);
this.finishMessage = toString(dbAssoc["job_route_finish_msg"]);
this.colour1 = toColour(toInteger(dbAssoc["job_route_col1_r"]), toInteger(dbAssoc["job_route_col1_g"]), toInteger(dbAssoc["job_route_col1_b"]), 255);
this.colour2 = toColour(toInteger(dbAssoc["job_route_col2_r"]), toInteger(dbAssoc["job_route_col2_g"]), toInteger(dbAssoc["job_route_col2_b"]), 255);
this.locationArriveMessage = toString(dbAssoc["job_route_loc_arrive_msg"]);
this.locationNextMessage = toString(dbAssoc["job_route_loc_next_msg"]);
this.vehicleColour1 = toInteger(dbAssoc["job_route_veh_colour1"]);
this.vehicleColour2 = toInteger(dbAssoc["job_route_veh_colour2"]);
this.detail = toInteger(dbAssoc["job_route_detail"]);
}
}
@@ -1704,12 +1743,12 @@ class JobRouteLocationData {
this.routeId = 0;
this.enabled = false;
this.index = -1;
this.jobIndex = -1;
this.routeIndex = -1;
this.needsSaved = false;
this.position = toVector3(0.0, 0.0, 0.0);
this.stopDelay = 0;
this.pay = 0;
this.previousStop = 0;
if(dbAssoc) {
this.databaseId = toInteger(dbAssoc["job_route_loc_id"]);
@@ -1719,7 +1758,6 @@ class JobRouteLocationData {
this.position = toVector3(toFloat(dbAssoc["job_route_loc_x"]), toFloat(dbAssoc["job_route_loc_y"]), toFloat(dbAssoc["job_route_loc_z"]));
this.stopDelay = toInteger(dbAssoc["job_route_loc_delay"]);
this.pay = toInteger(dbAssoc["job_route_loc_pay"]);
this.previousStop = toInteger(dbAssoc["job_route_loc_prev"]);
}
}
};

View File

@@ -19,65 +19,68 @@ function addAllNetworkHandlers() {
logToConsole(LOG_DEBUG, "[VRR.Client]: Adding network handlers ...");
// KeyBind
addNetworkHandler("vrr.useKeyBind", playerUsedKeyBind);
addNetworkEventHandler("vrr.useKeyBind", playerUsedKeyBind);
// GUI
addNetworkHandler("vrr.promptAnswerNo", playerPromptAnswerNo);
addNetworkHandler("vrr.promptAnswerYes", playerPromptAnswerYes);
addNetworkEventHandler("vrr.promptAnswerNo", playerPromptAnswerNo);
addNetworkEventHandler("vrr.promptAnswerYes", playerPromptAnswerYes);
addNetworkEventHandler("vrr.toggleGUI", playerToggledGUI);
addNetworkEventHandler("vrr.2fa", checkPlayerTwoFactorAuthentication);
// AFK
addNetworkHandler("vrr.afk", playerChangeAFKState);
addNetworkEventHandler("vrr.afk", playerChangeAFKState);
// Event
addNetworkHandler("vrr.pickup", onPlayerNearPickup);
addNetworkHandler("vrr.enteredSphere", onPlayerEnteredSphere);
addNetworkHandler("vrr.exitedSphere", onPlayerExitedSphere);
addNetworkHandler("vrr.playerDeath", onPlayerDeath);
addNetworkHandler("vrr.onPlayerEnterVehicle", onPlayerEnteredVehicle);
addNetworkHandler("vrr.onPlayerExitVehicle", onPlayerExitedVehicle);
addNetworkEventHandler("vrr.pickup", onPlayerNearPickup);
addNetworkEventHandler("vrr.enteredSphere", onPlayerEnteredSphere);
addNetworkEventHandler("vrr.exitedSphere", onPlayerExitedSphere);
addNetworkEventHandler("vrr.playerDeath", onPlayerDeath);
addNetworkEventHandler("vrr.onPlayerEnterVehicle", onPlayerEnteredVehicle);
addNetworkEventHandler("vrr.onPlayerExitVehicle", onPlayerExitedVehicle);
// Job
addNetworkHandler("vrr.arrivedAtJobRouteStop", playerArrivedAtJobRouteStop);
addNetworkEventHandler("vrr.arrivedAtJobRouteLocation", playerArrivedAtJobRouteLocation);
// Client
addNetworkHandler("vrr.clientReady", playerClientReady);
addNetworkHandler("vrr.guiReady", playerGUIReady);
addNetworkHandler("vrr.clientStarted", playerClientStarted);
addNetworkHandler("vrr.clientStopped", playerClientStopped);
addNetworkEventHandler("vrr.clientReady", playerClientReady);
addNetworkEventHandler("vrr.guiReady", playerGUIReady);
addNetworkEventHandler("vrr.clientStarted", playerClientStarted);
addNetworkEventHandler("vrr.clientStopped", playerClientStopped);
// Account
addNetworkHandler("vrr.checkLogin", checkLogin);
addNetworkHandler("vrr.checkRegistration", checkRegistration);
addNetworkEventHandler("vrr.checkLogin", checkLogin);
addNetworkEventHandler("vrr.checkRegistration", checkRegistration);
addNetworkEventHandler("vrr.checkResetPassword", checkAccountResetPasswordRequest);
addNetworkEventHandler("vrr.checkChangePassword", checkAccountChangePassword);
// Developer
addNetworkHandler("vrr.runCodeSuccess", clientRunCodeSuccess);
addNetworkHandler("vrr.runCodeFail", clientRunCodeFail);
addNetworkEventHandler("vrr.runCodeSuccess", clientRunCodeSuccess);
addNetworkEventHandler("vrr.runCodeFail", clientRunCodeFail);
// SubAccount
addNetworkHandler("vrr.checkNewCharacter", checkNewCharacter);
addNetworkHandler("vrr.nextCharacter", checkNextCharacter);
addNetworkHandler("vrr.previousCharacter", checkPreviousCharacter);
addNetworkHandler("vrr.selectCharacter", selectCharacter);
addNetworkEventHandler("vrr.checkNewCharacter", checkNewCharacter);
addNetworkEventHandler("vrr.nextCharacter", checkNextCharacter);
addNetworkEventHandler("vrr.previousCharacter", checkPreviousCharacter);
addNetworkEventHandler("vrr.selectCharacter", selectCharacter);
// Item
addNetworkHandler("vrr.itemActionDelayComplete", playerItemActionDelayComplete);
addNetworkEventHandler("vrr.itemActionDelayComplete", playerItemActionDelayComplete);
addNetworkEventHandler("vrr.weaponDamage", playerDamagedByPlayer);
addNetworkHandler("vrr.weaponDamage", playerDamagedByPlayer);
addNetworkHandler("vrr.player.position", updatePositionInPlayerData);
addNetworkHandler("vrr.player.heading", updateHeadingInPlayerData);
addNetworkHandler("vrr.player.lookat", setPlayerHeadLookPosition);
addNetworkHandler("vrr.skinSelected", playerFinishedSkinSelection);
addNetworkHandler("vrr.clientInfo", updateConnectionLogOnClientInfoReceive);
// Misc
addNetworkEventHandler("vrr.player.position", updatePositionInPlayerData);
addNetworkEventHandler("vrr.player.heading", updateHeadingInPlayerData);
addNetworkEventHandler("vrr.player.lookat", setPlayerHeadLookPosition);
addNetworkEventHandler("vrr.skinSelected", playerFinishedSkinSelection);
addNetworkEventHandler("vrr.clientInfo", updateConnectionLogOnClientInfoReceive);
addNetworkEventHandler("vrr.vehBuyState", receiveVehiclePurchaseStateUpdateFromClient);
}
// ===========================================================================
function updatePlayerNameTag(client) {
//logToConsole(LOG_DEBUG, `[VRR.Client] Sending ${getPlayerDisplayForConsole(client)}'s updated nametag to all players`);
triggerNetworkEvent("vrr.nametag", null, getPlayerName(client), getPlayerNameForNameTag(client), getPlayerColour(client), false, client.ping);
sendNetworkEventToPlayer("vrr.nametag", null, getPlayerName(client), getPlayerNameForNameTag(client), getPlayerColour(client), getPlayerData(client).afk, getPlayerPing(client));
}
// ===========================================================================
@@ -94,7 +97,7 @@ function updateAllPlayerNameTags() {
function updatePlayerPing(client) {
//logToConsole(LOG_DEBUG, `[VRR.Client] Sending ${getPlayerDisplayForConsole(client)}'s ping to all players`);
triggerNetworkEvent("vrr.ping", null, getPlayerName(client), client.ping);
sendNetworkEventToPlayer("vrr.ping", null, getPlayerName(client), client.ping);
}
// ===========================================================================
@@ -135,7 +138,7 @@ function playerClientStopped(client) {
function showGameMessage(client, text, colour, duration) {
logToConsole(LOG_DEBUG, `[VRR.Client] Showing game message to ${getPlayerDisplayForConsole(client)} (${text}) for ${duration} milliseconds`);
triggerNetworkEvent("vrr.smallGameMessage", client, text, colour, duration);
sendNetworkEventToPlayer("vrr.smallGameMessage", client, text, colour, duration);
}
// ===========================================================================
@@ -146,7 +149,7 @@ function enableCityAmbienceForPlayer(client, clearElements = false) {
//}
//logToConsole(LOG_DEBUG, `[VRR.Client] Setting ${getPlayerDisplayForConsole(client)}'s city ambience to ${toUpperCase(getOnOffFromBool(false))}`);
//triggerNetworkEvent("vrr.ambience", client, true);
//sendNetworkEventToPlayer("vrr.ambience", client, true);
}
// ===========================================================================
@@ -157,14 +160,14 @@ function disableCityAmbienceForPlayer(client, clearElements = false) {
//}
//logToConsole(LOG_DEBUG, `[VRR.Client] Setting ${getPlayerDisplayForConsole(client)}'s city ambience to ${toUpperCase(getOnOffFromBool(false))}`);
//triggerNetworkEvent("vrr.ambience", client, false, clearElements);
//sendNetworkEventToPlayer("vrr.ambience", client, false, clearElements);
}
// ===========================================================================
function clearPlayerOwnedPeds(client) {
logToConsole(LOG_DEBUG, `[VRR.Client] Clearing peds owned by ${getPlayerDisplayForConsole(client)}`);
triggerNetworkEvent("vrr.clearPeds", client);
sendNetworkEventToPlayer("vrr.clearPeds", client);
}
// ===========================================================================
@@ -172,41 +175,41 @@ function clearPlayerOwnedPeds(client) {
function updatePlayerSpawnedState(client, state) {
logToConsole(LOG_DEBUG, `[VRR.Client] Setting ${getPlayerDisplayForConsole(client)}'s spawned state ${toUpperCase(getOnOffFromBool(state))}`);
getPlayerData(client).spawned = true;
triggerNetworkEvent("vrr.spawned", client, state);
sendNetworkEventToPlayer("vrr.spawned", client, state);
}
// ===========================================================================
function setPlayerControlState(client, state) {
logToConsole(LOG_DEBUG, `[VRR.Client] Setting ${getPlayerDisplayForConsole(client)}'s control state ${toUpperCase(getOnOffFromBool(state))}`);
triggerNetworkEvent("vrr.control", client, state, !state);
sendNetworkEventToPlayer("vrr.control", client, state, !state);
}
// ===========================================================================
function updatePlayerShowLogoState(client, state) {
logToConsole(LOG_DEBUG, `[VRR.Client] Setting ${getPlayerDisplayForConsole(client)}'s logo state ${toUpperCase(getOnOffFromBool(state))}`);
triggerNetworkEvent("vrr.logo", client, state);
sendNetworkEventToPlayer("vrr.logo", client, state);
}
// ===========================================================================
function restorePlayerCamera(client) {
logToConsole(LOG_DEBUG, `[VRR.Client] Restoring ${getPlayerDisplayForConsole(client)}'s camera`);
triggerNetworkEvent("vrr.restoreCamera", client);
sendNetworkEventToPlayer("vrr.restoreCamera", client);
}
// ===========================================================================
function setPlayer2DRendering(client, hudState = false, labelState = false, smallGameMessageState = false, scoreboardState = false, hotBarState = false, itemActionDelayState = false) {
triggerNetworkEvent("vrr.set2DRendering", client, hudState, labelState, smallGameMessageState, scoreboardState, hotBarState, itemActionDelayState);
sendNetworkEventToPlayer("vrr.set2DRendering", client, hudState, labelState, smallGameMessageState, scoreboardState, hotBarState, itemActionDelayState);
}
// ===========================================================================
function syncPlayerProperties(client) {
logToConsole(LOG_DEBUG, `[VRR.Client] Sending signal to sync ${getPlayerDisplayForConsole(client)}'s player ped properties`);
triggerNetworkEvent("vrr.player.sync", null, client.player);
sendNetworkEventToPlayer("vrr.player.sync", null, client.player);
}
// ===========================================================================
@@ -214,7 +217,7 @@ function syncPlayerProperties(client) {
function updatePlayerSnowState(client) {
if(isSnowSupported(getServerGame())) {
logToConsole(LOG_DEBUG, `[VRR.Client] Setting ${getPlayerDisplayForConsole(client)}'s snow state (Falling: ${toUpperCase(getOnOffFromBool(getServerConfig().fallingSnow))}, Ground: ${toUpperCase(getOnOffFromBool(getServerConfig().groundSnow))})`);
triggerNetworkEvent("vrr.snow", client, getServerConfig().fallingSnow, getServerConfig().groundSnow);
sendNetworkEventToPlayer("vrr.snow", client, getServerConfig().fallingSnow, getServerConfig().groundSnow);
}
}
@@ -224,7 +227,7 @@ function sendExcludedModelsForGroundSnowToPlayer(client) {
if(getGameConfig().excludedGroundSnowModels[getServerGame()].length > 0) {
for(let i in getGameConfig().excludedGroundSnowModels[getServerGame()]) {
logToConsole(LOG_DEBUG, `[VRR.Misc] Sending excluded model ${i} for ground snow to ${getPlayerName(client)}`);
triggerNetworkEvent("vrr.excludeGroundSnow", client, getGameConfig().excludedGroundSnowModels[getServerGame()][i]);
sendNetworkEventToPlayer("vrr.excludeGroundSnow", client, getGameConfig().excludedGroundSnowModels[getServerGame()][i]);
}
}
}
@@ -235,7 +238,7 @@ function sendRemovedWorldObjectsToPlayer(client) {
if(getGameConfig().removedWorldObjects[getServerGame()].length > 0) {
for(let i in getGameConfig().removedWorldObjects[getServerGame()]) {
logToConsole(LOG_DEBUG, `[VRR.Client] Sending removed world object ${i} (${getGameConfig().removedWorldObjects[getServerGame()][i][0]}) to ${getPlayerName(client)}`);
triggerNetworkEvent("vrr.removeWorldObject", client, getGameConfig().removedWorldObjects[getServerGame()][i][0], getGameConfig().removedWorldObjects[getServerGame()][i][1], getGameConfig().removedWorldObjects[getServerGame()][i][2]);
sendNetworkEventToPlayer("vrr.removeWorldObject", client, getGameConfig().removedWorldObjects[getServerGame()][i][0], getGameConfig().removedWorldObjects[getServerGame()][i][1], getGameConfig().removedWorldObjects[getServerGame()][i][2]);
}
}
return true;
@@ -261,273 +264,287 @@ function updatePlayerHotBar(client) {
}
tempHotBarItems.push([i, itemExists, itemImage, itemValue]);
}
triggerNetworkEvent("vrr.hotbar", client, getPlayerData(client).activeHotBarSlot, tempHotBarItems);
sendNetworkEventToPlayer("vrr.hotbar", client, getPlayerData(client).activeHotBarSlot, tempHotBarItems);
}
// ===========================================================================
function setPlayerWeaponDamageEnabled(client, state) {
logToConsole(LOG_DEBUG, `[VRR.Client] Sending weapon damage state for ${getPlayerDisplayForConsole(client)} to all players`);
triggerNetworkEvent("vrr.weaponDamageEnabled", null, getPlayerName(client), state);
sendNetworkEventToPlayer("vrr.weaponDamageEnabled", null, getPlayerName(client), state);
}
// ===========================================================================
function setPlayerWeaponDamageEvent(client, eventType) {
logToConsole(LOG_DEBUG, `[VRR.Client] Sending weapon damage event (${eventType}) for ${getPlayerDisplayForConsole(client)} to all players`);
triggerNetworkEvent("vrr.weaponDamageEvent", null, getPlayerName(client), eventType);
sendNetworkEventToPlayer("vrr.weaponDamageEvent", null, getPlayerName(client), eventType);
getPlayerData(client).weaponDamageEvent = eventType;
}
// ===========================================================================
function sendJobRouteStopToPlayer(client, position, colour) {
function sendJobRouteLocationToPlayer(client, position, colour) {
logToConsole(LOG_DEBUG, `[VRR.Client] Sending job route stop data to ${getPlayerDisplayForConsole(client)}`);
triggerNetworkEvent("vrr.showJobRouteStop", client, position, colour);
sendNetworkEventToPlayer("vrr.showJobRouteLocation", client, position, colour);
}
// ===========================================================================
function showPlayerChangePasswordGUI(client) {
logToConsole(LOG_DEBUG, `[VRR.Client] Sending change password GUI signal to ${getPlayerDisplayForConsole(client)}`);
sendNetworkEventToPlayer("vrr.changePassword", client);
}
// ===========================================================================
function showPlayerLoginSuccessGUI(client) {
logToConsole(LOG_DEBUG, `[VRR.Client] Sending login success GUI signal to ${getPlayerDisplayForConsole(client)}`);
triggerNetworkEvent("vrr.loginSuccess", client);
sendNetworkEventToPlayer("vrr.loginSuccess", client);
}
// ===========================================================================
function showPlayerLoginFailedGUI(client, errorMessage) {
logToConsole(LOG_DEBUG, `[VRR.Client] Sending login failed GUI signal to ${getPlayerDisplayForConsole(client)}`);
triggerNetworkEvent("vrr.loginFailed", client, errorMessage);
sendNetworkEventToPlayer("vrr.loginFailed", client, errorMessage);
}
// ===========================================================================
function showPlayerRegistrationSuccessGUI(client) {
logToConsole(LOG_DEBUG, `[VRR.Client] Sending registration success GUI signal to ${getPlayerDisplayForConsole(client)}`);
triggerNetworkEvent("vrr.registrationSuccess", client);
sendNetworkEventToPlayer("vrr.registrationSuccess", client);
}
// ===========================================================================
function showPlayerRegistrationFailedGUI(client, errorMessage) {
logToConsole(LOG_DEBUG, `[VRR.Client] Sending registration failed GUI signal to ${getPlayerDisplayForConsole(client)}`);
triggerNetworkEvent("vrr.registrationFailed", client, errorMessage);
sendNetworkEventToPlayer("vrr.registrationFailed", client, errorMessage);
}
// ===========================================================================
function sendPlayerGUIColours(client) {
logToConsole(LOG_DEBUG, `[VRR.Client] Sending GUI colours to ${getPlayerDisplayForConsole(client)}`);
triggerNetworkEvent("vrr.guiColour", client, getServerConfig().guiColourPrimary[0], getServerConfig().guiColourPrimary[1], getServerConfig().guiColourPrimary[2], getServerConfig().guiColourSecondary[0], getServerConfig().guiColourSecondary[1], getServerConfig().guiColourSecondary[2], getServerConfig().guiTextColourPrimary[0], getServerConfig().guiTextColourPrimary[1], getServerConfig().guiTextColourPrimary[2]);
sendNetworkEventToPlayer("vrr.guiColour", client, getServerConfig().guiColourPrimary[0], getServerConfig().guiColourPrimary[1], getServerConfig().guiColourPrimary[2], getServerConfig().guiColourSecondary[0], getServerConfig().guiColourSecondary[1], getServerConfig().guiColourSecondary[2], getServerConfig().guiTextColourPrimary[0], getServerConfig().guiTextColourPrimary[1], getServerConfig().guiTextColourPrimary[2]);
}
// ===========================================================================
function sendPlayerGUIInit(client) {
logToConsole(LOG_DEBUG, `[VRR.Client] Sending GUI init signal to ${getPlayerDisplayForConsole(client)}`);
triggerNetworkEvent("vrr.guiInit", client);
sendNetworkEventToPlayer("vrr.guiInit", client);
}
// ===========================================================================
function showPlayerLoginGUI(client, errorMessage = "") {
logToConsole(LOG_DEBUG, `[VRR.Client] Sending show login GUI signal to ${getPlayerDisplayForConsole(client)}`);
triggerNetworkEvent("vrr.showLogin", client);
sendNetworkEventToPlayer("vrr.showLogin", client);
}
// ===========================================================================
function showPlayerRegistrationGUI(client, errorMessage = "") {
logToConsole(LOG_DEBUG, `[VRR.Client] Sending show registration GUI signal to ${getPlayerDisplayForConsole(client)}`);
triggerNetworkEvent("vrr.showRegistration", client);
sendNetworkEventToPlayer("vrr.showRegistration", client);
}
// ===========================================================================
function showPlayerNewCharacterGUI(client) {
logToConsole(LOG_DEBUG, `[VRR.Client] Sending show new character GUI signal to ${getPlayerDisplayForConsole(client)}`);
triggerNetworkEvent("vrr.showNewCharacter", client);
sendNetworkEventToPlayer("vrr.showNewCharacter", client);
}
// ===========================================================================
function showPlayerChangePasswordGUI(client, errorMessage = "") {
logToConsole(LOG_DEBUG, `[VRR.Client] Sending show change password GUI signal to ${getPlayerDisplayForConsole(client)}`);
sendNetworkEventToPlayer("vrr.showChangePassword", client);
}
// ===========================================================================
function showPlayerResetPasswordCodeInputGUI(client) {
logToConsole(LOG_DEBUG, `[VRR.Client] Sending show reset password GUI signal to ${getPlayerDisplayForConsole(client)}`);
sendNetworkEventToPlayer("vrr.showResetPasswordCodeInput", client);
}
// ===========================================================================
function showPlayerCharacterSelectGUI(client, firstName, lastName, cash, clan, lastPlayed, skin) {
logToConsole(LOG_DEBUG, `[VRR.Client] Sending character select GUI signal to ${getPlayerDisplayForConsole(client)}`);
triggerNetworkEvent("vrr.showCharacterSelect", client, firstName, lastName, cash, clan, lastPlayed, skin);
sendNetworkEventToPlayer("vrr.showCharacterSelect", client, firstName, lastName, cash, clan, lastPlayed, skin);
}
// ===========================================================================
function updatePlayerCharacterSelectGUI(client, firstName, lastName, cash, clan, lastPlayed, skin) {
logToConsole(LOG_DEBUG, `[VRR.Client] Sending update character select GUI signal to ${getPlayerDisplayForConsole(client)}`);
triggerNetworkEvent("vrr.switchCharacterSelect", client, firstName, lastName, cash, clan, lastPlayed, skin);
sendNetworkEventToPlayer("vrr.switchCharacterSelect", client, firstName, lastName, cash, clan, lastPlayed, skin);
}
// ===========================================================================
function showPlayerCharacterSelectSuccessGUI(client) {
logToConsole(LOG_DEBUG, `[VRR.Client] Sending character select success GUI signal to ${getPlayerDisplayForConsole(client)}`);
triggerNetworkEvent("vrr.characterSelectSuccess", client);
sendNetworkEventToPlayer("vrr.characterSelectSuccess", client);
}
// ===========================================================================
function showPlayerCharacterSelectFailedGUI(client) {
logToConsole(LOG_DEBUG, `[VRR.Client] Sending character select failed GUI signal to ${getPlayerDisplayForConsole(client)}`);
triggerNetworkEvent("vrr.characterSelectFailed", client);
sendNetworkEventToPlayer("vrr.characterSelectFailed", client);
}
// ===========================================================================
function showPlayerPromptGUI(client, promptMessage, promptTitle) {
function showPlayerPromptGUI(client, promptMessage, promptTitle, yesButtonText, noButtonText) {
logToConsole(LOG_DEBUG, `[VRR.Client] Sending show prompt GUI signal to ${getPlayerDisplayForConsole(client)} (Title: ${promptTitle}, Message: ${promptMessage})`);
triggerNetworkEvent("vrr.showPrompt", client, promptMessage, promptTitle);
sendNetworkEventToPlayer("vrr.showPrompt", client, promptMessage, promptTitle, yesButtonText, noButtonText);
}
// ===========================================================================
function showPlayerInfoGUI(client, infoMessage, infoTitle) {
function showPlayerInfoGUI(client, infoMessage, infoTitle, buttonText = "OK") {
logToConsole(LOG_DEBUG, `[VRR.Client] Sending show info GUI signal to ${getPlayerDisplayForConsole(client)} (Title: ${infoTitle}, Message: ${infoMessage})`);
triggerNetworkEvent("vrr.showInfo", client, infoMessage, infoTitle);
sendNetworkEventToPlayer("vrr.showInfo", client, infoMessage, infoTitle, buttonText);
}
// ===========================================================================
function showPlayerErrorGUI(client, errorMessage, errorTitle) {
function showPlayerErrorGUI(client, errorMessage, errorTitle, buttonText = "OK") {
logToConsole(LOG_DEBUG, `[VRR.Client] Sending show error GUI signal to ${getPlayerDisplayForConsole(client)} (Title: ${errorTitle}, Message: ${errorMessage})`);
triggerNetworkEvent("vrr.showInfo", client, errorMessage, errorTitle);
sendNetworkEventToPlayer("vrr.showInfo", client, errorMessage, errorTitle, buttonText);
}
// ===========================================================================
function sendRunCodeToClient(client, code, returnTo) {
logToConsole(LOG_DEBUG, `[VRR.Client] Sending runcode to ${getPlayerDisplayForConsole(client)} (returnTo: ${getPlayerDisplayForConsole(getClientFromIndex(returnTo))}, Code: ${code})`);
triggerNetworkEvent("vrr.runCode", client, code, returnTo);
sendNetworkEventToPlayer("vrr.runCode", client, code, returnTo);
}
// ===========================================================================
function sendPlayerWorkingState(client, state) {
logToConsole(LOG_DEBUG, `[VRR.Client] Sending working state (${toUpperCase(getYesNoFromBool(state))}) to ${getPlayerDisplayForConsole(client)}`);
triggerNetworkEvent("vrr.working", client, state);
sendNetworkEventToPlayer("vrr.working", client, state);
}
// ===========================================================================
function sendPlayerJobType(client, jobType) {
logToConsole(LOG_DEBUG, `[VRR.Client] Sending job type (${jobType}) to ${getPlayerDisplayForConsole(client)}`);
triggerNetworkEvent("vrr.jobType", client, jobType);
sendNetworkEventToPlayer("vrr.jobType", client, jobType);
}
// ===========================================================================
function sendPlayerStopJobRoute(client) {
logToConsole(LOG_DEBUG, `[VRR.Client] Sending signal to abort job route to ${getPlayerDisplayForConsole(client)}`);
triggerNetworkEvent("vrr.stopJobRoute", client);
sendNetworkEventToPlayer("vrr.hideJobRouteLocation", client);
}
// ===========================================================================
function sendPlayerMouseCameraToggle(client) {
logToConsole(LOG_DEBUG, `[VRR.Client] Sending signal to toggle mouse camera ${getPlayerDisplayForConsole(client)}`);
triggerNetworkEvent("vrr.mouseCamera", client);
sendNetworkEventToPlayer("vrr.mouseCamera", client);
}
// ===========================================================================
function setPlayerMouseCameraState(client, state) {
logToConsole(LOG_DEBUG, `[VRR.Client] Sending signal to toggle mouse camera ${getPlayerDisplayForConsole(client)}`);
triggerNetworkEvent("vrr.mouseCameraForce", client, state);
sendNetworkEventToPlayer("vrr.mouseCameraForce", client, state);
}
// ===========================================================================
function sendPlayerMouseCursorToggle(client) {
logToConsole(LOG_DEBUG, `[VRR.Client] Sending signal to toggle mouse cursor ${getPlayerDisplayForConsole(client)}`);
triggerNetworkEvent("vrr.mouseCursor", client);
sendNetworkEventToPlayer("vrr.mouseCursor", client);
}
// ===========================================================================
function sendAddAccountKeyBindToClient(client, key, keyState) {
logToConsole(LOG_DEBUG, `[VRR.Client] Sending added keybind to ${getPlayerDisplayForConsole(client)} (Key: ${toUpperCase(getKeyNameFromId(key))}, State: ${(keyState) ? "down" : "up"})`);
triggerNetworkEvent("vrr.addKeyBind", client, toInteger(key), (keyState) ? KEYSTATE_DOWN : KEYSTATE_UP);
sendNetworkEventToPlayer("vrr.addKeyBind", client, toInteger(key), (keyState) ? KEYSTATE_DOWN : KEYSTATE_UP);
}
// ===========================================================================
function sendClearKeyBindsToClient(client, key, keyState) {
logToConsole(LOG_DEBUG, `[VRR.Client] Sending added keybind to ${getPlayerDisplayForConsole(client)} (Key: ${toUpperCase(getKeyNameFromId(key))}, State: ${(keyState) ? "down" : "up"})`);
triggerNetworkEvent("vrr.clearKeyBinds", client);
sendNetworkEventToPlayer("vrr.clearKeyBinds", client);
}
// ===========================================================================
function sendRemoveAccountKeyBindToClient(client, key) {
logToConsole(LOG_DEBUG, `[VRR.Client] Sending deleted keybind to ${getPlayerDisplayForConsole(client)} (Key: ${toUpperCase(getKeyNameFromId(key))})`);
triggerNetworkEvent("vrr.delKeyBind", client, toInteger(key));
sendNetworkEventToPlayer("vrr.delKeyBind", client, toInteger(key));
}
// ===========================================================================
function sendPlayerSetPosition(client, position) {
logToConsole(LOG_DEBUG, `[VRR.Client] Sending set position signal to ${getPlayerDisplayForConsole(client)} (Position: ${position.x}, ${position.y}, ${position.z})`);
triggerNetworkEvent("vrr.position", client, position);
sendNetworkEventToPlayer("vrr.position", client, position);
}
// ===========================================================================
function sendPlayerSetHeading(client, heading) {
logToConsole(LOG_DEBUG, `[VRR.Client] Sending set heading signal to ${getPlayerDisplayForConsole(client)} (Heading: ${heading})`);
triggerNetworkEvent("vrr.heading", client, heading);
sendNetworkEventToPlayer("vrr.heading", client, heading);
}
// ===========================================================================
function sendPlayerSetInterior(client, interior) {
logToConsole(LOG_DEBUG, `[VRR.Client] Sending set interior signal to ${getPlayerDisplayForConsole(client)} (Interior: ${interior})`);
triggerNetworkEvent("vrr.interior", client, interior);
sendNetworkEventToPlayer("vrr.interior", client, interior);
}
// ===========================================================================
function sendPlayerFrozenState(client, state) {
logToConsole(LOG_DEBUG, `[VRR.Client] Sending set frozen signal to ${getPlayerDisplayForConsole(client)} (State: ${toUpperCase(getYesNoFromBool(state))})`);
triggerNetworkEvent("vrr.frozen", client, state);
}
// ===========================================================================
function givePlayerWeapon(client, weaponId, ammo, active) {
logToConsole(LOG_DEBUG, `[VRR.Client] Sending signal to ${getPlayerDisplayForConsole(client)} to give weapon (Weapon: ${weaponId}, Ammo: ${ammo})`);
triggerNetworkEvent("vrr.giveWeapon", client, weaponId, ammo, active);
sendNetworkEventToPlayer("vrr.frozen", client, state);
}
// ===========================================================================
function clearPlayerWeapons(client) {
logToConsole(LOG_DEBUG, `[VRR.Client] Sending signal to ${getPlayerDisplayForConsole(client)} to clear weapons`);
triggerNetworkEvent("vrr.clearWeapons", client);
sendNetworkEventToPlayer("vrr.clearWeapons", client);
}
// ===========================================================================
function showPlayerNewCharacterFailedGUI(client, errorMessage) {
logToConsole(LOG_DEBUG, `[VRR.Client] Sending new character failed GUI signal to ${getPlayerDisplayForConsole(client)}`);
triggerNetworkEvent("vrr.newCharacterFailed", client, errorMessage);
sendNetworkEventToPlayer("vrr.newCharacterFailed", client, errorMessage);
}
// ===========================================================================
function sendPlayerRemoveFromVehicle(client) {
logToConsole(LOG_DEBUG, `[VRR.Client] Sending remove from vehicle signal to ${getPlayerDisplayForConsole(client)}`);
triggerNetworkEvent("vrr.removeFromVehicle", client);
sendNetworkEventToPlayer("vrr.removeFromVehicle", client);
}
// ===========================================================================
function sendChatBoxMessageToPlayer(client, message, colour) {
triggerNetworkEvent("vrr.m", client, message, colour)
sendNetworkEventToPlayer("vrr.m", client, message, colour)
//messageClient(message, client, colour);
}
@@ -538,7 +555,7 @@ function showPlayerItemTakeDelay(client, itemId) {
let delay = getItemTypeData(getItemData(itemId).itemTypeIndex).pickupDelay;
if(delay > 0) {
logToConsole(LOG_DEBUG, `[VRR.Client] Showing item TAKE delay to ${getPlayerDisplayForConsole(client)} (${delay} milliseconds)`);
triggerNetworkEvent("vrr.showItemActionDelay", client, delay);
sendNetworkEventToPlayer("vrr.showItemActionDelay", client, delay);
} else {
logToConsole(LOG_DEBUG, `[VRR.Client] Showing item TAKE delay to ${getPlayerDisplayForConsole(client)} (instant)`);
playerItemActionDelayComplete(client);
@@ -553,7 +570,7 @@ function showPlayerItemUseDelay(client, itemSlot) {
let delay = getItemTypeData(getItemData(getPlayerData(client).hotBarItems[itemSlot]).itemTypeIndex).useDelay;
if(delay > 0) {
logToConsole(LOG_DEBUG, `[VRR.Client] Showing item USE delay to ${getPlayerDisplayForConsole(client)} (${delay} milliseconds)`);
triggerNetworkEvent("vrr.showItemActionDelay", client, delay);
sendNetworkEventToPlayer("vrr.showItemActionDelay", client, delay);
} else {
logToConsole(LOG_DEBUG, `[VRR.Client] Showing item USE delay to ${getPlayerDisplayForConsole(client)} (instant)`);
playerItemActionDelayComplete(client);
@@ -568,7 +585,7 @@ function showPlayerItemDropDelay(client, itemSlot) {
let delay = getItemTypeData(getItemData(getPlayerData(client).hotBarItems[itemSlot]).itemTypeIndex).dropDelay;
if(delay > 0) {
logToConsole(LOG_DEBUG, `[VRR.Client] Showing item DROP delay to ${getPlayerDisplayForConsole(client)} (${delay} milliseconds)`);
triggerNetworkEvent("vrr.showItemActionDelay", client, delay);
sendNetworkEventToPlayer("vrr.showItemActionDelay", client, delay);
} else {
logToConsole(LOG_DEBUG, `[VRR.Client] Showing item DROP delay to ${getPlayerDisplayForConsole(client)} (instant)`);
playerItemActionDelayComplete(client);
@@ -583,7 +600,7 @@ function showPlayerItemPickupDelay(client, itemId) {
let delay = getItemTypeData(getItemData(itemId).itemTypeIndex).pickupDelay;
if(delay > 0) {
logToConsole(LOG_DEBUG, `[VRR.Client] Showing item PICKUP delay to ${getPlayerDisplayForConsole(client)} (${delay} milliseconds)`);
triggerNetworkEvent("vrr.showItemActionDelay", client, delay);
sendNetworkEventToPlayer("vrr.showItemActionDelay", client, delay);
} else {
logToConsole(LOG_DEBUG, `[VRR.Client] Showing item PICKUP delay to ${getPlayerDisplayForConsole(client)} (instant)`);
playerItemActionDelayComplete(client);
@@ -598,7 +615,7 @@ function showPlayerItemPutDelay(client, itemSlot) {
let delay = getItemTypeData(getItemData(getPlayerData(client).hotBarItems[itemSlot]).itemTypeIndex).putDelay;
if(delay > 0) {
logToConsole(LOG_DEBUG, `[VRR.Client] Showing item PUT delay to ${getPlayerDisplayForConsole(client)} (${delay} milliseconds)`);
triggerNetworkEvent("vrr.showItemActionDelay", client, delay);
sendNetworkEventToPlayer("vrr.showItemActionDelay", client, delay);
} else {
logToConsole(LOG_DEBUG, `[VRR.Client] Showing item PUT delay to ${getPlayerDisplayForConsole(client)} (instant)`);
playerItemActionDelayComplete(client);
@@ -614,7 +631,7 @@ function showPlayerItemSwitchDelay(client, itemSlot) {
let delay = getItemTypeData(getItemData(getPlayerData(client).hotBarItems[itemSlot]).itemTypeIndex).switchDelay;
if(delay > 0) {
logToConsole(LOG_DEBUG, `[VRR.Client] Showing item switch delay to ${getPlayerDisplayForConsole(client)} (${delay} milliseconds)`);
triggerNetworkEvent("vrr.showItemActionDelay", client, delay);
sendNetworkEventToPlayer("vrr.showItemActionDelay", client, delay);
} else{
logToConsole(LOG_DEBUG, `[VRR.Client] Showing item switch delay to ${getPlayerDisplayForConsole(client)} (instant)`);
playerItemActionDelayComplete(client);
@@ -633,14 +650,14 @@ function showPlayerItemSwitchDelay(client, itemSlot) {
function sendPlayerDrunkEffect(client, amount, duration) {
logToConsole(LOG_DEBUG, `[VRR.Client] Setting drunk effect for ${getPlayerDisplayForConsole(client)} to ${amount} for ${duration} milliseconds`);
triggerNetworkEvent("vrr.drunkEffect", client, amount, duration);
sendNetworkEventToPlayer("vrr.drunkEffect", client, amount, duration);
}
// ===========================================================================
function sendPlayerClearPedState(client) {
logToConsole(LOG_DEBUG, `[VRR.Client] Clearing ped state for ${getPlayerDisplayForConsole(client)}`);
triggerNetworkEvent("vrr.clearPedState", client);
sendNetworkEventToPlayer("vrr.clearPedState", client);
}
// ===========================================================================
@@ -677,9 +694,20 @@ function playerDamagedByPlayer(client, damagerEntityName, weaponId, pedPiece, he
}
break;
case VRR_WEAPON_DAMAGE_EVENT_EXTINGUISH:
break;
case VRR_WEAPON_DAMAGE_EVENT_MACE:
break;
case VRR_WEAPON_DAMAGE_EVENT_NORMAL:
logToConsole(LOG_DEBUG, `[VRR.Client] ${getPlayerDisplayForConsole(client)}'s damager ${getPlayerDisplayForConsole(damagerEntity)} caused ${healthLoss} damage (damage reduction makes it ${(healthLoss*getPlayerData(client).incomingDamageMultiplier)})`);
setPlayerHealth(client, getPlayerHealth(client)-(healthLoss*getPlayerData(client).incomingDamageMultiplier));
break;
default:
getPlayerData(client).health = getPlayerData(client).health-(healthLoss*getPlayerData(client).incomingDamageMultiplier);
setPlayerHealth(client, getPlayerData(client).health);
logToConsole(LOG_DEBUG, `[VRR.Client] ${getPlayerDisplayForConsole(client)}'s damager ${getPlayerDisplayForConsole(damagerEntity)} caused ${healthLoss} damage (damage reduction makes it ${(healthLoss*getPlayerData(client).incomingDamageMultiplier)})`);
setPlayerHealth(client, getPlayerHealth(client)-(healthLoss*getPlayerData(client).incomingDamageMultiplier));
break;
}
}
@@ -687,13 +715,13 @@ function playerDamagedByPlayer(client, damagerEntityName, weaponId, pedPiece, he
// ===========================================================================
function setPlayerCameraLookAt(client, cameraPosition, lookAtPosition) {
triggerNetworkEvent("vrr.cameraLookAt", client, cameraPosition, lookAtPosition);
sendNetworkEventToPlayer("vrr.cameraLookAt", client, cameraPosition, lookAtPosition);
}
// ===========================================================================
function sendTimeMinuteDurationToPlayer(client, minuteDuration) {
triggerNetworkEvent("vrr.minuteDuration", client, minuteDuration);
sendNetworkEventToPlayer("vrr.minuteDuration", client, minuteDuration);
}
// ===========================================================================
@@ -724,13 +752,13 @@ function forcePlayerIntoSkinSelect(client) {
setPlayerDimension(client, client.index+500);
}
triggerNetworkEvent("vrr.skinSelect", client, true);
sendNetworkEventToPlayer("vrr.skinSelect", client, true);
}
// ===========================================================================
function updatePlayerCash(client) {
triggerNetworkEvent("vrr.money", client, getPlayerCurrentSubAccount(client).cash);
sendNetworkEventToPlayer("vrr.money", client, getPlayerCurrentSubAccount(client).cash);
}
// ===========================================================================
@@ -748,7 +776,7 @@ function sendAllPoliceStationBlips(client) {
getColourByName("policeBlue"),
]);
}
triggerNetworkEvent("vrr.blips", client, tempBlips);
sendNetworkEventToPlayer("vrr.blips", client, tempBlips);
}
}
@@ -767,7 +795,7 @@ function sendAllFireStationBlips(client) {
getColourByName("firefighterRed"),
]);
}
triggerNetworkEvent("vrr.blips", client, tempBlips);
sendNetworkEventToPlayer("vrr.blips", client, tempBlips);
}
}
@@ -786,7 +814,7 @@ function sendAllHospitalBlips(client) {
getColourByName("medicPink"),
]);
}
triggerNetworkEvent("vrr.blips", client, tempBlips);
sendNetworkEventToPlayer("vrr.blips", client, tempBlips);
}
}
@@ -805,7 +833,7 @@ function sendAllAmmunationBlips(client) {
0
]);
}
triggerNetworkEvent("vrr.blips", client, tempBlips);
sendNetworkEventToPlayer("vrr.blips", client, tempBlips);
}
}
@@ -824,7 +852,7 @@ function sendAllPayAndSprayBlips(client) {
0
]);
}
triggerNetworkEvent("vrr.blips", client, tempBlips);
sendNetworkEventToPlayer("vrr.blips", client, tempBlips);
}
}
@@ -843,27 +871,27 @@ function sendAllFuelStationBlips(client) {
getColourByName("burntOrange"),
]);
}
triggerNetworkEvent("vrr.blips", client, tempBlips);
sendNetworkEventToPlayer("vrr.blips", client, tempBlips);
}
}
// ===========================================================================
function sendPlayerSetHealth(client, health) {
triggerNetworkEvent("vrr.health", client, health);
sendNetworkEventToPlayer("vrr.health", client, health);
}
// ===========================================================================
function sendPlayerSetArmour(client, armour) {
triggerNetworkEvent("vrr.armour", client, armour);
sendNetworkEventToPlayer("vrr.armour", client, armour);
}
// ===========================================================================
function playerFinishedSkinSelection(client, allowedSkinIndex) {
triggerNetworkEvent("vrr.skinSelect", client, false);
sendNetworkEventToPlayer("vrr.skinSelect", client, false);
if(allowedSkinIndex == -1) {
messagePlayerAlert(client, "You canceled the skin change.");
restorePlayerCamera(client);
@@ -902,6 +930,7 @@ function playerFinishedSkinSelection(client, allowedSkinIndex) {
}
restorePlayerCamera(client);
setPlayerControlState(client, true);
deleteItem(getPlayerData(client).itemActionItem);
switchPlayerActiveHotBarSlot(client, -1);
@@ -914,28 +943,28 @@ function playerFinishedSkinSelection(client, allowedSkinIndex) {
// ===========================================================================
function sendPlayerChatScrollLines(client, amount) {
triggerNetworkEvent("vrr.chatScrollLines", client, amount);
sendNetworkEventToPlayer("vrr.chatScrollLines", client, amount);
}
// ===========================================================================
function playRadioStreamForPlayer(client, streamURL, loop = true, volume = 0, element = false) {
logToConsole(LOG_DEBUG, `[VRR.Client] Forcing ${getPlayerDisplayForConsole(client)} to stream ${streamURL}`);
triggerNetworkEvent("vrr.radioStream", client, streamURL, loop, volume, element);
sendNetworkEventToPlayer("vrr.radioStream", client, streamURL, loop, volume, element);
}
// ===========================================================================
function playAudioFileForPlayer(client, audioName, loop = true, volume = 0, element = false) {
logToConsole(LOG_DEBUG, `[VRR.Client] Forcing ${getPlayerDisplayForConsole(client)} to play audio ${audioName}`);
triggerNetworkEvent("vrr.audioFileStream", client, audioName, loop, volume);
sendNetworkEventToPlayer("vrr.audioFileStream", client, audioName, loop, volume);
}
// ===========================================================================
function stopRadioStreamForPlayer(client) {
logToConsole(LOG_DEBUG, `[VRR.Client] Forcing ${getPlayerDisplayForConsole(client)} to stop their radio stream`);
triggerNetworkEvent("vrr.stopRadioStream", client);
sendNetworkEventToPlayer("vrr.stopRadioStream", client);
}
// ===========================================================================
@@ -943,20 +972,20 @@ function stopRadioStreamForPlayer(client) {
function setPlayerStreamingRadioVolume(client, volumeLevel, elementId = false) {
getPlayerData(client).accountData.streamingRadioVolume = volumeLevel;
getPlayerData(client).streamingRadioElement = elementId;
triggerNetworkEvent("vrr.radioVolume", client, volumeLevel, elementId);
sendNetworkEventToPlayer("vrr.radioVolume", client, volumeLevel, elementId);
}
// ===========================================================================
function setVehicleLightsState(vehicle, state) {
setEntityData(vehicle, "vrr.lights", getVehicleData(vehicle).lights);
triggerNetworkEvent("vrr.veh.lights", null, vehicle.id, state);
sendNetworkEventToPlayer("vrr.veh.lights", null, vehicle.id, state);
}
// ===========================================================================
function sendPlayerEnterPropertyKey(client, key) {
triggerNetworkEvent("vrr.enterPropertyKey", client, key);
sendNetworkEventToPlayer("vrr.enterPropertyKey", client, key);
}
// ===========================================================================
@@ -991,13 +1020,13 @@ function makePedPlayAnimation(ped, animationSlot, positionOffset) {
break;
}
//}
triggerNetworkEvent("vrr.pedAnim", null, ped.id, animationData[1], animationData[2], animationData[3], animationData[4], animationData[5], positionOffset, freezePlayer);
sendNetworkEventToPlayer("vrr.pedAnim", null, ped.id, animationData[1], animationData[2], animationData[3], animationData[4], animationData[5], positionOffset, freezePlayer);
}
// ===========================================================================
function makePedStopAnimation(ped) {
triggerNetworkEvent("vrr.pedStopAnim", null, ped.id);
sendNetworkEventToPlayer("vrr.pedStopAnim", null, ped.id);
}
// ===========================================================================
@@ -1005,13 +1034,13 @@ function makePedStopAnimation(ped) {
function forcePedAnimation(ped, animationSlot) {
let animationData = getAnimationData(animationSlot);
triggerNetworkEvent("vrr.forcePedAnim", null, ped.id, animationData[1], animationData[2], animationData[3], animationData[4]);
sendNetworkEventToPlayer("vrr.forcePedAnim", null, ped.id, animationData[1], animationData[2], animationData[3], animationData[4]);
}
// ===========================================================================
function hideAllPlayerGUI(client) {
triggerNetworkEvent("vrr.hideAllGUI", client);
sendNetworkEventToPlayer("vrr.hideAllGUI", client);
}
// ===========================================================================
@@ -1025,37 +1054,37 @@ function setPlayerHeadLookPosition(client, position) {
// ===========================================================================
function sendPlayerGameScriptState(client, scriptName, state) {
triggerNetworkEvent("vrr.gameScript", client, scriptName, state);
sendNetworkEventToPlayer("vrr.gameScript", client, scriptName, state);
}
// ===========================================================================
function requestClientInfo(client) {
triggerNetworkEvent("vrr.clientInfo", client);
sendNetworkEventToPlayer("vrr.clientInfo", client);
}
// ===========================================================================
function updateInteriorLightsForPlayer(client, state) {
triggerNetworkEvent("vrr.interiorLights", client, state);
sendNetworkEventToPlayer("vrr.interiorLights", client, state);
}
// ===========================================================================
function forcePlayerToSyncElementProperties(client, element) {
triggerNetworkEvent("vrr.syncElement", client, element.id);
sendNetworkEventToPlayer("vrr.syncElement", client, element.id);
}
// ===========================================================================
function sendPlayerPedPartsAndProps(client) {
triggerNetworkEvent("vrr.ped")
sendNetworkEventToPlayer("vrr.ped")
}
// ===========================================================================
function setPlayerVanillaRadioStation(client, radioStationId) {
triggerNetworkEvent("vrr.vanillaRadio", client, radioStationId);
function forcePlayerWantedLevel(client, wantedLevel) {
sendNetworkEventToPlayer("vrr.wantedLevel", client, wantedLevel);
return true;
}
@@ -1079,8 +1108,30 @@ function updateAllInteriorVehiclesForPlayer(client, interior, dimension) {
// ===========================================================================
function setPlayerBuyingVehicleState(state, vehicle, position) {
function setPlayerBuyingVehicleState(client, state, vehicleId, position) {
if(getGlobalConfig().useServerSideVehiclePurchaseCheck == false) {
sendNetworkEventToPlayer("vrr.vehBuyState", client, state, vehicleId, position);
}
}
// ===========================================================================
// ==========================================================================
function receiveVehiclePurchaseStateUpdateFromClient(client, state) {
if(getGlobalConfig().useServerSideVehiclePurchaseCheck == false) {
checkVehicleBuying(client);
}
}
// ===========================================================================
function sendPlayerLogLevel(client, tempLogLevel = logLevel) {
sendNetworkEventToPlayer("vrr.logLevel", client, tempLogLevel);
}
// ==========================================================================
function setPlayerInfiniteRun(client, state) {
sendNetworkEventToPlayer("vrr.infiniteRun", client, state);
}
// ==========================================================================

View File

@@ -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) ? "[#CD3C3C]" : "[#32CD32]";
}
// ===========================================================================
/**
* 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;
}
// ===========================================================================

View File

@@ -68,12 +68,12 @@ function loadCommands() {
commandData("stopanim", stopPlayerAnimationCommand, "", getStaffFlagValue("None"), true, true, "Stops your current animation"),
],
antiCheat: [
commandData("addacscriptwl", addAntiCheatWhiteListedScriptCommand, "<script name>", getStaffFlagValue("Developer"), true, true),
commandData("delacscriptwl", removeAntiCheatWhiteListedScriptCommand, "<script name>", getStaffFlagValue("Developer"), true, true),
commandData("addacscriptbl", addAntiCheatBlackListedScriptCommand, "<script name>", getStaffFlagValue("Developer"), true, true),
commandData("delacscriptbl", removeAntiCheatBlackListedScriptCommand, "<script name>", getStaffFlagValue("Developer"), true, true),
commandData("setacscriptbl", toggleAntiCheatScriptBlackListCommand, "<0/1 state>", getStaffFlagValue("Developer"), true, true),
commandData("setacscriptwl", toggleAntiCheatScriptWhiteListCommand, "<0/1 state>", getStaffFlagValue("Developer"), true, true),
commandData("addacscriptwl", addAntiCheatWhiteListedScriptCommand, "<script name>", getStaffFlagValue("ManageAntiCheat"), true, true),
commandData("delacscriptwl", removeAntiCheatWhiteListedScriptCommand, "<script name>", getStaffFlagValue("ManageAntiCheat"), true, true),
commandData("addacscriptbl", addAntiCheatBlackListedScriptCommand, "<script name>", getStaffFlagValue("ManageAntiCheat"), true, true),
commandData("delacscriptbl", removeAntiCheatBlackListedScriptCommand, "<script name>", getStaffFlagValue("ManageAntiCheat"), true, true),
commandData("setacscriptbl", toggleAntiCheatScriptBlackListCommand, "<0/1 state>", getStaffFlagValue("ManageAntiCheat"), true, true),
commandData("setacscriptwl", toggleAntiCheatScriptWhiteListCommand, "<0/1 state>", getStaffFlagValue("ManageAntiCheat"), true, true),
//commandData("setac", toggleGlobalAntiCheatCommand, "<0/1 state>", getStaffFlagValue("Developer"), true, true),
//commandData("ac", getGlobalAntiCheatStatusCommand, "<0/1 state>", getStaffFlagValue("Developer"), true, true),
],
@@ -109,8 +109,9 @@ function loadCommands() {
commandData("bizitemprice", setBusinessItemSellPriceCommand, "<item slot> <sell price>", getStaffFlagValue("None"), true, true, "Sets the purchase price of a business item"),
commandData("bizname", setBusinessNameCommand, "<name>", getStaffFlagValue("None"), true, true, "Changes a business name"),
commandData("bizowner", setBusinessOwnerCommand, "<player name/id>", getStaffFlagValue("None"), true, true, "Changes the owner of a business"),
commandData("bizdelowner", removeBusinessOwnerCommand, "", getStaffFlagValue("ManageBusinesses"), true, true, "Removes the owner of a business"),
commandData("bizpublic", setBusinessPublicCommand, "", getStaffFlagValue("ManageBusinesses"), true, true, "Changes a business to public (city hall, govt buildings, etc)"),
commandData("bizpublic", setBusinessJobCommand, "", getStaffFlagValue("ManageBusinesses"), true, true, "Changes the owner of a business to a job"),
commandData("bizjob", setBusinessJobCommand, "", getStaffFlagValue("ManageBusinesses"), true, true, "Changes the owner of a business to a job"),
commandData("bizrank", setBusinessRankCommand, "", getStaffFlagValue("None"), true, true, "Changes the job/clan rank required to use the business"),
commandData("bizclan", setBusinessClanCommand, "", getStaffFlagValue("None"), true, true, "Changes the owner of a business to a clan"),
commandData("bizbuyprice", setBusinessBuyPriceCommand, "<amount>", getStaffFlagValue("None"), true, true, "Changes the price to buy the business"),
@@ -182,10 +183,10 @@ function loadCommands() {
commandData("cmddisable", disableCommand, "<command>", getStaffFlagValue("Developer"), true, true, "Disables a specific command"),
],
config: [
commandData("settime", setTimeCommand, "<hour> [minute]", getStaffFlagValue("ManageServer"), true, true, "Sets the time. Hours are required, minute is optional and will default to 0"),
commandData("setminuteduration", setMinuteDurationCommand, "<time in ms>", getStaffFlagValue("ManageServer"), true, true, "Sets how long a minute lasts in milliseconds. 60000 is real time."),
commandData("setweather", setWeatherCommand, "<weather id/name>", getStaffFlagValue("ManageServer"), true, true, "Change the weather to specified type."),
commandData("setsnow", setSnowingCommand, "<falling snow> <ground snow>", getStaffFlagValue("ManageServer"), true, true, "Toggles winter/snow"),
commandData("settime", setTimeCommand, "<hour> [minute]", getStaffFlagValue("ManageWorld"), true, true, "Sets the time. Hours are required, minute is optional and will default to 0"),
commandData("setminuteduration", setMinuteDurationCommand, "<time in ms>", getStaffFlagValue("ManageWorld"), true, true, "Sets how long a minute lasts in milliseconds. 60000 is real time."),
commandData("setweather", setWeatherCommand, "<weather id/name>", getStaffFlagValue("ManageWorld"), true, true, "Change the weather to specified type."),
commandData("setsnow", setSnowingCommand, "<falling snow> <ground snow>", getStaffFlagValue("ManageWorld"), true, true, "Toggles winter/snow"),
commandData("setlogo", toggleServerLogoCommand, "<0/1 state>", getStaffFlagValue("ManageServer"), true, true, "Toggles the corner server logo display on/off"),
commandData("setgui", toggleServerGUICommand, "<0/1 state>", getStaffFlagValue("ManageServer"), true, true, "Toggles server GUI on/off"),
commandData("setguicolours", setServerGUIColoursCommand, "<red> <green> <blue>", getStaffFlagValue("ManageServer"), true, true),
@@ -195,6 +196,8 @@ function loadCommands() {
commandData("reloadcfg", reloadServerConfigurationCommand, "", getStaffFlagValue("ManageServer"), true, true, "Loads and applies the server configuration"),
commandData("reloademailcfg", reloadEmailConfigurationCommand, "", getStaffFlagValue("Developer"), true, true, "Loads and applies the email configuration"),
commandData("reloaddbcfg", reloadDatabaseConfigurationCommand, "", getStaffFlagValue("Developer"), true, true, "Loads and applies the database configuration"),
commandData("reloadlocalecfg", reloadLocaleConfigurationCommand, "", getStaffFlagValue("Developer"), true, true, "Loads and applies the locale configuration and texts"),
commandData("reloadaccentcfg", reloadAccentConfigurationCommand, "", getStaffFlagValue("Developer"), true, true, "Loads and applies the accent configuration and texts"),
commandData("setbizblips", toggleServerBusinessBlipsCommand, "<0/1 state>", getStaffFlagValue("ManageServer"), true, true, "Toggles all business blips on/off"),
commandData("sethouseblips", toggleServerHouseBlipsCommand, "<0/1 state>", getStaffFlagValue("ManageServer"), true, true, "Toggles all house blips on/off"),
@@ -215,17 +218,25 @@ function loadCommands() {
commandData("saveall", saveAllServerDataCommand, "", getStaffFlagValue("Developer"), true, true),
commandData("docmd", simulateCommandForPlayerCommand, "<player name/id> <command> [params]", getStaffFlagValue("Developer"), true, true),
commandData("docmdall", simulateCommandForAllPlayersCommand, "<command> [params]", getStaffFlagValue("Developer"), true, true),
commandData("addloglvl", addServerLogLevelCommand, "<log level name>", getStaffFlagValue("Developer"), true, true),
commandData("delloglvl", removeServerLogLevelCommand, "<log level name>", getStaffFlagValue("Developer"), true, true),
commandData("loglvl", getServerLogLevelCommand, "<log level name>", getStaffFlagValue("Developer"), true, true),
commandData("addloglvl", addLogLevelCommand, "<log level name>", getStaffFlagValue("Developer"), true, true),
commandData("delloglvl", removeLogLevelCommand, "<log level name>", getStaffFlagValue("Developer"), true, true),
commandData("loglvl", getLogLevelCommand, "<log level name>", getStaffFlagValue("Developer"), true, true),
commandData("nosave", togglePauseSavingToDatabaseCommand, "", getStaffFlagValue("Developer"), true, true),
commandData("streamurlall", streamAudioURLToAllPlayersCommand, "<url> <volume>", getStaffFlagValue("Developer"), true, true),
commandData("streamnameall", streamAudioNameToAllPlayersCommand, "<name> <volume>", getStaffFlagValue("Developer"), true, true),
commandData("forceresetpass", forceAccountPasswordResetCommand, "<account name>", getStaffFlagValue("Developer"), true, true),
commandData("fixblips", fixAllServerBlipsCommand, "", getStaffFlagValue("Developer"), true, true),
commandData("fixpickups", fixAllServerPickupsCommand, "", getStaffFlagValue("Developer"), true, true),
commandData("resetambience", resetAllServerAmbienceElementsCommand, "", getStaffFlagValue("ManageWorld"), true, true),
],
discord: [],
economy: [
commandData("tax", taxInfoCommand, "", getStaffFlagValue("None"), true, true),
commandData("wealth", wealthInfoCommand, "", getStaffFlagValue("None"), true, true),
commandData("forcepayday", forcePlayerPayDayCommand, "<player name/id>", getStaffFlagValue("ManageServer"), true, true, "Gives a player an instant payday."),
],
email: [
commandData("testemail", testEmailCommand, "<email address>", getStaffFlagValue("Developer"), true, true),
],
@@ -243,7 +254,7 @@ function loadCommands() {
commandData("skin", helpGetSkinCommand, "", getStaffFlagValue("None"), false, false),
commandData("skins", helpGetSkinCommand, "", getStaffFlagValue("None"), false, false),
commandData("clothes", helpGetSkinCommand, "", getStaffFlagValue("None"), false, false),
commandData("setskin", helpGetSkinCommand, "", getStaffFlagValue("None"), false, false),
//commandData("setskin", helpGetSkinCommand, "", getStaffFlagValue("None"), false, false),
commandData("changeskin", helpGetSkinCommand, "", getStaffFlagValue("None"), false, false),
],
house: [
@@ -268,6 +279,7 @@ function loadCommands() {
],
item: [
commandData("i", playerSwitchHotBarSlotCommand, "<slot id>", getStaffFlagValue("None"), true, false, "Switches to the item in the specified slot of your inventory."),
commandData("item", playerSwitchHotBarSlotCommand, "<slot id>", getStaffFlagValue("None"), true, false, "Switches to the item in the specified slot of your inventory."),
commandData("addgrounditem", createGroundItemCommand, "<item name/id>", getStaffFlagValue("ManageItems"), true, false, "Spawns a new item on the ground at your position."),
commandData("additem", createItemCommand, "<item name/id>", getStaffFlagValue("ManageItems"), true, false, "Spawns a new item in your hotbar inventory."),
commandData("delgrounditem", deleteGroundItemCommand, "", getStaffFlagValue("ManageItems"), true, false, "Destroys the nearest item on the ground."),
@@ -323,15 +335,35 @@ function loadCommands() {
commandData("drag", policeDragCommand, "", getStaffFlagValue("None"), true, false),
commandData("search", policeSearchCommand, "", getStaffFlagValue("None"), true, false),
// Bus/Garbage
// Routes
commandData("startroute", jobStartRouteCommand, "", getStaffFlagValue("None"), true, false),
commandData("stoproute", jobStopRouteCommand, "", getStaffFlagValue("None"), true, false),
// Admin Job Stuff
commandData("addjob", createJobCommand, "<name>", getStaffFlagValue("ManageJobs"), true, false),
commandData("addjobloc", createJobLocationCommand, "<job name/id>", getStaffFlagValue("ManageJobs"), true, false),
commandData("deljobloc", deleteJobLocationCommand, "", getStaffFlagValue("ManageJobs"), true, false),
commandData("addjobroute", createJobRouteCommand, "<name>", getStaffFlagValue("ManageJobs"), true, false),
commandData("addjobrouteloc", createJobRouteLocationCommand, "<name>", getStaffFlagValue("ManageJobs"), true, false),
commandData("deljobroute", deleteJobRouteCommand, "", getStaffFlagValue("ManageJobs"), true, false),
commandData("deljobrouteloc", deleteJobRouteLocationCommand, "", getStaffFlagValue("ManageJobs"), true, false),
commandData("jobroutename", setJobRouteNameCommand, "<name>", getStaffFlagValue("ManageJobs"), true, false),
commandData("jobroutepay", setJobRoutePayCommand, "<amount>", getStaffFlagValue("ManageJobs"), true, false),
commandData("jobroutestartmsg", setJobRouteStartMessageCommand, "<new message>", getStaffFlagValue("ManageJobs"), true, false),
commandData("jobroutefinishmsg", setJobRouteFinishMessageCommand, "<new message>", getStaffFlagValue("ManageJobs"), true, false),
commandData("jobroutelocarrivemsg", setJobRouteLocationArriveMessageCommand, "<new message>", getStaffFlagValue("ManageJobs"), true, false),
commandData("jobroutelocnextmsg", setJobRouteLocationNextMessageCommand, "<new message>", getStaffFlagValue("ManageJobs"), true, false),
commandData("jobrouteenabled", toggleJobRouteEnabledCommand, "", getStaffFlagValue("ManageJobs"), true, false),
commandData("jobroutevehcolours", setJobRouteVehicleColoursCommand, "<colour 1> <colour 2>", getStaffFlagValue("ManageJobs"), true, false),
commandData("jobroutedelays", setJobRouteAllLocationDelaysCommand, "<time in milliseconds>", getStaffFlagValue("ManageJobs"), true, false),
commandData("jobcolour", setJobColourCommand, "<job id/name> <red> <green> <blue>", getStaffFlagValue("ManageJobs"), true, false),
commandData("jobblip", setJobBlipCommand, "<job id/name> <blip id/name>", getStaffFlagValue("ManageJobs"), true, false),
commandData("jobpickup", setJobPickupCommand, "<job id/name> <pickup id/name>", getStaffFlagValue("ManageJobs"), true, false),
commandData("jobwl", toggleJobWhiteListCommand, "[job id]", getStaffFlagValue("ManageJobs"), true, false),
commandData("jobwhitelist", toggleJobWhiteListCommand, "[job id]", getStaffFlagValue("ManageJobs"), true, false),
commandData("jobblacklist", toggleJobBlackListCommand, "[job id]", getStaffFlagValue("ManageJobs"), true, false),
commandData("jobbl", toggleJobBlackListCommand, "[job id]", getStaffFlagValue("ManageJobs"), true, false),
commandData("jobtoggle", toggleJobEnabledCommand, "[job id]", getStaffFlagValue("ManageJobs"), true, false),
commandData("jobaddplayerwl", addPlayerToJobWhiteListCommand, "<player name/id> [job id]", getStaffFlagValue("ManageJobs"), true, false),
commandData("jobaddplayerbl", addPlayerToJobBlackListCommand, "<player name/id> [job id]", getStaffFlagValue("ManageJobs"), true, false),
@@ -347,7 +379,12 @@ function loadCommands() {
commandData("unbindkey", removeKeyBindCommand, "<key id/name>", getStaffFlagValue("None"), true, false, "Removes an existing keybind from your account"),
commandData("keybinds", showKeyBindListCommand, "", getStaffFlagValue("None"), true, false, "Shows a list of all your current keybinds"),
],
locale: [],
locale: [
commandData("lang", setLocaleCommand, "<language name>", getStaffFlagValue("None"), true, false, "Sets your language"),
commandData("language", setLocaleCommand, "<language name>", getStaffFlagValue("None"), true, false, "Sets your language"),
commandData("locale", setLocaleCommand, "<language name>", getStaffFlagValue("None"), true, false, "Sets your language"),
commandData("setlang", setLocaleCommand, "<language name>", getStaffFlagValue("None"), true, false, "Sets your language"),
],
messaging: [],
misc: [
commandData("pos", getPositionCommand, "", getStaffFlagValue("BasicModeration"), true, false, "Shows your current coordinates"),
@@ -359,48 +396,8 @@ function loadCommands() {
commandData("yes", playerPromptAnswerYesCommand, "", getStaffFlagValue("None"), true, false, "Answers a prompt with YES"),
commandData("no", playerPromptAnswerNoCommand, "", getStaffFlagValue("None"), true, false, "Answers a prompt with NO"),
commandData("admins", listOnlineAdminsCommand, "", getStaffFlagValue("None"), true, false, "Shows a list of online admins"),
],
moderation: [
commandData("kick", kickClientCommand, "<player name/id> [reason]", getStaffFlagValue("BasicModeration"), true, true, "Kicks a player from the server"),
commandData("mute", muteClientCommand, "<player name/id> [reason]", getStaffFlagValue("BasicModeration"), true, true, "Mutes a player, preventing them from using any chat."),
commandData("freeze", freezeClientCommand, "<player name/id> [reason]", getStaffFlagValue("BasicModeration"), true, true, "Freeze a player, preventing them from moving."),
commandData("unmute", unMuteClientCommand, "<player name/id> [reason]", getStaffFlagValue("BasicModeration"), true, true, "Unmutes a player, allowing them to chat again."),
commandData("unfreeze", unFreezeClientCommand, "<player name/id> [reason]", getStaffFlagValue("BasicModeration"), true, true, "Unfreezes a player, allowing them to move again."),
commandData("goto", gotoPlayerCommand, "<player name/id>", getStaffFlagValue("BasicModeration"), true, true, "Teleports you to a player."),
commandData("gethere", getPlayerCommand, "<player name/id>", getStaffFlagValue("BasicModeration"), true, true, "Teleports a player to you."),
commandData("getveh", getVehicleCommand, "<vehicle id>", getStaffFlagValue("BasicModeration"), true, true, "Teleports a vehicle to you."),
commandData("returnplr", returnPlayerCommand, "<player name/id>", getStaffFlagValue("BasicModeration"), true, true, "Returns a player to their previous position."),
commandData("gotopos", gotoPositionCommand, "<x> <y> <z> [int] [vw]", getStaffFlagValue("BasicModeration"), true, true, "Teleports you to specific coordinates with optional interior and dimension."),
commandData("gotoveh", gotoVehicleCommand, "<vehicle id>", getStaffFlagValue("BasicModeration"), true, true, "Teleports you to a vehicle by ID."),
commandData("gotobiz", gotoBusinessCommand, "<business id/name>", getStaffFlagValue("BasicModeration"), true, true, "Teleports you to a business by ID or name."),
commandData("gotohouse", gotoHouseCommand, "<house id/name>", getStaffFlagValue("BasicModeration"), true, true, "Teleports you to a house by ID or description."),
commandData("gotojob", gotoJobLocationCommand, "<job id/name> <location id>", getStaffFlagValue("BasicModeration"), true, true, "Teleports you to a job location by name and location ID."),
commandData("gotoloc", gotoGameLocationCommand, "<location name>", getStaffFlagValue("BasicModeration"), true, true, "Teleports you to a game location by name."),
commandData("gotospawn", gotoNewPlayerSpawnCommand, "", getStaffFlagValue("BasicModeration"), true, true, "Teleports you to the new player spawn location"),
commandData("fr", teleportForwardCommand, "<distance in meters>", getStaffFlagValue("BasicModeration"), true, true, "Teleports you forward a certain distance in meters."),
commandData("ba", teleportBackwardCommand, "<distance in meters>", getStaffFlagValue("BasicModeration"), true, true, "Teleports you backward a certain distance in meters."),
commandData("lt", teleportLeftCommand, "<distance in meters>", getStaffFlagValue("BasicModeration"), true, true, "Teleports you to the left a certain distance in meters."),
commandData("rt", teleportRightCommand, "<distance in meters>", getStaffFlagValue("BasicModeration"), true, true, "Teleports you to the right a certain distance in meters."),
commandData("up", teleportUpCommand, "<distance in meters>", getStaffFlagValue("BasicModeration"), true, true, "Teleports you upward a certain distance in meters."),
commandData("dn", teleportDownCommand, "<distance in meters>", getStaffFlagValue("BasicModeration"), true, true, "Teleports you downward a certain distance in meters."),
commandData("int", playerInteriorCommand, "<interior id>", getStaffFlagValue("BasicModeration"), true, true, "Gets or sets a player's game interior."),
commandData("vw", playerVirtualWorldCommand, "<virtual world id>", getStaffFlagValue("BasicModeration"), true, true, "Gets or sets a player's virtual world/dimension."),
commandData("addstaffflag", addStaffFlagCommand, "<player name/id> <flag name>", getStaffFlagValue("ManageAdmins"), true, true, "Gives a player a staff flaf (this server only)."),
commandData("delstaffflag", takeStaffFlagCommand, "<player name/id> <flag name>", getStaffFlagValue("ManageAdmins"), true, true, "Takes a player's staff flag by name (this server only)."),
commandData("getstaffflags", getStaffFlagsCommand, "<player name/id>", getStaffFlagValue("ManageAdmins"), true, true, "Shows a list of all staff flags a player has (this server only)."),
commandData("clearstaffflags", clearStaffFlagsCommand, "<player name/id>", getStaffFlagValue("ManageAdmins"), true, true, "Removes all staff flags for a player (this server only)."),
commandData("staffflags", allStaffFlagsCommand, "", getStaffFlagValue("ManageAdmins"), true, true, "Shows a list of all valid staff flag names."),
commandData("givemoney", givePlayerMoneyCommand, "<player name/id> <amount>", getStaffFlagValue("serverManager"), true, true),
commandData("nonrpname", forceCharacterNameChangeCommand, "<player name/id>", getStaffFlagValue("BasicModeration"), true, true, "Forces a player to change their current character's name."),
commandData("forcename", forceCharacterNameCommand, "<player name/id> <first name> <last name>", getStaffFlagValue("BasicModeration"), true, true, "Changes a character's name directly."),
commandData("forceskin", forcePlayerSkinCommand, "<player name/id> <skin id/name>", getStaffFlagValue("BasicModeration"), true, true, "Changes a character's skin directly."),
commandData("forcefightstyle", forceFightStyleCommand, "<player name/id> <fight style name>", getStaffFlagValue("BasicModeration"), true, true, "Changes a character's fight style."),
commandData("plrinfo", getPlayerInfoCommand, "<player name/id>", getStaffFlagValue("BasicModeration"), true, true, "Shows basic info about the specified player"),
commandData("getplrhouse", getAllHousesOwnedByPlayerCommand, "<player name/id>", getStaffFlagValue("BasicModeration"), true, true, "Shows a list of all houses owned by the player"),
commandData("getplrbiz", getAllBusinessesOwnedByPlayerCommand, "<player name/id>", getStaffFlagValue("BasicModeration"), true, true, "Shows a list of all businesses owned by the player"),
commandData("getplrveh", getAllVehiclesOwnedByPlayerCommand, "<player name/id>", getStaffFlagValue("BasicModeration"), true, true, "Shows a list of all vehicles owned by the player"),
commandData("geoip", getGeoIPInformationCommand, "<player name/id>", getStaffFlagValue("BasicModeration"), true, true, "Retrieves GeoIP information on a player (country & city)"),
commandData("forcepayday", forcePlayerPayDayCommand, "<player name/id>", getStaffFlagValue("ManageServer"), true, true, "Gives a player an instant payday."),
commandData("stuck", stuckPlayerCommand, "", getStaffFlagValue("None"), true, false, "Fixes your position and virtual world if bugged"),
commandData("gps", gpsCommand, "[item or place name]", getStaffFlagValue("None"), true, false, "Shows you locations for special places or where to buy items"),
],
radio: [
commandData("radiostation", playStreamingRadioCommand, "<radio station id>", getStaffFlagValue("None"), true, false, "Plays a radio station in your vehicle, house, or business (depending on which one you're in)"),
@@ -409,6 +406,55 @@ function loadCommands() {
commandData("radioreloadall", reloadAllRadioStationsCommand, "", getStaffFlagValue("ManageServer"), true, false, "Reloads all radio stations from database (use after making changes)"),
],
security: [],
staff: [
commandData("kick", kickClientCommand, "<player name/id> [reason]", getStaffFlagValue("BasicModeration"), true, true, "Kicks a player from the server"),
commandData("mute", muteClientCommand, "<player name/id> [reason]", getStaffFlagValue("BasicModeration"), true, true, "Mutes a player, preventing them from using any chat."),
commandData("freeze", freezeClientCommand, "<player name/id> [reason]", getStaffFlagValue("BasicModeration"), true, true, "Freeze a player, preventing them from moving."),
commandData("unmute", unMuteClientCommand, "<player name/id> [reason]", getStaffFlagValue("BasicModeration"), true, true, "Unmutes a player, allowing them to chat again."),
commandData("unfreeze", unFreezeClientCommand, "<player name/id> [reason]", getStaffFlagValue("BasicModeration"), true, true, "Unfreezes a player, allowing them to move again."),
commandData("goto", gotoPlayerCommand, "<player name/id>", getStaffFlagValue("BasicModeration"), true, true, "Teleports you to a player."),
commandData("gethere", getPlayerCommand, "<player name/id>", getStaffFlagValue("BasicModeration"), true, true, "Teleports a player to you."),
commandData("getveh", getVehicleCommand, "<vehicle id>", getStaffFlagValue("BasicModeration"), true, true, "Teleports a vehicle to you."),
commandData("warpinveh", warpIntoVehicleCommand, "[vehicle id]", getStaffFlagValue("ManageVehicles"), true, false),
commandData("returnplr", returnPlayerCommand, "<player name/id>", getStaffFlagValue("BasicModeration"), true, true, "Returns a player to their previous position."),
commandData("gotopos", gotoPositionCommand, "<x> <y> <z> [int] [vw]", getStaffFlagValue("BasicModeration"), true, true, "Teleports you to specific coordinates with optional interior and dimension."),
commandData("gotoveh", gotoVehicleCommand, "<vehicle id>", getStaffFlagValue("BasicModeration"), true, true, "Teleports you to a vehicle by ID."),
commandData("gotobiz", gotoBusinessCommand, "<business id/name>", getStaffFlagValue("BasicModeration"), true, true, "Teleports you to a business by ID or name."),
commandData("gotohouse", gotoHouseCommand, "<house id/name>", getStaffFlagValue("BasicModeration"), true, true, "Teleports you to a house by ID or description."),
commandData("gotojob", gotoJobLocationCommand, "<job id/name> <location id>", getStaffFlagValue("BasicModeration"), true, true, "Teleports you to a job location by name and location ID."),
commandData("gotoloc", gotoGameLocationCommand, "<location name>", getStaffFlagValue("BasicModeration"), true, true, "Teleports you to a game location by name."),
commandData("gotospawn", gotoNewPlayerSpawnCommand, "", getStaffFlagValue("BasicModeration"), true, true, "Teleports you to the new player spawn location"),
commandData("fr", teleportForwardCommand, "[distance in meters]", getStaffFlagValue("BasicModeration"), true, true, "Teleports you forward a certain distance in meters."),
commandData("ba", teleportBackwardCommand, "[distance in meters]", getStaffFlagValue("BasicModeration"), true, true, "Teleports you backward a certain distance in meters."),
commandData("lt", teleportLeftCommand, "[distance in meters]", getStaffFlagValue("BasicModeration"), true, true, "Teleports you to the left a certain distance in meters."),
commandData("rt", teleportRightCommand, "[distance in meters]", getStaffFlagValue("BasicModeration"), true, true, "Teleports you to the right a certain distance in meters."),
commandData("up", teleportUpCommand, "[distance in meters]", getStaffFlagValue("BasicModeration"), true, true, "Teleports you upward a certain distance in meters."),
commandData("dn", teleportDownCommand, "[distance in meters]", getStaffFlagValue("BasicModeration"), true, true, "Teleports you downward a certain distance in meters."),
commandData("int", playerInteriorCommand, "<player name/id> [interior id]", getStaffFlagValue("BasicModeration"), true, true, "Gets or sets a player's game interior."),
commandData("vw", playerVirtualWorldCommand, "<player name/id> [virtual world id]", getStaffFlagValue("BasicModeration"), true, true, "Gets or sets a player's virtual world/dimension."),
commandData("addstaffflag", addStaffFlagCommand, "<player name/id> <flag name>", getStaffFlagValue("ManageAdmins"), true, true, "Gives a player a staff flag by name (this server only)."),
commandData("delstaffflag", takeStaffFlagCommand, "<player name/id> <flag name>", getStaffFlagValue("ManageAdmins"), true, true, "Takes a player's staff flag by name (this server only)."),
commandData("getstaffflags", getStaffFlagsCommand, "<player name/id>", getStaffFlagValue("ManageAdmins"), true, true, "Shows a list of all staff flags a player has (this server only)."),
commandData("clearstaffflags", clearStaffFlagsCommand, "<player name/id>", getStaffFlagValue("ManageAdmins"), true, true, "Removes all staff flags for a player (this server only)."),
commandData("staffflags", allStaffFlagsCommand, "", getStaffFlagValue("ManageAdmins"), true, true, "Shows a list of all valid staff flag names."),
commandData("givemoney", givePlayerMoneyCommand, "<player name/id> <amount>", getStaffFlagValue("serverManager"), true, true),
commandData("nonrpname", forceCharacterNameChangeCommand, "<player name/id>", getStaffFlagValue("BasicModeration"), true, true, "Forces a player to change their current character's name."),
commandData("setname", forceCharacterNameCommand, "<player name/id> <first name> <last name>", getStaffFlagValue("BasicModeration"), true, true, "Changes a character's name directly."),
commandData("setskin", forcePlayerSkinCommand, "<player name/id> <skin id/name>", getStaffFlagValue("BasicModeration"), true, true, "Changes a character's skin."),
commandData("setaccent", forcePlayerAccentCommand, "<player name/id> <accent name>", getStaffFlagValue("BasicModeration"), true, true, "Changes a character's accent."),
commandData("setfightstyle", forceFightStyleCommand, "<player name/id> <fight style name>", getStaffFlagValue("BasicModeration"), true, true, "Changes a character's fight style."),
commandData("setstars", forcePlayerWantedLevelCommand, "<player name/id> <wanted level>", getStaffFlagValue("BasicModeration"), true, true, "Forces a player to have a wanted level"),
commandData("plrinfo", getPlayerInfoCommand, "<player name/id>", getStaffFlagValue("BasicModeration"), true, true, "Shows basic info about the specified player"),
commandData("getplrhouse", getAllHousesOwnedByPlayerCommand, "<player name/id>", getStaffFlagValue("BasicModeration"), true, true, "Shows a list of all houses owned by the player"),
commandData("getplrbiz", getAllBusinessesOwnedByPlayerCommand, "<player name/id>", getStaffFlagValue("BasicModeration"), true, true, "Shows a list of all businesses owned by the player"),
commandData("getplrveh", getAllVehiclesOwnedByPlayerCommand, "<player name/id>", getStaffFlagValue("BasicModeration"), true, true, "Shows a list of all vehicles owned by the player"),
commandData("geoip", getPlayerGeoIPInformationCommand, "<player name/id>", getStaffFlagValue("BasicModeration"), true, true, "Retrieves GeoIP information on a player (country & city)"),
commandData("ip", getPlayerIPInformationCommand, "<player name/id>", getStaffFlagValue("BasicModeration"), true, true, "Retrieves IP information on a player"),
commandData("plrsync", toggleSyncForElementsSpawnedByPlayer, "<player name/id>", getStaffFlagValue("BasicModeration"), true, true, "Sets whether elements spawned by a player are synced (traffic, peds, etc)"),
commandData("health", setPlayerHealthCommand, "<player name/id> <health", getStaffFlagValue("BasicModeration"), true, true, "Sets a player's health"),
commandData("armour", setPlayerArmourCommand, "<player name/id> <armour>", getStaffFlagValue("BasicModeration"), true, true, "Sets a player's armour"),
commandData("infiniterun", setPlayerInfiniteRunCommand, "<player name/id> <state>", getStaffFlagValue("BasicModeration"), true, true, "Toggles a player's infinite sprint"),
],
startup: [],
subAccount: [
commandData("switchchar", switchCharacterCommand, "", getStaffFlagValue("None"), true, false),
@@ -433,6 +479,7 @@ function loadCommands() {
commandData("addveh", createVehicleCommand, "<model id/name>", getStaffFlagValue("ManageVehicles"), true, false),
commandData("tempveh", createTemporaryVehicleCommand, "<model id/name>", getStaffFlagValue("ManageVehicles"), true, false),
commandData("delveh", deleteVehicleCommand, "", getStaffFlagValue("ManageVehicles"), true, false),
commandData("nearveh", getNearbyVehiclesCommand, "", getStaffFlagValue("None"), true, false),
commandData("oldveh", getLastVehicleInfoCommand, "", getStaffFlagValue("None"), true, false),
commandData("lastveh", getLastVehicleInfoCommand, "", getStaffFlagValue("None"), true, false),
@@ -455,19 +502,25 @@ function loadCommands() {
commandData("vehinfo", getVehicleInfoCommand, "", getStaffFlagValue("None"), true, true),
commandData("vehpark", toggleVehicleSpawnLockCommand, "", getStaffFlagValue("ManageVehicles"), true, true),
commandData("vehrespawnall", respawnAllVehiclesCommand, "", getStaffFlagValue("ManageVehicles"), true, true),
commandData("vehrespawnempty", respawnEmptyVehiclesCommand, "", getStaffFlagValue("ManageVehicles"), true, true),
commandData("vehreloadall", reloadAllVehiclesCommand, "", getStaffFlagValue("ManageVehicles"), true, true),
commandData("vehrespawnall", respawnAllVehiclesCommand, "", getStaffFlagValue("ManageVehicles"), true, true, "Respawns all vehicles (also respawns all traffic vehicles)"),
commandData("vehrespawnempty", respawnEmptyVehiclesCommand, "", getStaffFlagValue("ManageVehicles"), true, true, "Respawns all empty/unoccupied vehicles"),
commandData("vehrespawnjob", respawnJobVehiclesCommand, "", getStaffFlagValue("ManageVehicles"), true, true, "Respawns all job vehicles"),
commandData("vehrespawnplr", respawnPlayerVehiclesCommand, "", getStaffFlagValue("ManageVehicles"), true, true, "Respawns all player-owned vehicles"),
commandData("vehrespawnclan", respawnClanVehiclesCommand, "", getStaffFlagValue("ManageVehicles"), true, true, "Respawns all clan-owned vehicles"),
commandData("vehrespawnpublic", respawnPublicVehiclesCommand, "", getStaffFlagValue("ManageVehicles"), true, true, "Respawns all public vehicles"),
commandData("vehrespawnbiz", respawnBusinessVehiclesCommand, "", getStaffFlagValue("ManageVehicles"), true, true, "Respawns all business-owned vehicles"),
commandData("vehrespawn", respawnVehicleCommand, "", getStaffFlagValue("ManageVehicles"), true, true, "Respawns your current vehicle"),
commandData("vehreloadall", reloadAllVehiclesCommand, "", getStaffFlagValue("ManageVehicles"), true, true, "Deletes and reloads all vehicles from database"),
commandData("vehrent", rentVehicleCommand, "", getStaffFlagValue("None"), true, true),
commandData("vehrentprice", setVehicleRentPriceCommand, "", getStaffFlagValue("None"), true, true),
commandData("vehbuyprice", setVehicleBuyPriceCommand, "", getStaffFlagValue("None"), true, true),
commandData("stoprent", stopRentingVehicleCommand, "", getStaffFlagValue("None"), true, true),
commandData("vehbuy", buyVehicleCommand, "", getStaffFlagValue("None"), true, true),
commandData("vehcolour", vehicleAdminColourCommand, "<colour1> <colour2>", getStaffFlagValue("None"), true, true),
commandData("vehlivery", vehicleAdminLiveryCommand, "<livery id>", getStaffFlagValue("None"), true, true),
commandData("vehrepair", vehicleAdminRepairCommand, "", getStaffFlagValue("None"), true, true),
commandData("passenger", enterVehicleAsPassengerCommand, "", getStaffFlagValue("None"), true, true),
commandData("vehrent", rentVehicleCommand, "", getStaffFlagValue("None"), true, true, "Starts renting your current vehicle (if rentable)"),
commandData("vehrentprice", setVehicleRentPriceCommand, "", getStaffFlagValue("None"), true, true, "Sets your vehicle's rent price"),
commandData("vehbuyprice", setVehicleBuyPriceCommand, "", getStaffFlagValue("None"), true, true, "Sets your vehicle's rent price"),
commandData("stoprent", stopRentingVehicleCommand, "", getStaffFlagValue("None"), true, true, "Stops renting your vehicle"),
commandData("vehbuy", buyVehicleCommand, "", getStaffFlagValue("None"), true, true, "Purchases your vehicle"),
commandData("vehcolour", vehicleAdminColourCommand, "<colour1> <colour2>", getStaffFlagValue("None"), true, true, "Sets a vehicle's colour"),
commandData("vehlivery", vehicleAdminLiveryCommand, "<livery id>", getStaffFlagValue("None"), true, true, "Sets your vehicle's livery/paintjob"),
commandData("vehrepair", vehicleAdminRepairCommand, "", getStaffFlagValue("None"), true, true, "Repairs your vehicle"),
commandData("passenger", enterVehicleAsPassengerCommand, "", getStaffFlagValue("None"), true, true, "Enters a vehicle as passenger"),
],
};
@@ -650,7 +703,13 @@ function processPlayerCommand(command, params, client) {
if(!doesCommandExist(toLowerCase(command))) {
console.warn(`[VRR.Command] ${getPlayerDisplayForConsole(client)} attempted to use command, but failed (invalid command): /${command} ${paramsDisplay}`);
messagePlayerError(client, `The command {ALTCOLOUR}/${command} {MAINCOLOUR}does not exist! Use /help for commands and information.`);
let possibleCommand = getCommandFromParams(command);
if(possibleCommand != false && doesPlayerHaveStaffPermission(client, getCommandRequiredPermissions(toLowerCase(possibleCommand.command)))) {
messagePlayerError(client, `The command {ALTCOLOUR}/${command} {MAINCOLOUR}does not exist! Did you mean {ALTCOLOUR}/${possibleCommand.command} ?`);
} else {
messagePlayerError(client, `The command {ALTCOLOUR}/${command} {MAINCOLOUR}does not exist! Use /help for commands and information.`);
}
return false;
}
@@ -696,7 +755,7 @@ addCommandHandler("cmd", function(command, params, client) {
}
let splitParams = params.split(" ");
let newCommand = splitParams[0];
let newCommand = getParam(params, " ", 1);
let newParams = splitParams.slice(1).join(" ");
getCommand(newCommand).handlerFunction(newCommand, newParams, client);
@@ -752,3 +811,44 @@ function getCommandAliasesNames(command) {
// ===========================================================================
function areParamsEmpty(params) {
if(!params || params == "" || params.length == 0 || typeof params == "undefined") {
return true;
}
return false;
}
// ===========================================================================
function getParamsCount(params, delimiter = " ") {
return params.split(delimiter).length;
}
// ===========================================================================
function areThereEnoughParams(params, requiredAmount, delimiter = " ") {
return (params.split(delimiter).length >= requiredAmount);
}
// ===========================================================================
function getParam(params, delimiter, index) {
return params.split(delimiter)[index-1];
}
// ===========================================================================
function getCommandFromParams(params) {
for(let i in serverCommands) {
for(let j in serverCommands[i]) {
if(toLowerCase(serverCommands[i][j].command).indexOf(toLowerCase(params)) != -1) {
return serverCommands[i][j];
}
}
}
return false;
}
// ===========================================================================

View File

@@ -25,7 +25,7 @@ let globalConfig = {
talkDistance: 10,
whisperDistance: 2,
megaphoneDistance: 40,
vehicleLockDistance: 5,
vehicleLockDistance: 5.5,
startWorkingDistance: 5,
takeJobDistance: 5,
stopWorkingDistance: 10,
@@ -51,20 +51,6 @@ let globalConfig = {
geoIPCountryDatabaseFilePath: "geoip-country.mmdb",
geoIPCityDatabaseFilePath: "geoip-city.mmdb",
randomTipInterval: 600000,
locales: [
["English", "english"],
],
economy: {
passiveIncomePerPayDay: 1000,
applyTax: true,
applyUpkeep: true,
grossIncomeMultiplier: 1.0,
upKeepCosts: {
upKeepPerVehicle: 250,
upKeepPerHouse: 350,
upKeepPerBusiness: 600
}
},
weaponEquippableTypes: [
VRR_ITEM_USETYPE_WEAPON,
VRR_ITEM_USETYPE_TAZER,
@@ -80,13 +66,11 @@ let globalConfig = {
VRR_ITEM_USETYPE_VEHTIRE,
],
vehicleInactiveRespawnDelay: 1800000, // 20 minutes
housePickupStreamInDistance: 50,
housePickupStreamOutDistance: 75,
businessPickupStreamInDistance: 50,
businessPickupStreamOutDistance: 75,
jobPickupStreamInDistance: 50,
jobPickupStreamOutDistance: 75,
vehicleTrunkRearDistance: 3,
chatSectionHeaderLength: 96,
economy: {},
locales: [],
accents: [],
useServerSideVehiclePurchaseCheck: false,
};
// ===========================================================================
@@ -98,36 +82,9 @@ function loadGameConfig() {
// ===========================================================================
function loadGlobalConfig() {
//let roleplayConfig = JSON.parse(loadTextFile(`config/roleplay.json`));
//if(roleplayConfig != null) {
// globalConfig = roleplayConfig;
//}
//let localeConfig = JSON.parse(loadTextFile(`config/locale.json`));
//if(localeConfig != null) {
// globalConfig.locales = localeConfig;
//}
//let economyConfig = JSON.parse(loadTextFile(`config/economy.json`));
//if(economyConfig != null) {
// globalConfig.economy = economyConfig;
//}
//getGlobalConfig().weaponEquippableTypes = [
// VRR_ITEM_USETYPE_WEAPON,
// VRR_ITEM_USETYPE_TAZER,
// VRR_ITEM_USETYPE_EXTINGUISHER,
// VRR_ITEM_USETYPE_SPRAYPAINT,
// VRR_ITEM_USETYPE_PEPPERSPRAY,
//];
//getGlobalConfig().onFootOnlyItems = [
// VRR_ITEM_USETYPE_VEHREPAIR,
// VRR_ITEM_USETYPE_VEHCOLOUR,
// VRR_ITEM_USETYPE_VEHUPGRADE_PART,
// VRR_ITEM_USETYPE_VEHLIVERY,
// VRR_ITEM_USETYPE_VEHTIRE,
//];
getGlobalConfig().economy = loadEconomyConfig();
getGlobalConfig().locale = loadLocaleConfig();
getGlobalConfig().accents = loadAccentConfig();
}
// ===========================================================================
@@ -137,6 +94,9 @@ function initConfigScript() {
gameConfig = loadGameConfig();
serverConfig = loadServerConfigFromGameAndPort(server.game, server.port, getMultiplayerMod());
applyConfigToServer(serverConfig);
loadGlobalConfig();
logToConsole(LOG_INFO, "[VRR.Config]: Config script initialized!");
}
@@ -202,13 +162,10 @@ function saveServerConfigToDatabase() {
let dbConnection = connectToDatabase();
if(dbConnection) {
let data = [
["svr_logo", boolToInt(getServerConfig().showLogo)],
["svr_gui", boolToInt(getServerConfig().useGUI)],
["svr_settings", toInteger(getServerConfig().settings)],
["svr_start_time_hour", getServerConfig().hour],
["svr_start_time_min", getServerConfig().minute],
["svr_start_weather", getServerConfig().weather],
["svr_start_snow_falling", boolToInt(getServerConfig().fallingSnow)],
["svr_start_snow_ground", boolToInt(getServerConfig().groundSnow)],
["svr_newchar_pos_x", getServerConfig().newCharacter.spawnPosition.x],
["svr_newchar_pos_y", getServerConfig().newCharacter.spawnPosition.y],
["svr_newchar_pos_z", getServerConfig().newCharacter.spawnPosition.z],
@@ -240,16 +197,6 @@ function saveServerConfigToDatabase() {
["svr_charselect_int", getServerConfig().characterSelectInterior],
["svr_charselect_vw", getServerConfig().characterSelectDimension],
["svr_inflation_multiplier", getServerConfig().inflationMultiplier],
["svr_ac_enabled", boolToInt(getServerConfig().antiCheat.enabled)],
["svr_ac_check_scripts", boolToInt(getServerConfig().antiCheat.checkGameScripts)],
["svr_ac_script_wl", boolToInt(getServerConfig().antiCheat.gameScriptWhiteListEnabled)],
["svr_ac_script_bl", boolToInt(getServerConfig().antiCheat.gameScriptBlackListEnabled)],
["svr_job_pickups", boolToInt(getServerConfig().createJobPickups)],
["svr_job_blips", boolToInt(getServerConfig().createJobBlips)],
["svr_biz_pickups", boolToInt(getServerConfig().createBusinessPickups)],
["svr_biz_blips", boolToInt(getServerConfig().createBusinessBlips)],
["svr_house_pickups", boolToInt(getServerConfig().createHousePickups)],
["svr_house_blips", boolToInt(getServerConfig().createHouseBlips)],
["svr_intro_music", getServerConfig().introMusicURL],
];
@@ -270,10 +217,13 @@ function saveServerConfigToDatabase() {
/**
*
* @return {ServerConfigData} - Server configuration data
* @return {ServerData} - Server configuration data
*
*/
function getServerConfig() {
function getServerConfig(serverId = getServerId()) {
if(serverId != getServerId()) {
return loadServerConfigFromId(serverId);
}
return serverConfig;
}
@@ -291,6 +241,11 @@ function getGlobalConfig() {
// ===========================================================================
/**
*
* @return {number} - This server's ID
*
*/
function getServerId() {
return getServerConfig().databaseId;
}
@@ -312,9 +267,8 @@ function setTimeCommand(command, params, client) {
return false;
}
let splitParams = params.split(" ");
let hour = toInteger(splitParams[0]);
let minute = toInteger(splitParams[1]) || 0;
let hour = toInteger(getParam(params, " ", 1));
let minute = toInteger(getParam(params, " ", 2)) || 0;
if(hour > 23 || hour < 0) {
messagePlayerError(client, "The hour must be between 0 and 23!");
@@ -385,8 +339,7 @@ function setWeatherCommand(command, params, client) {
return false;
}
let splitParams = params.split(" ");
let weatherId = getWeatherFromParams(splitParams[0]);
let weatherId = getWeatherFromParams(getParam(params, " ", 1));
if(!weatherId) {
messagePlayerError(client, `That weather ID or name is invalid!`);
@@ -421,12 +374,24 @@ function setSnowingCommand(command, params, client) {
}
let splitParams = params.split(" ");
let falling = toInteger(splitParams[0]);
let ground = toInteger(splitParams[1]);
let falling = toInteger(getParam(params, " ", 1));
let ground = toInteger(getParam(params, " ", 2));
getServerConfig().fallingSnow = intToBool(falling);
getServerConfig().groundSnow = intToBool(ground);
if(falling == true && doesServerHaveFallingSnowEnabled()) {
getServerConfig().settings = removeBitFlag(getServerConfig().settings, getServerSettingsFlagValue("FallingSnow"));
} else if(falling == false && !doesServerHaveFallingSnowEnabled()) {
getServerConfig().settings = addBitFlag(getServerConfig().settings, getServerSettingsFlagValue("FallingSnow"));
}
if(ground == true && doesServerHaveGroundSnowEnabled()) {
getServerConfig().settings = removeBitFlag(getServerConfig().settings, getServerSettingsFlagValue("GroundSnow"));
} else if(ground == false && !doesServerHaveGroundSnowEnabled()) {
getServerConfig().settings = addBitFlag(getServerConfig().settings, getServerSettingsFlagValue("GroundSnow"));
}
updatePlayerSnowState(null);
getServerConfig().needsSaved = true;
@@ -454,9 +419,9 @@ function setServerGUIColoursCommand(command, params, client) {
}
let splitParams = params.split(" ");
let colourRed = toInteger(splitParams[0]) || 255;
let colourGreen = toInteger(splitParams[1]) || 255;
let colourBlue = toInteger(splitParams[2]) || 255;
let colourRed = toInteger(getParam(params, " ", 1)) || 255;
let colourGreen = toInteger(getParam(params, " ", 2)) || 255;
let colourBlue = toInteger(getParam(params, " ", 3)) || 255;
getServerConfig().guiColour = [colourRed, colourGreen, colourBlue];
@@ -484,12 +449,18 @@ function setServerGUIColoursCommand(command, params, client) {
*
*/
function toggleServerLogoCommand(command, params, client) {
getServerConfig().useLogo = !getServerConfig().useLogo;
if(doesServerHaveServerLogoEnabled()) {
getServerConfig().settings = removeBitFlag(getServerConfig().settings, getServerSettingsFlagValue("ServerLogo"));
getServerConfig().useLogo = false;
} else {
getServerConfig().settings = addBitFlag(getServerConfig().settings, getServerSettingsFlagValue("ServerLogo"));
getServerConfig().useLogo = true;
}
getServerConfig().needsSaved = true;
updatePlayerShowLogoState(null, getServerConfig().useLogo);
messageAdminAction(`${getPlayerName(client)} {MAINCOLOUR}turned the server logo image ${getBoolRedGreenInlineColour(getServerConfig().useLogo)}${toUpperCase(getOnOffFromBool(getServerConfig().useLogo))}`);
messageAdminAction(`${getPlayerName(client)} {MAINCOLOUR}turned the server logo image ${getBoolRedGreenInlineColour(doesServerHaveServerLogoEnabled())}${toUpperCase(getOnOffFromBool(getServerConfig().useLogo))}`);
updateServerRules();
return true;
}
@@ -506,10 +477,16 @@ function toggleServerLogoCommand(command, params, client) {
*
*/
function toggleServerJobBlipsCommand(command, params, client) {
getServerConfig().createJobBlips = !getServerConfig().createJobBlips;
if(doesServerHaveJobBlipsEnabled()) {
getServerConfig().settings = removeBitFlag(getServerConfig().settings, getServerSettingsFlagValue("JobBlips"));
getServerConfig().createJobBlips = false;
} else {
getServerConfig().settings = addBitFlag(getServerConfig().settings, getServerSettingsFlagValue("JobBlips"));
getServerConfig().createJobBlips = true;
}
getServerConfig().needsSaved = true;
messageAdminAction(`${getPlayerName(client)} {MAINCOLOUR}turned ${getBoolRedGreenInlineColour(getServerConfig().createJobBlips)}${toUpperCase(getOnOffFromBool(getServerConfig().createJobBlips))} {MAINCOLOUR}all job blips`);
messageAdminAction(`${getPlayerName(client)} {MAINCOLOUR}turned ${getBoolRedGreenInlineColour(doesServerHaveJobBlipsEnabled())}${toUpperCase(getOnOffFromBool(getServerConfig().createJobBlips))} {MAINCOLOUR}all job blips`);
resetAllJobBlips();
return true;
}
@@ -526,10 +503,16 @@ function toggleServerLogoCommand(command, params, client) {
*
*/
function toggleServerJobPickupsCommand(command, params, client) {
getServerConfig().createJobPickups = !getServerConfig().createJobPickups;
if(doesServerHaveJobPickupsEnabled()) {
getServerConfig().settings = removeBitFlag(getServerConfig().settings, getServerSettingsFlagValue("JobPickups"));
getServerConfig().createJobPickups = false;
} else {
getServerConfig().settings = addBitFlag(getServerConfig().settings, getServerSettingsFlagValue("JobPickups"));
getServerConfig().createJobPickups = true;
}
getServerConfig().needsSaved = true;
messageAdminAction(`${getPlayerName(client)} {MAINCOLOUR}turned ${getBoolRedGreenInlineColour(getServerConfig().createJobPickups)}${toUpperCase(getOnOffFromBool(getServerConfig().createJobPickups))} {MAINCOLOUR}all job pickups`);
messageAdminAction(`${getPlayerName(client)} {MAINCOLOUR}turned ${getBoolRedGreenInlineColour(doesServerHaveJobPickupsEnabled())}${toUpperCase(getOnOffFromBool(getServerConfig().createJobPickups))} {MAINCOLOUR}all job pickups`);
resetAllJobPickups();
return true;
}
@@ -546,10 +529,16 @@ function toggleServerLogoCommand(command, params, client) {
*
*/
function toggleServerBusinessBlipsCommand(command, params, client) {
getServerConfig().createBusinessBlips = !getServerConfig().createBusinessBlips;
if(doesServerHaveBusinessBlipsEnabled()) {
getServerConfig().settings = removeBitFlag(getServerConfig().settings, getServerSettingsFlagValue("BusinessBlips"));
getServerConfig().createBusinessBlips = false;
} else {
getServerConfig().settings = addBitFlag(getServerConfig().settings, getServerSettingsFlagValue("BusinessBlips"));
getServerConfig().createBusinessBlips = true;
}
getServerConfig().needsSaved = true;
messageAdminAction(`${getPlayerName(client)} {MAINCOLOUR}turned ${getBoolRedGreenInlineColour(getServerConfig().createBusinessBlips)}${toUpperCase(getOnOffFromBool(getServerConfig().createBusinessBlips))} {MAINCOLOUR}all business blips`);
messageAdminAction(`${getPlayerName(client)} {MAINCOLOUR}turned ${getBoolRedGreenInlineColour(doesServerHaveBusinessBlipsEnabled())}${toUpperCase(getOnOffFromBool(getServerConfig().createBusinessBlips))} {MAINCOLOUR}all business blips`);
resetAllBusinessBlips();
return true;
}
@@ -566,10 +555,16 @@ function toggleServerLogoCommand(command, params, client) {
*
*/
function toggleServerBusinessPickupsCommand(command, params, client) {
getServerConfig().createBusinessPickups = !getServerConfig().createBusinessPickups;
if(doesServerHaveBusinessPickupsEnabled()) {
getServerConfig().settings = removeBitFlag(getServerConfig().settings, getServerSettingsFlagValue("BusinessPickups"));
getServerConfig().createBusinessPickups = false;
} else {
getServerConfig().settings = addBitFlag(getServerConfig().settings, getServerSettingsFlagValue("BusinessPickups"));
getServerConfig().createBusinessPickups = true;
}
getServerConfig().needsSaved = true;
messageAdminAction(`${getPlayerName(client)} {MAINCOLOUR}turned ${getBoolRedGreenInlineColour(getServerConfig().createBusinessPickups)}${toUpperCase(getOnOffFromBool(getServerConfig().createBusinessPickups))} {MAINCOLOUR}all business pickups`);
messageAdminAction(`${getPlayerName(client)} {MAINCOLOUR}turned ${getBoolRedGreenInlineColour(doesServerHaveBusinessPickupsEnabled())}${toUpperCase(getOnOffFromBool(getServerConfig().createBusinessPickups))} {MAINCOLOUR}all business pickups`);
resetAllBusinessPickups();
return true;
}
@@ -586,10 +581,16 @@ function toggleServerLogoCommand(command, params, client) {
*
*/
function toggleServerHouseBlipsCommand(command, params, client) {
getServerConfig().createHouseBlips = !getServerConfig().createHouseBlips;
if(doesServerHaveHouseBlipsEnabled()) {
getServerConfig().settings = removeBitFlag(getServerConfig().settings, getServerSettingsFlagValue("HousePickups"));
getServerConfig().createHouseBlips = false;
} else {
getServerConfig().settings = addBitFlag(getServerConfig().settings, getServerSettingsFlagValue("HouseBlips"));
getServerConfig().createHousePickups = true;
}
getServerConfig().needsSaved = true;
messageAdminAction(`${getPlayerName(client)} {MAINCOLOUR}turned ${getBoolRedGreenInlineColour(getServerConfig().createHouseBlips)}${toUpperCase(getOnOffFromBool(getServerConfig().createHouseBlips))} {MAINCOLOUR}all house blips`);
messageAdminAction(`${getPlayerName(client)} {MAINCOLOUR}turned ${getBoolRedGreenInlineColour(doesServerHaveHouseBlipsEnabled())}${toUpperCase(getOnOffFromBool(getServerConfig().createHouseBlips))} {MAINCOLOUR}all house blips`);
resetAllHouseBlips();
return true;
}
@@ -606,10 +607,16 @@ function toggleServerLogoCommand(command, params, client) {
*
*/
function toggleServerHousePickupsCommand(command, params, client) {
getServerConfig().createHousePickups = !getServerConfig().createHousePickups;
if(doesServerHaveHousePickupsEnabled()) {
getServerConfig().settings = removeBitFlag(getServerConfig().settings, getServerSettingsFlagValue("HousePickups"));
getServerConfig().createHousePickups = false;
} else {
getServerConfig().settings = addBitFlag(getServerConfig().settings, getServerSettingsFlagValue("HousePickups"));
getServerConfig().createHousePickups = true;
}
getServerConfig().needsSaved = true;
messageAdminAction(`${getPlayerName(client)} {MAINCOLOUR}turned ${getBoolRedGreenInlineColour(getServerConfig().createHousePickups)}${toUpperCase(getOnOffFromBool(getServerConfig().createHousePickups))} {MAINCOLOUR}all house pickups`);
messageAdminAction(`${getPlayerName(client)} {MAINCOLOUR}turned ${getBoolRedGreenInlineColour(doesServerHaveHousePickupsEnabled())}${toUpperCase(getOnOffFromBool(getServerConfig().createHousePickups))} {MAINCOLOUR}all house pickups`);
resetAllHousePickups();
return true;
}
@@ -626,10 +633,17 @@ function toggleServerLogoCommand(command, params, client) {
*
*/
function toggleServerGUICommand(command, params, client) {
getServerConfig().useGUI = !getServerConfig().useGUI;
if(doesServerHaveGUIEnabled()) {
getServerConfig().settings = removeBitFlag(getServerConfig().settings, getServerSettingsFlagValue("GUI"));
getServerConfig().useGUI = false;
} else {
getServerConfig().settings = addBitFlag(getServerConfig().settings, getServerSettingsFlagValue("GUI"));
getServerConfig().useGUI = true;
}
getServerConfig().needsSaved = true;
messageAdminAction(`${getPlayerName(client)} {MAINCOLOUR}turned GUI ${toLowerCase(getOnOffFromBool(getServerConfig().useGUI))} for this server`);
messageAdminAction(`${getPlayerName(client)} {MAINCOLOUR}turned GUI ${toLowerCase(getOnOffFromBool(doesServerHaveGUIEnabled()))} for this server`);
updateServerRules();
return true;
}
@@ -646,10 +660,17 @@ function toggleServerGUICommand(command, params, client) {
*
*/
function toggleServerUseRealWorldTimeCommand(command, params, client) {
getServerConfig().useRealTime = !getServerConfig().useRealTime;
if(doesServerHaveRealTimeEnabled()) {
getServerConfig().settings = removeBitFlag(getServerConfig().settings, getServerSettingsFlagValue("RealTime"));
getServerConfig().useRealTime = false;
} else {
getServerConfig().settings = addBitFlag(getServerConfig().settings, getServerSettingsFlagValue("RealTime"));
getServerConfig().useRealTime = true;
}
getServerConfig().needsSaved = true;
messageAdminAction(`${getPlayerName(client)} {MAINCOLOUR}turned real-world time ${toLowerCase(getOnOffFromBool(getServerConfig().useRealTime))} for this server (GMT ${addPositiveNegativeSymbol(getServerConfig().realTimeZone)})`);
messageAdminAction(`${getPlayerName(client)} {MAINCOLOUR}turned real-world time ${toLowerCase(getOnOffFromBool(doesServerHaveRealTimeEnabled()))} for this server (GMT ${addPositiveNegativeSymbol(getServerConfig().realTimeZone)})`);
updateServerGameTime();
updateServerRules();
return true;
@@ -752,4 +773,97 @@ function getServerIntroMusicURL() {
return getServerConfig().introMusicURL;
}
// ===========================================================================
function loadLocaleConfig() {
let localeConfig = JSON.parse(loadTextFile(`config/locale.json`));
if(localeConfig != null) {
return localeConfig;
}
}
// ===========================================================================
function loadEconomyConfig() {
let economyConfig = JSON.parse(loadTextFile(`config/economy.json`));
if(economyConfig != null) {
return economyConfig;
}
}
// ===========================================================================
function loadAccentConfig() {
let accentConfig = JSON.parse(loadTextFile(`config/accents.json`));
if(accentConfig != null) {
return accentConfig;
}
}
// ===========================================================================
function doesServerHaveGUIEnabled() {
return hasBitFlag(getServerConfig().settings, getServerSettingsFlagValue("GUI"));
}
// ===========================================================================
function doesServerHaveTesterOnlyEnabled() {
return hasBitFlag(getServerConfig().settings, getServerSettingsFlagValue("Testing"));
}
// ===========================================================================
function doesServerHaveRealTimeEnabled() {
return hasBitFlag(getServerConfig().settings, getServerSettingsFlagValue("RealTime"));
}
// ===========================================================================
function doesServerHaveBusinessPickupsEnabled() {
return hasBitFlag(getServerConfig().settings, getServerSettingsFlagValue("BusinessPickups"));
}
// ===========================================================================
function doesServerHaveHousePickupsEnabled() {
return hasBitFlag(getServerConfig().settings, getServerSettingsFlagValue("HousePickups"));
}
// ===========================================================================
function doesServerHaveJobPickupsEnabled() {
return hasBitFlag(getServerConfig().settings, getServerSettingsFlagValue("JobPickups"));
}
// ===========================================================================
function doesServerHaveBusinesBlipsEnabled() {
return hasBitFlag(getServerConfig().settings, getServerSettingsFlagValue("BusinessBlips"));
}
// ===========================================================================
function doesServerHaveHouseBlipsEnabled() {
return hasBitFlag(getServerConfig().settings, getServerSettingsFlagValue("HouseBlips"));
}
// ===========================================================================
function doesServerHaveJobBlipsEnabled() {
return hasBitFlag(getServerConfig().settings, getServerSettingsFlagValue("JobBlips"));
}
// ===========================================================================
function doesServerHaveFallingSnowEnabled() {
return hasBitFlag(getServerConfig().settings, getServerSettingsFlagValue("FallingSnow"));
}
// ===========================================================================
function doesServerHaveGroundSnowEnabled() {
return hasBitFlag(getServerConfig().settings, getServerSettingsFlagValue("GroundSnow"));
}
// ===========================================================================

View File

@@ -23,6 +23,7 @@ const VRR_JOB_GARBAGE = 6;
const VRR_JOB_WEAPON = 7;
const VRR_JOB_DRUG = 8;
const VRR_JOB_PIZZA = 9;
const VRR_JOB_GENERIC = 10;
// Pickup Types
const VRR_PICKUP_NONE = 0;
@@ -64,20 +65,22 @@ const VRR_GATEOWNER_PLAYER = 1; // Owner is a player (character/
const VRR_GATEOWNER_JOB = 2; // Owned by a job
const VRR_GATEOWNER_CLAN = 3; // Owned by a clan
const VRR_GATEOWNER_FACTION = 4; // Owned by a faction
const VRR_GATEOWNER_PUBLIC = 5; // Is a public gate. Technically not owned. This probably won't be used.
const VRR_GATEOWNER_PUBLIC = 5; // Public gate. Technically not owned. This probably won't be used.
const VRR_GATEOWNER_BUSINESS = 6; // Owned by a business. Back lots, unloading areas, and other stuff like that
const VRR_GATEOWNER_HOUSE = 7; // Owned by a house. Like for mansions with closed private areas.
// Business Location Types
const VRR_BIZLOC_NONE = 0; // None
const VRR_BIZLOC_MAINDOOR = 0; // Main entrance/exit
const VRR_BIZLOC_DOOR = 1; // Any other entrance/exit
const VRR_BIZLOC_FUEL = 2; // Fuel pump
const VRR_BIZLOC_DRIVETHRU = 3; // Drivethrough
const VRR_BIZLOC_VENDMACHINE = 4; // Vending machine
const VRR_BIZLOC_GATE = 1; // Center of any moveable gate that belongs to the biz
const VRR_BIZLOC_GARAGE = 2; // Location for attached garage (pos1 = outside, pos2 = inside). Use pos to teleport or spawn veh/ped
const VRR_BIZLOC_FUEL = 3; // Fuel pump
const VRR_BIZLOC_DRIVETHRU = 4; // Drivethrough
const VRR_BIZLOC_VENDMACHINE = 5; // Vending machine
// House Location Types
const VRR_HOUSELOC_NONE = 0; // None
const VRR_HOUSELOC_MAINDOOR = 0; // Main entrance/exit
const VRR_HOUSELOC_DOOR = 1; // Any other entrance/exit
const VRR_HOUSELOC_GATE = 1; // Center of any moveable gate that belongs to the house
const VRR_HOUSELOC_GARAGE = 2; // Location for garage (pos1 = outside, pos2 = inside). Use pos to teleport or spawn veh/ped
// Account Contact Types
const VRR_CONTACT_NONE = 0;
@@ -149,7 +152,7 @@ const VRR_ISLAND_VICEEAST = 1; // Eastern Island of VC
const VRR_ISLAND_LOSSANTOS = 0; // Los Santos
const VRR_ISLAND_LASVENTURAS = 1; // Las Venturas
const VRR_ISLAND_SANFIERRO = 2; // San Fierro
const VRR_ISLAND_REDCOUNTYNORTH = 4; // Red County North (spans all the way from Palamino/shore on the east east to border of Flint Co on the west)
const VRR_ISLAND_REDCOUNTYNORTH = 4; // Red County North (spans all the way from Palamino/shore on the east east to border of Flint County on the west)
const VRR_ISLAND_BONECOUNTYNORTH = 5; // Bone County North (usually called Tierra Robada)
const VRR_ISLAND_BONECOUNTYSOUTH = 6; // Bone County South
@@ -204,23 +207,25 @@ const VRR_ITEM_USETYPE_WALKIETALKIE = 31; //
const VRR_ITEM_USETYPE_BOOMBOX = 32; //
const VRR_ITEM_USETYPE_EARBUDS = 33; //
const VRR_ITEM_USETYPE_BADGE = 34; //
const VRR_ITEM_USETYPE_DRINK = 35; //
const VRR_ITEM_USETYPE_EXTINGUISHER = 36; //
const VRR_ITEM_USETYPE_SPRAYPAINT = 37; //
const VRR_ITEM_USETYPE_PEPPERSPRAY = 38; //
const VRR_ITEM_USETYPE_FLASHLIGHT = 39; //
const VRR_ITEM_USETYPE_AIRPLANETICKET = 40; //
const VRR_ITEM_USETYPE_TRAINTICKET = 41; //
const VRR_ITEM_USETYPE_VEHUPGRADE_PART = 42; //
const VRR_ITEM_USETYPE_VEHTIRE = 43; //
const VRR_ITEM_USETYPE_FUELCAN = 44; //
const VRR_ITEM_USETYPE_VEHCOLOUR = 45; //
const VRR_ITEM_USETYPE_VEHLIVERY = 46; //
const VRR_ITEM_USETYPE_VEHREPAIR = 47; //
const VRR_ITEM_USETYPE_SMOKEDRUG = 48; //
const VRR_ITEM_USETYPE_SNORTDRUG = 49; //
const VRR_ITEM_USETYPE_PLANT = 50;
const VRR_ITEM_USETYPE_MEGAPHONE = 51;
const VRR_ITEM_USETYPE_DRINK = 35; // Drinkable item. Action output shows "Player_Name drinks some (drink name)"
const VRR_ITEM_USETYPE_EXTINGUISHER = 36; // Extinguisher item. Allows putting out fires
const VRR_ITEM_USETYPE_SPRAYPAINT = 37; // Spraypaint item. Allows spraying custom clan tags on walls
const VRR_ITEM_USETYPE_PEPPERSPRAY = 38; // Pepper spray item. Incapacitates nearby player
const VRR_ITEM_USETYPE_FLASHLIGHT = 39; // Flashlight item. Unusable for now, but plan to cast a custom light beam
const VRR_ITEM_USETYPE_AIRPLANETICKET = 40; // Airplane ticket. Allows a character to move to another server
const VRR_ITEM_USETYPE_TRAINTICKET = 41; // Train ticket. Allows a character to move to another server
const VRR_ITEM_USETYPE_VEHUPGRADE_PART = 42; // Vehicle update part item. Allows adding custom parts like spoilers, side skirts, roof scoops, etc
const VRR_ITEM_USETYPE_VEHTIRE = 43; // Vehicle tire item. Allows changing the tire/rim types
const VRR_ITEM_USETYPE_FUELCAN = 44; // Fuel can item. Allows refueling of a nearby vehicle anywhere
const VRR_ITEM_USETYPE_VEHCOLOUR = 45; // Vehicle colour item. Changes primary and secondary vehicle colours
const VRR_ITEM_USETYPE_VEHLIVERY = 46; // Vehicle livery/paintjob item. Applies decals and special paint jobs
const VRR_ITEM_USETYPE_VEHREPAIR = 47; // Vehicle repair item. Much longer use time
const VRR_ITEM_USETYPE_SMOKEDRUG = 48; // Smokable drug. Action output shows "Player_Name smokes some (drug)"
const VRR_ITEM_USETYPE_SNORTDRUG = 49; // Snortable drug. Action output shows "Player_Name snorts some (drug)"
const VRR_ITEM_USETYPE_PLANT = 50; // Plantable item. Pot plants, coke plants, etc
const VRR_ITEM_USETYPE_MEGAPHONE = 51; // Megaphone item. Allows shouting over greater distances. Also called a bullhorn
const VRR_ITEM_USETYPE_INJECTDRUG = 52; // Injectable drug. Action output shows "Player_Name injects some (drug)"
const VRR_ITEM_USETYPE_ALCOHOL = 53; // Alcohol. Applies an intoxication/drunkness effect
// Item Drop Types
const VRR_ITEM_DROPTYPE_NONE = 0; // Can't be dropped
@@ -286,15 +291,18 @@ const VRR_PEDSTATE_INITEM = 12; // In item (crate, box, etc)
const VRR_PEDSTATE_HANDSUP = 13; // Has hands up (surrendering)
const VRR_PEDSTATE_SPAWNING = 14; // Spawning
// Two-Factor Authentication States
const VRR_2FA_STATE_NONE = 0; // None
const VRR_2FA_STATE_CODEINPUT = 1; // Waiting on player to enter code to play
const VRR_2FA_STATE_SETUP_CODETOAPP = 2; // Providing player with a code to put in their auth app
const VRR_2FA_STATE_SETUP_CODEFROMAPP = 3; // Waiting on player to enter code from auth app to set up
const VRR_FORGOTPASS_STATE_NONE = 0; // None
const VRR_FORGOTPASS_STATE_CODEINPUT = 1; // Waiting on player to enter code sent via email
const VRR_FORGOTPASS_STATE_SETPASS = 2; // Waiting on player to enter new password
// Reset Password States
const VRR_RESETPASS_STATE_NONE = 0; // None
const VRR_RESETPASS_STATE_CODEINPUT = 1; // Waiting on player to enter code sent via email
const VRR_RESETPASS_STATE_SETPASS = 2; // Waiting on player to enter new password
// NPC Trigger Condition Match Types
const VRR_NPC_COND_MATCH_NONE = 0; // None (invalid)
const VRR_NPC_COND_MATCH_EQ = 1; // Must be equal to
const VRR_NPC_COND_MATCH_GT = 2; // Must be greater than
@@ -306,24 +314,36 @@ const VRR_NPC_COND_MATCH_CONTAINS_CASE = 7; // Must contain string (case se
const VRR_NPC_COND_MATCH_EXACT = 8; // Must match string exactly (case insensitive)
const VRR_NPC_COND_MATCH_EXACT_CASE = 9; // Must match string exactly (case insensitive)
// Business Types
const VRR_BIZ_TYPE_NONE = 0; // None (invalid)
const VRR_BIZ_TYPE_NORMAL = 1; // Normal business (sells items)
const VRR_BIZ_TYPE_BANK = 2; // Bank
const VRR_BIZ_TYPE_PUBLIC = 3; // Public business (Government, public service, etc)
// Return-To types (for when a player is teleported)
const VRR_RETURNTO_TYPE_NONE = 0; // "Return to" data is invalid
const VRR_RETURNTO_TYPE_ADMINGET = 1; // "Return to" data is from admin teleporting
const VRR_RETURNTO_TYPE_SKINSELECT = 2; // "Return to" data is from skin select
const VRR_DECKCARD_GAME_NONE = 0;
const VRR_DECKCARD_GAME_BLACKJACK = 1;
const VRR_DECKCARD_GAME_TEXASHOLDEM = 2;
const VRR_DECKCARD_GAME_FIVECARDDRAW = 3;
const VRR_DECKCARD_GAME_FIVECARDSTUD = 4;
const VRR_DECKCARD_GAME_HIGHLOW = 5;
// Card Game Types
const VRR_DECKCARD_GAME_NONE = 0; // None (invalid)
const VRR_DECKCARD_GAME_BLACKJACK = 1; // Blackjack
const VRR_DECKCARD_GAME_TEXASHOLDEM = 2; // Texas Hold-em
const VRR_DECKCARD_GAME_FIVECARDDRAW = 3; // Five Card Draw
const VRR_DECKCARD_GAME_FIVECARDSTUD = 4; // Five Card Stud
const VRR_DECKCARD_GAME_HIGHLOW = 5; // High-Low (Also known as War)
const VRR_DECKCARD_SUIT_NONE = 0;
const VRR_DECKCARD_SUIT_SPADE = 1;
const VRR_DECKCARD_SUIT_CLUB = 2;
const VRR_DECKCARD_SUIT_HEART = 3;
const VRR_DECKCARD_SUIT_DIAMOND = 4;
// Card Suits
const VRR_DECKCARD_SUIT_NONE = 0; // None (invalid)
const VRR_DECKCARD_SUIT_SPADE = 1; // Spades
const VRR_DECKCARD_SUIT_CLUB = 2; // Clubs
const VRR_DECKCARD_SUIT_HEART = 3; // Hearts
const VRR_DECKCARD_SUIT_DIAMOND = 4; // Diamonds
// GPS State Types
const VRR_GPS_TYPE_NONE = 0; // None (invalid)
const VRR_GPS_TYPE_BUSINESS = 1; // Business
const VRR_GPS_TYPE_POLICE = 2; // Police Station
const VRR_GPS_TYPE_HOSPITAL = 3; // Hospital
const VRR_GPS_TYPE_JOB = 4; // Job
const VRR_GPS_TYPE_GAMELOC = 5; // Game Location

View File

@@ -18,7 +18,6 @@ let serverData = {
clients: new Array(128),
businesses: [],
houses: [],
factions: [],
commands: {},
groundItemCache: [],
groundPlantCache: [],
@@ -30,31 +29,8 @@ let serverData = {
blackListedGameScripts: [],
},
localeStrings: {},
jobRankNames: [
[
"Police Officer I",
"Detective",
"Sergeant",
"Lieutenant",
"Captain",
"Chief of Police",
],
[
"Paramedic",
"Senior Paramedic",
"Lieutenant",
"Lieutenant",
"Captain",
"Chief of Department",
],
[
"Firefighter",
"Senior Firefighter",
"Fire Marshal",
"Captain",
"Chief of Department",
]
]
cachedTranslations: [],
cachedTranslationFrom: [],
};
// ===========================================================================
@@ -65,11 +41,6 @@ let allowedSkins = getAllowedSkins(getGame());
// ===========================================================================
function initServerData() {
// Pre-allocate translation cache language slots
//getServerData().translation.cache = new Array(getServerData().translation.languages.length);
//let translationCacheFrom = new Array(getServerData().translation.languages.length);
//translationCacheFrom.fill([]);
//getServerData().translation.cache.fill(translationCacheFrom);
}
// ===========================================================================

View File

@@ -21,228 +21,3 @@ function initDatabaseScript() {
// ===========================================================================
function connectToDatabase() {
if(databaseConfig.usePersistentConnection) {
if(persistentDatabaseConnection == null) {
logToConsole(LOG_DEBUG, "[VRR.Database] Initializing database connection ...");
persistentDatabaseConnection = module.mysql.connect(databaseConfig.host, databaseConfig.user, databaseConfig.pass, databaseConfig.name, databaseConfig.port);
if(persistentDatabaseConnection.error) {
console.warn("[VRR.Database] Database connection error: " + toString(persistentDatabaseConnection.error));
persistentDatabaseConnection = null;
return false;
}
logToConsole(LOG_DEBUG, "[VRR.Database] Database connection successful!");
return persistentDatabaseConnection;
} else {
logToConsole(LOG_DEBUG, "[VRR.Database] Using existing database connection.");
return persistentDatabaseConnection;
}
} else {
let databaseConnection = module.mysql.connect(databaseConfig.host, databaseConfig.user, databaseConfig.pass, databaseConfig.name, databaseConfig.port);
if(databaseConnection.error) {
console.warn("[VRR.Database] Database connection error: " + toString(persistentDatabaseConnection.error));
return false;
} else {
return databaseConnection;
}
}
}
// ===========================================================================
function disconnectFromDatabase(dbConnection) {
if(!databaseConfig.usePersistentConnection) {
try {
dbConnection.close();
logToConsole(LOG_DEBUG, `[VRR.Database] Database connection closed successfully`);
} catch(error) {
logToConsole(LOG_ERROR, `[VRR.Database] Database connection could not be closed! (Error: ${error})`);
}
}
return true;
}
// ===========================================================================
function queryDatabase(dbConnection, queryString) {
logToConsole(LOG_DEBUG, `[VRR.Database] Query string: ${queryString}`);
return dbConnection.query(queryString);
}
// ===========================================================================
function escapeDatabaseString(dbConnection, unsafeString = "") {
if(!dbConnection) {
dbConnection = connectToDatabase();
}
if(typeof unsafeString == "string") {
return dbConnection.escapeString(unsafeString);
}
return unsafeString;
}
// ===========================================================================
function getDatabaseInsertId(dbConnection) {
return dbConnection.insertId;
}
// ===========================================================================
function getQueryNumRows(dbQuery) {
return dbQuery.numRows;
}
// ===========================================================================
function getDatabaseError(dbConnection) {
return dbConnection.error;
}
// ===========================================================================
function freeDatabaseQuery(dbQuery) {
if(dbQuery != null) {
dbQuery.free();
}
return;
}
// ===========================================================================
function fetchQueryAssoc(dbQuery) {
return dbQuery.fetchAssoc();
}
// ===========================================================================
function quickDatabaseQuery(queryString) {
let dbConnection = connectToDatabase();
let insertId = 0;
if(dbConnection) {
//logToConsole(LOG_DEBUG, `[VRR.Database] Query string: ${queryString}`);
let dbQuery = queryDatabase(dbConnection, queryString);
if(getDatabaseInsertId(dbConnection)) {
insertId = getDatabaseInsertId(dbConnection);
logToConsole(LOG_DEBUG, `[VRR.Database] Query returned insert id ${insertId}`);
}
if(dbQuery) {
try {
freeDatabaseQuery(dbQuery);
logToConsole(LOG_DEBUG, `[VRR.Database] Query result free'd successfully`);
} catch(error) {
logToConsole(LOG_ERROR, `[VRR.Database] Query result could not be free'd! (Error: ${error})`);
}
}
disconnectFromDatabase(dbConnection);
if(insertId != 0) {
return insertId;
}
return true;
}
return false;
}
// ===========================================================================
function executeDatabaseQueryCommand(command, params, client) {
if(areParamsEmpty(params)) {
messagePlayerSyntax(client, getCommandSyntaxText(command));
return false;
}
if(!targetClient) {
messagePlayerError(client, "That player was not found!");
return false;
}
if(targetCode == "") {
messagePlayerError(client, "You didn't enter any code!");
return false;
}
let success = quickDatabaseQuery(params);
if(!success) {
messagePlayerAlert(client, `Database query failed to execute: {ALTCOLOUR}${query}`);
} else if(typeof success != "boolean") {
messagePlayeSuccess(client, `Database query successful: {ALTCOLOUR}${query}`);
messagePlayerInfo(client, `Returns: ${success}`);
} else {
messagePlayerSuccess(client, `Database query successful: {ALTCOLOUR}${query}`);
}
return true;
}
// ===========================================================================
function setConstantsAsGlobalVariablesInDatabase() {
let dbConnection = connectToDatabase();
let entries = Object.entries(global);
for(let i in entries) {
logToConsole(LOG_DEBUG, `[VRR.Database] Checking entry ${i} (${entries[i]})`);
if(toString(i).slice(0, 3).indexOf("VRR_") != -1) {
logToConsole(LOG_DEBUG, `[VRR.Database] Adding ${i} (${entries[i]}) to database global variables`);
}
}
}
// ===========================================================================
function loadDatabaseConfiguration() {
let databaseConfigFile = loadTextFile("config/database.json");
return JSON.parse(databaseConfigFile);
}
// ===========================================================================
function createDatabaseInsertQuery(tableName, data) {
let fields = [];
let values = [];
for(let i in data) {
if(data[i][1] != "undefined" && data[i][1] != NaN && data[i][0] != 'NaN') {
if(data[i][1] != "undefined" && data[i][1] != NaN && data[i][1] != 'NaN') {
fields.push(data[i][0]);
if(typeof data[i][1] == "string") {
values.push(`'${data[i][1]}'`);
} else {
values.push(data[i][1]);
}
}
}
}
let queryString = `INSERT INTO ${tableName} (${fields.join(", ")}) VALUES (${values.join(", ")})`;
return queryString;
}
// ===========================================================================
function createDatabaseUpdateQuery(tableName, data, whereClause) {
let values = [];
for(let i in data) {
if(data[i][0] != "undefined" && data[i][0] != NaN && data[i][0] != 'NaN') {
if(data[i][1] != "undefined" && data[i][1] != NaN && data[i][1] != 'NaN') {
if(typeof data[i][1] == "string") {
values.push(`${data[i][0]}='${data[i][1]}'`);
} else {
values.push(`${data[i][0]}=${data[i][1]}`);
}
}
}
}
let queryString = `UPDATE ${tableName} SET ${values.join(", ")} WHERE ${whereClause}`;
return queryString;
}
// ===========================================================================

View File

@@ -119,7 +119,7 @@ function pvd(params) {
// ===========================================================================
function addServerLogLevelCommand(command, params, client) {
function addLogLevelCommand(command, params, client) {
if(areParamsEmpty(params)) {
messagePlayerSyntax(client, getCommandSyntaxText(command));
return false;
@@ -150,6 +150,8 @@ function addServerLogLevelCommand(command, params, client) {
return;
}
sendPlayerLogLevel(null, logLevel);
messageAdminAction(`{ALTCOLOUR}${getPlayerName(client)} {MAINCOLOUR}enabled log level {ALTCOLOUR}${toLowerCase(params)}`);
return true;
@@ -157,7 +159,7 @@ function addServerLogLevelCommand(command, params, client) {
// ===========================================================================
function getServerLogLevelCommand(command, params, client) {
function getLogLevelCommand(command, params, client) {
let logLevels = [];
if(hasBitFlag(logLevel, LOG_DEBUG)) {
@@ -187,7 +189,7 @@ function getServerLogLevelCommand(command, params, client) {
// ===========================================================================
function removeServerLogLevelCommand(command, params, client) {
function removeLogLevelCommand(command, params, client) {
if(areParamsEmpty(params)) {
messagePlayerSyntax(client, getCommandSyntaxText(command));
return false;
@@ -218,6 +220,8 @@ function removeServerLogLevelCommand(command, params, client) {
return;
}
sendPlayerLogLevel(null, logLevel);
messageAdminAction(`{ALTCOLOUR}${getPlayerName(client)} {MAINCOLOUR}disabled log level {ALTCOLOUR}${toLowerCase(params)}`);
return true;
@@ -243,9 +247,8 @@ function simulateCommandForPlayerCommand(command, params, client) {
return false;
}
let splitParams = params.split(" ");
let targetClient = getPlayerFromParams(splitParams[0]);
let tempCommand = splitParams[1];
let targetClient = getPlayerFromParams(getParam(params, " ", 1));
let tempCommand = getParam(params, " ", 2);
tempCommand.replace("/", "");
let tempParams = splitParams.slice(2).join(" ");
@@ -284,8 +287,7 @@ function simulateCommandForAllPlayersCommand(command, params, client) {
return false;
}
let splitParams = params.split(" ");
let tempCommand = splitParams[0];
let tempCommand = getParam(params, " ", 1);
tempCommand.replace("/", "");
let tempParams = splitParams.slice(1).join(" ");
@@ -335,12 +337,11 @@ function executeClientCodeCommand(command, params, client) {
return false;
}
let splitParams = params.split(" ");
let targetClient = getPlayerFromParams(splitParams[0]);
let targetClient = getPlayerFromParams(getParam(params, " ", 1));
let targetCode = splitParams.slice(1).join(" ");
if(!targetClient) {
messagePlayerError(client, "That player was not found!");
messagePlayerError(client, getLocaleString(client, "InvalidPlayer"));
return false;
}
@@ -358,6 +359,33 @@ function executeClientCodeCommand(command, params, client) {
// ===========================================================================
function setPlayerTesterStatusCommand(command, params, client) {
if(areParamsEmpty(params)) {
messagePlayerSyntax(client, getCommandSyntaxText(command));
return false;
}
let targetClient = getPlayerFromParams(params);
if(!targetClient) {
messagePlayerError(client, getLocaleString(client, "InvalidPlayer"));
return false;
}
if(!hasBitFlag(getPlayerData(targetClient).accountData.flags.moderation, getModerationFlagValue("IsTester"))) {
getPlayerData(targetClient).accountData.flags.moderation = addBitFlag(getPlayerData(targetClient).accountData.flags.moderation, getModerationFlagValue("IsTester"));
} else {
getPlayerData(targetClient).accountData.flags.moderation = removeBitFlag(getPlayerData(targetClient).accountData.flags.moderation, getModerationFlagValue("IsTester"));
}
let enabled = hasBitFlag(getPlayerData(targetClient).accountData.flags.moderation, getModerationFlagValue("IsTester"));
messageAdminAction(`{ALTCOLOUR}${client.name} ${getBoolRedGreenInlineColour(enabled)}${toUpperCase(getEnabledDisabledFromBool(enabled))} {ALTCOLOUR}${targetClient.name}'s {MAINCOLOUR}tester status`)
return true;
}
// ===========================================================================
function saveAllServerDataCommand(command, params, client) {
messageAdmins(`{clanOrange}Vortrex has forced a manual save of all data. Initiating ...`);
saveAllServerDataToDatabase();
@@ -375,8 +403,8 @@ function testEmailCommand(command, params, client) {
// ===========================================================================
function restartGameModeCommand(command, params, client) {
messagePlayerNormal(null, `{clanOrange}The server game mode is restarting!`, getColourByName("orange"));
consoleCommand("refresh");
messagePlayerNormal(null, `The server game mode is restarting!`, getColourByName("orange"));
consoleCommand("/refresh");
thisResource.restart();
return true;
}
@@ -521,12 +549,10 @@ function streamAudioURLToAllPlayersCommand(command, params, client) {
return false;
}
let splitParams = params.split(" ");
let url = splitParams[0];
let volume = splitParams[1];
let url = getParam(params, " ", 1);
let volume = getParam(params, " ", 2);
playRadioStreamForPlayer(null, url, false, volume);
//https://www.dropbox.com/s/xw4m0y0guyzrwkk/lets-get-ready-to-rumble.ogg?dl=0
}
// ===========================================================================
@@ -537,12 +563,54 @@ function streamAudioNameToAllPlayersCommand(command, params, client) {
return false;
}
let splitParams = params.split(" ");
let name = splitParams[0];
let volume = splitParams[1];
let name = getParam(params, " ", 1);
let volume = getParam(params, " ", 2);
playAudioFileForPlayer(null, name, false, volume);
//https://www.dropbox.com/s/xw4m0y0guyzrwkk/lets-get-ready-to-rumble.ogg?dl=0
}
// ===========================================================================
// ===========================================================================
function fixAllServerBlipsCommand(command, params, client) {
deleteAllBusinessBlips();
deleteAllJobBlips();
deleteAllHouseBlips();
let blips = getElementsByType(ELEMENT_BLIP);
blips.forEach((blip) => {
deleteGameElement(blip);
});
createAllJobBlips();
createAllBusinessBlips();
createAllHouseBlips();
}
// ===========================================================================
function fixAllServerPickupsCommand(command, params, client) {
let pickups = getElementsByType(ELEMENT_PICKUP);
pickups.forEach((pickup) => {
deleteGameElement(pickup);
});
createAllJobPickups();
createAllBusinessPickups();
createAllHousePickups();
}
// ===========================================================================
function resetAllServerAmbienceElementsCommand(command, params, client) {
clearTemporaryPeds();
cleartTemporaryVehicles();
}
// ===========================================================================
function reloadEconomyConfigurationCommand(command, params, client) {
getGlobalConfig().economy = loadEconomyConfig();
messageAdmins(`${client.name} {MAINCOLOUR}has reloaded the economy settings`);
}
// ===========================================================================

View File

@@ -30,8 +30,10 @@ function playerPayDay(client) {
let wealth = calculateWealth(client);
let grossIncome = getPlayerData(client).payDayAmount;
// Public Beta Bonus
// Passive income
grossIncome = grossIncome + getGlobalConfig().economy.passiveIncomePerPayDay;
// Payday bonus
grossIncome = grossIncome*getGlobalConfig().economy.grossIncomeMultiplier;
let incomeTaxAmount = calculateIncomeTax(wealth);
@@ -42,6 +44,30 @@ function playerPayDay(client) {
messagePlayerInfo(client, `Paycheck: {ALTCOLOUR}$${grossIncome}`);
messagePlayerInfo(client, `Taxes: {ALTCOLOUR}$${incomeTaxAmount}`);
messagePlayerInfo(client, `You receive: {ALTCOLOUR}$${netIncome}`);
if(netIncome < incomeTaxAmount) {
let totalCash = getPlayerCash(client);
let canPayNow = totalCash+netIncome;
if(incomeTaxAmount <= canPayNow) {
takePlayerCash(client, canPayNow);
messagePlayerInfo(client, `You covered the remaining taxes with {ALTCOLOUR}$${canPayNow} {MAINCOLOUR}in cash.`);
messagePlayerAlert(client, `{orange}You lost money since your taxes are more than your paycheck!`);
messagePlayerAlert(client, `{orange}If you don't have enough cash to cover taxes on next paycheck, you will lose stuff!`);
} else {
messagePlayerInfo(client, `{orange}You don't have enough cash to pay your taxes!`);
takePlayerCash(client, canPayNow);
let vehicleCount = getAllVehiclesOwnedByPlayer(client).length;
let houseCount = getAllHousesOwnedByPlayer(client).length;
let businessCount = getAllBusinessesOwnedByPlayer(client).length;
attemptRepossession(client, incomeTaxAmount-canPayNow);
let newVehicleCount = getAllVehiclesOwnedByPlayer(client).length;
let newHouseCount = getAllHousesOwnedByPlayer(client).length;
let newBusinessCount = getAllBusinessesOwnedByPlayer(client).length;
messagePlayerInfo(client, `{orange}You lost ${newVehicleCount-vehicleCount} vehicles, ${newHouseCount-houseCount} houses, and ${newBusinessCount-businessCount} businesses to cover the remaining tax.`);
}
}
givePlayerCash(client, netIncome);
}
@@ -84,4 +110,87 @@ function forcePlayerPayDayCommand(command, params, client) {
playerPayDay(targetClient);
}
// ===========================================================================
// ===========================================================================
function setPayDayBonusMultiplier(command, params, client) {
if(areParamsEmpty(params)) {
messagePlayerSyntax(client, getCommandSyntaxText(command));
return false;
}
let newMultiplier = params;
if(isNaN(newMultiplier)) {
messagePlayerError(client, getLocaleString(client, "AmountNotNumber"));
return false;
}
getGlobalConfig().economy.grossIncomeMultiplier = newMultiplier;
messageAdminAction(`${client.name} set payday bonus to ${newMultiplier*100}%`);
}
// ===========================================================================
function taxInfoCommand(command, params, client) {
let wealth = calculateWealth(client);
let tax = calculateIncomeTax(wealth);
messagePlayerInfo(client, `Your tax on payday is: $${tax}. Use {ALTCOLOUR}/help tax {MAINCOLOUR}for more information.`);
}
// ===========================================================================
function wealthInfoCommand(command, params, client) {
let wealth = calculateWealth(client);
messagePlayerInfo(client, `Your wealth is: $${wealth}. Use {ALTCOLOUR}/help wealth {MAINCOLOUR}for more information.`);
}
// ===========================================================================
function attemptRepossession(client, totalToPay) {
let leftToPay = totalToPay;
while(leftToPay > 0) {
let repossessionValue = repossessFirstAsset(client);
leftToPay = leftToPay - repossessionValue;
}
return true;
}
function repossessFirstAsset(client) {
let vehicles = getAllVehiclesOwnedByPlayer(client);
if(vehicles.length > 0) {
deleteVehicle(vehicles[0])
return getGlobalConfig().economy.upKeepCosts.upKeepPerVehicle;
}
let houses = getAllHousesOwnedByPlayer(client);
if(houses.length > 0) {
deleteHouse(houses[0].index);
return getGlobalConfig().economy.upKeepCosts.upKeepPerHouse;
}
let businesses = getAllBusinessesOwnedByPlayer(client);
if(businesses.length > 0) {
deleteBusiness(businesses[0].index);
return getGlobalConfig().economy.upKeepCosts.upKeepPerBusiness;
}
}
// ===========================================================================
function getAllVehiclesOwnedByPlayer(client) {
return getServerData().vehicles.filter((v) => v.ownerType == VRR_VEHOWNER_PLAYER && v.ownerId == getPlayerCurrentSubAccount(client).databaseId);
}
// ===========================================================================
function getAllBusinessesOwnedByPlayer(client) {
return getServerData().businesses.filter((b) => b.ownerType == VRR_BIZOWNER_PLAYER && b.ownerId == getPlayerCurrentSubAccount(client).databaseId);
}
// ===========================================================================
function getAllHousesOwnedByPlayer(client) {
return getServerData().houses.filter((h) => h.ownerType == VRR_HOUSEOWNER_PLAYER && h.ownerId == getPlayerCurrentSubAccount(client).databaseId);
}

View File

@@ -18,6 +18,7 @@ function initEventScript() {
function addAllEventHandlers() {
addEventHandler("onResourceStart", onResourceStart);
addEventHandler("onResourceStop", onResourceStop);
addEventHandler("onServerStop", onResourceStop);
addEventHandler("onProcess", onProcess);
addEventHandler("onEntityProcess", onEntityProcess);
@@ -74,6 +75,13 @@ function onElementStreamIn(event, element, client) {
//if(getPlayerDimension(client) != getElementDimension(element)) {
// event.preventDefault();
//}
if(getPlayerData(getClientFromIndex(element.owner)) != false ) {
if(hasBitFlag(getPlayerData(getClientFromIndex(element.owner)).accountData.flags.moderation, getModerationFlagValue("DontSyncClientElements"))) {
event.preventDefault();
destroyGameElement(element);
}
}
}
// ===========================================================================
@@ -87,6 +95,7 @@ function onElementStreamOut(event, element, client) {
function onPlayerQuit(event, client, quitReasonId) {
logToConsole(LOG_INFO, `👋 Client ${getPlayerDisplayForConsole(client)} disconnected (${disconnectReasons[quitReasonId]}[${quitReasonId}])`);
updateConnectionLogOnQuit(client, quitReasonId);
if(isPlayerLoggedIn(client)) {
messagePlayerNormal(null, `👋 ${getPlayerName(client)} has left the server (${disconnectReasons[quitReasonId]})`, getColourByName("softYellow"));
savePlayerToDatabase(client);
@@ -95,36 +104,17 @@ function onPlayerQuit(event, client, quitReasonId) {
}
messageDiscordEventChannel(`👋 ${getPlayerDisplayForConsole(client)} has left the server.`);
clearTemporaryVehicles();
clearTemporaryPeds();
}
// ===========================================================================
function onPlayerChat(event, client, messageText) {
async function onPlayerChat(event, client, messageText) {
event.preventDefault();
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(!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);
messagePlayerNormal(null, replaceColoursInMessage(`{MAINCOLOUR}💬 [${hexFromToColour(getPlayerColour(client))}]${getCharacterFullName(client)}: {MAINCOLOUR}${messageText}`), getPlayerColour(client));
messageDiscordChatChannel(`💬 ${getCharacterFullName(client)}: ${messageText}`);
processPlayerChat(client, messageText);
}
// ===========================================================================
@@ -135,9 +125,7 @@ function onProcess(event, deltaTime) {
//checkPlayerPedState();
//checkVehicleBurning();
getClients().forEach((client) => {
checkVehicleBuying(client);
});
processVehiclePurchasing();
}
// ===========================================================================
@@ -156,10 +144,6 @@ function onPedEnteringVehicle(event, ped, vehicle, seat) {
return false;
}
if(seat == 0) {
vehicle.engine = getVehicleData(vehicle).engine;
}
if(getVehicleData(vehicle).locked) {
if(doesPlayerHaveVehicleKeys(client, vehicle)) {
if(!doesPlayerHaveKeyBindsDisabled(client) && doesPlayerHaveKeyBindForCommand(client, "lock")) {
@@ -170,7 +154,13 @@ function onPedEnteringVehicle(event, ped, vehicle, seat) {
} else {
messagePlayerNormal(client, `🔒 This ${getVehicleName(vehicle)} is locked and you don't have the keys to unlock it`);
}
getPlayerData(client).enteringVehicle = null;
makePlayerStopAnimation(client);
return false;
}
getPlayerData(client).enteringVehicle = vehicle;
}
}
@@ -225,6 +215,7 @@ function onResourceStop(event, resource) {
clearArray(getServerData().itemTypes);
clearArray(getServerData().groundItemCache);
clearArray(getServerData().groundPlantCache);
kickAllClients();
}
collectAllGarbage();
@@ -275,21 +266,27 @@ async function onPlayerEnteredVehicle(client, clientVehicle, seat) {
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, `This ${getVehicleName(vehicle)} is for sale! Cost: {ALTCOLOUR}$${makeLargeNumberReadable(getVehicleData(vehicle).buyPrice)}`);
messagePlayerTip(client, `Use /vehbuy if you want to buy it.`);
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, `This ${getVehicleName(vehicle)} is for rent! Cost: {ALTCOLOUR}$${makeLargeNumberReadable(getVehicleData(vehicle).rentPrice)} per minute`);
messagePlayerTip(client, `Use /vehrent if you want to rent it.`);
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.`);
@@ -327,15 +324,17 @@ async function onPlayerEnteredVehicle(client, clientVehicle, seat) {
}
if(!getVehicleData(vehicle).engine) {
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.`);
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`);
}
} else {
messagePlayerAlert(client, `This ${getVehicleName(vehicle)}'s engine is off. Use /engine 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 and you don't have the keys to start it`);
}
}
resetVehiclePosition(vehicle);
}
@@ -387,7 +386,7 @@ function onPlayerExitedVehicle(client, vehicle) {
}
}
getVehicleData(vehicle).respawnTime = getCurrentUnixTimestamp() + getGlobalConfig().vehicleInactiveRespawnDelay;
getVehicleData(vehicle).lastActiveTime = getCurrentUnixTimestamp();
logToConsole(LOG_DEBUG, `[VRR.Event] ${getPlayerDisplayForConsole(client)} exited a ${getVehicleName(vehicle)} (ID: ${vehicle.getData("vrr.dataSlot")}, Database ID: ${getVehicleData(vehicle).databaseId})`);
}
@@ -415,6 +414,8 @@ function onPlayerDeath(client, position) {
fadeCamera(client, true, 1.0);
}
updatePlayerSpawnedState(client, true);
makePlayerStopAnimation(client);
setPlayerControlState(client, true);
} else {
let closestHospital = getClosestHospital(getPlayerPosition(client));
client.despawnPlayer();
@@ -426,6 +427,8 @@ function onPlayerDeath(client, position) {
fadeCamera(client, true, 1.0);
}
updatePlayerSpawnedState(client, true);
makePlayerStopAnimation(client);
setPlayerControlState(client, true);
}
}, 2000);
}, 1000);
@@ -522,9 +525,6 @@ function onPlayerSpawn(client) {
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] Updating all player name tags`);
updateAllPlayerNameTags();
logToConsole(LOG_DEBUG, `[VRR.Event] Sending ${getPlayerDisplayForConsole(client)}'s job type to their client (${getJobIndexFromDatabaseId(getPlayerCurrentSubAccount(client))})`);
sendPlayerJobType(client, getPlayerCurrentSubAccount(client).job);
@@ -552,9 +552,6 @@ function onPlayerSpawn(client) {
logToConsole(LOG_DEBUG, `[VRR.Event] Syncing ${getPlayerDisplayForConsole(client)}'s hotbar`);
updatePlayerHotBar(client);
logToConsole(LOG_DEBUG, `[VRR.Event] Sending custom keybinds to ${getPlayerDisplayForConsole(client)}`);
sendAccountKeyBindsToClient(client);
logToConsole(LOG_DEBUG, `[VRR.Event] Setting ${getPlayerDisplayForConsole(client)}'s switchchar state to false`);
getPlayerData(client).switchingCharacter = false;
@@ -596,6 +593,9 @@ function onPlayerSpawn(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();
getPlayerData(client).payDayTickStart = sdl.ticks;
//}
}

View File

@@ -7,63 +7,6 @@
// TYPE: Server (JavaScript)
// ===========================================================================
let fishingLocations = [
false,
[
// GTA III
],
[
// GTA Vice City
],
[ // GTA San Andreas
toVector3(403.8266, -2088.7598, 7.8359),
toVector3(398.7553, -2088.7490, 7.8359),
toVector3(396.2197,-2088.6692,7.8359),
toVector3(391.1094,-2088.7976,7.8359),
toVector3(383.4157,-2088.7849,7.8359),
toVector3(374.9598,-2088.7979,7.8359),
toVector3(369.8107,-2088.7927,7.8359),
toVector3(367.3637,-2088.7925,7.8359),
toVector3(362.2244,-2088.7981,7.8359),
toVector3(354.5382,-2088.7979,7.8359),
],
false,
[
// GTA IV
],
];
// ===========================================================================
let fishingCatchables = [
// Fish
["Salmon", 0, 500, 1, 15],
["Tuna", 0, 700, 1, 15],
["Crab", 0, 200, 1, 5],
["Trout", 0, 250, 1, 15],
["Sea Bass", 0, 550, 1, 8],
["Shark", 0, 150, 1, 15],
["Turtle", 0, 50, 1, 25],
["Manta Ray", 0, 250, 1, 25],
["Cat Fish", 0, 350, 1, 5],
["Blue Marlin", 0, 450, 1, 5],
// Junk
["Can", 0, 0, 0, 0],
["Pants", 0, 0, 0, 0],
["Shoes", 0, 0, 0, 0],
["Garbage", 0, 0, 0, 0],
["Baby Diaper", 0, 0, 0, 0],
["Tire", 0, 0, 0, 0],
["Car Battery", 0, 0, 0, 0],
["Horse Hoove", 0, 0, 0, 0],
["Log", 0, 0, 0, 0],
["Soggy Dildo", 0, 0, 0, 0],
];
// ===========================================================================
function initFishingScript() {

120
scripts/server/gate.js Normal file
View File

@@ -0,0 +1,120 @@
// ===========================================================================
// Vortrex's Roleplay Resource
// https://github.com/VortrexFTW/gtac_roleplay
// ===========================================================================
// FILE: gate.js
// DESC: Provides gate functions and commands
// TYPE: Server (JavaScript)
// ===========================================================================
function doesPlayerHaveGateKeys(client, vehicle) {
let gateData = getGateData(vehicle);
if(gateData.ownerType == VRR_GATEOWNER_PUBLIC) {
return true;
}
if(gateData.ownerType == VRR_GATEOWNER_PLAYER) {
if(gateData.ownerId == getPlayerCurrentSubAccount(client).databaseId) {
return true;
}
}
if(gateData.ownerType == VRR_GATEOWNER_CLAN) {
if(doesPlayerHaveStaffPermission(client, getStaffFlagValue("ManageClans"))) {
return true;
}
if(gateData.ownerId == getPlayerCurrentSubAccount(client).clan) {
if(gateData.clanRank <= getPlayerCurrentSubAccount(client).clanRank) {
return true;
}
}
}
if(gateData.ownerType == VRR_GATEOWNER_FACTION) {
if(doesPlayerHaveStaffPermission(client, getStaffFlagValue("ManageFactions"))) {
return true;
}
if(gateData.ownerId == getPlayerCurrentSubAccount(client).faction) {
if(gateData.factionRank <= getPlayerCurrentSubAccount(client).factionRank) {
return true;
}
}
}
if(gateData.ownerType == VRR_GATEOWNER_JOB) {
if(doesPlayerHaveStaffPermission(client, getStaffFlagValue("ManageJobs"))) {
return true;
}
if(gateData.ownerId == getPlayerCurrentSubAccount(client).job) {
return true;
}
}
if(gateData.ownerType == VRR_GATEOWNER_BUSINESS) {
if(doesPlayerHaveStaffPermission(client, getStaffFlagValue("ManageBusinesses"))) {
return true;
}
if(canPlayerManageBusiness(client, getBusinessIdFromDatabaseId(gateData.ownerId))) {
return true;
}
}
if(gateData.ownerType == VRR_GATEOWNER_HOUSE) {
if(doesPlayerHaveStaffPermission(client, getStaffFlagValue("ManageHouses"))) {
return true;
}
if(canPlayerManageHouse(client, getHouseIdFromDatabaseId(gateData.ownerId))) {
return true;
}
}
return false;
}
// ===========================================================================
function getGateData(gateId) {
if(typeof getServerData().gates[gateId] != "undefined") {
return getServerData().gates[gateId];
}
return false;
}
// ===========================================================================
function getClosestGate(position) {
let closest = 0;
for(let i in getServerData().gates[getServerGame()]) {
if(getDistance(getServerData().gates[i].position, position) < getDistance(getServerData().gates[closest].position, position)) {
closest = i;
}
}
return closest;
}
// ===========================================================================
function triggerGateCommand(command, params, client) {
let closestGate = getClosestGate(getPlayerPosition(client));
if(!getGateData(closestGate)) {
messagePlayerError(client, getLocaleString(client, "InvalidGate"));
}
if(!canPlayerUseGate(client, closestGate)) {
messagePlayerError(client, getLocaleString(client, "NoGateAccess"));
return false;
}
triggerGate(getGateData(closestGate).scriptName);
}
// ===========================================================================

View File

@@ -77,10 +77,12 @@ function playerPromptAnswerYes(client) {
createItem(getPlayerData(client).businessOrderItem, getPlayerData(client).businessOrderValue, VRR_ITEM_OWNER_BIZFLOOR, getBusinessData(getPlayerData(client).businessOrderBusiness).databaseId, getPlayerData(client).businessOrderAmount);
cacheBusinessItems(getPlayerData(client).businessOrderBusiness);
getBusinessData(getPlayerData(client).businessOrderBusiness).till -= getPlayerData(client).businessOrderCost;
updateBusinessPickupLabelData(getPlayerData(client).businessOrderBusiness);
getPlayerData(client).businessOrderAmount = 0;
getPlayerData(client).businessOrderBusiness = false;
getPlayerData(client).businessOrderItem = -1;
getPlayerData(client).businessOrderValue = -1;
}
} else {
showPlayerErrorGUI(client, `You aren't ordering anything for a business!`, `Business Order Canceled`);
@@ -97,7 +99,7 @@ function playerPromptAnswerYes(client) {
// ===========================================================================
function canPlayerUseGUI(client) {
return (getServerConfig().useGUI && doesPlayerHaveGUIEnabled(client));
return (doesServerHaveGUIEnabled() && doesPlayerHaveGUIEnabled(client));
}
// ===========================================================================
@@ -112,4 +114,22 @@ function playerPromptAnswerNoCommand(command, params, client) {
playerPromptAnswerNo(client);
}
// ===========================================================================
function playerToggledGUI(client) {
toggleAccountGUICommand("gui", "", client);
}
// ===========================================================================
function showPlayerChangePasswordGUI(client) {
sendNetworkEventToPlayer("vrr.changePassword", client);
}
// ===========================================================================
function showPlayerTwoFactorAuthenticationGUI(client) {
sendNetworkEventToPlayer("vrr.2fa", client);
}
// ===========================================================================

View File

@@ -55,7 +55,7 @@ function helpCommand(command, params, client) {
let splitParams = params.split(" ");
switch(toLowerCase(splitParams[0])) {
switch(toLowerCase(getParam(params, " ", 1))) {
case "account":
showAccountHelpMessage(client);
break;
@@ -104,13 +104,6 @@ function helpCommand(command, params, client) {
showAnimationHelpMessage(client);
break;
case "ammunation":
case "ammu":
case "gun":
case "guns":
showAmmunationHelpMessage(client);
break;
case "skin":
case "skins":
case "clothes":
@@ -120,6 +113,7 @@ function helpCommand(command, params, client) {
case "key":
case "keys":
case "keybinds":
case "keybind":
case "bindkey":
case "bindkeys":
showBindKeysHelpMessage(client);
@@ -127,7 +121,7 @@ function helpCommand(command, params, client) {
case "command":
case "cmd":
showCommandHelpMessage(client, splitParams[1]);
showCommandHelpMessage(client, getParam(params, " ", 2));
break;
case "clan":
@@ -147,6 +141,14 @@ function helpCommand(command, params, client) {
showRadioHelpMessage(client);
break;
case "economy":
case "wealth":
case "tax":
case "taxes":
case "payday":
showWealthAndTaxHelpMessage(client);
break;
default:
showMainHelpMessage(client);
break;
@@ -177,20 +179,21 @@ function helpCommand(command, params, client) {
// == Badge ====================================
// == Accents ==================================
// == Player Info ==============================
// == Wealth and Tax ===========================
// ===========================================================================
function showMainHelpMessage(client) {
messagePlayerInfo(client, `{clanOrange}== {jobYellow}Help {clanOrange}=================================`);
messagePlayerInfo(client, makeChatBoxSectionHeader(getLocaleString(client, "HeaderHelpMainList")));
messagePlayerNormal(client, `{clanOrange}• {MAINCOLOUR}Use /help <category> for commands and info. Example: {ALTCOLOUR}/help vehicle`);
messagePlayerNormal(client, `{clanOrange}• {MAINCOLOUR}Help Categories: [#A9A9A9]account, command, vehicle, job, chat, rules, website, anim`);
messagePlayerNormal(client, `{clanOrange}• [#A9A9A9]ammunation, skins, mechanic, dealership, discord, colours, keys`);
messagePlayerNormal(client, `{clanOrange}• {MAINCOLOUR}Help Categories: [#A9A9A9]account, command, vehicle, job, chat, rules, website, animation`);
messagePlayerNormal(client, `{clanOrange}• [#A9A9A9]skin, mechanic, dealership, discord, colour, keybind`);
}
// ===========================================================================
function showAccountHelpMessage(client) {
messagePlayerInfo(client, `{clanOrange}== {jobYellow}Account Help {clanOrange}=============================`);
messagePlayerInfo(client, makeChatBoxSectionHeader(getLocaleString(client, "HeaderAccountHelp")));
messagePlayerNormal(client, `{clanOrange}• {MAINCOLOUR}Do not share your password with anybody else.`);
messagePlayerNormal(client, `{clanOrange}• {MAINCOLOUR}Use {ALTCOLOUR}/changepass{MAINCOLOUR} to change your password.`);
messagePlayerNormal(client, `{clanOrange}• {MAINCOLOUR}Some settings you can use: {ALTCOLOUR}/gui, /logo, /iplogin, /autolastchar, /2fa, /loginalert`);
@@ -199,7 +202,7 @@ function showAccountHelpMessage(client) {
// ===========================================================================
function showVehicleHelpMessage(client) {
messagePlayerInfo(client, `{clanOrange}== {jobYellow}Vehicle Help {clanOrange}=============================`);
messagePlayerInfo(client, makeChatBoxSectionHeader(getLocaleString(client, "HeaderVehicleHelp")));
messagePlayerNormal(client, `{clanOrange}• {MAINCOLOUR}Visit dealerships to buy new vehicles (Use {ALTCOLOUR}/help dealership {MAINCOLOUR}for more info.)`);
messagePlayerNormal(client, `{clanOrange}• {MAINCOLOUR}Some commands: {ALTCOLOUR}/lock, /engine, /lights, /trunk, /rentveh, /buyveh, /rentprice, /buyprice`);
messagePlayerNormal(client, `{clanOrange}• {MAINCOLOUR}Your personal vehicles will save wherever you or somebody else leaves them!`);
@@ -210,7 +213,7 @@ function showVehicleHelpMessage(client) {
// ===========================================================================
function showVehicleDealershipHelpMessage(client) {
messagePlayerInfo(client, `{clanOrange}== {jobYellow}Vehicle Dealerships {clanOrange}======================`);
messagePlayerInfo(client, makeChatBoxSectionHeader(getLocaleString(client, "HeaderVehicleDealershipHelp")));
messagePlayerNormal(client, `{clanOrange}• {MAINCOLOUR}Visit a vehicle dealer to buy new vehicles. Use {ALTCOLOUR}/gps {MAINCOLOUR}to find one.`);
messagePlayerNormal(client, `{clanOrange}• {MAINCOLOUR}At the dealer, simply enter a car you want to buy, and the price will be shown to you`);
messagePlayerNormal(client, `{clanOrange}• {MAINCOLOUR}If you want to buy the vehicle and have enough money, use {ALTCOLOUR}/buyveh {MAINCOLOUR}and you will be given keys`);
@@ -220,7 +223,7 @@ function showVehicleDealershipHelpMessage(client) {
// ===========================================================================
function showJobHelpMessage(client) {
messagePlayerInfo(client, `{clanOrange}== {jobYellow}Job Help {clanOrange}=================================`);
messagePlayerInfo(client, makeChatBoxSectionHeader(getLocaleString(client, "HeaderJobHelp")));
messagePlayerNormal(client, `{clanOrange}• {MAINCOLOUR}Visit job locations get a job and earn money. Look for yellow spots on the map`);
messagePlayerNormal(client, `{clanOrange}• {MAINCOLOUR}At a job location, use {ALTCOLOUR}/takejob {MAINCOLOUR}to get the job. Use {ALTCOLOUR}/quitjob {MAINCOLOUR}to quit your job`);
messagePlayerNormal(client, `{clanOrange}• {MAINCOLOUR}Use {ALTCOLOUR}/startwork {MAINCOLOUR}to begin working. You can also get a job {ALTCOLOUR}/uniform and {ALTCOLOUR}/equipment`);
@@ -231,7 +234,7 @@ function showJobHelpMessage(client) {
// ===========================================================================
function showChatHelpMessage(client) {
messagePlayerInfo(client, `{clanOrange}== {jobYellow}Chat Help {clanOrange}================================`);
messagePlayerInfo(client, makeChatBoxSectionHeader(getLocaleString(client, "HeaderChatHelp")));
messagePlayerNormal(client, `{clanOrange}• {MAINCOLOUR}There are two main types of chat: out-of-character (OOC) and in-character (IC)`);
messagePlayerNormal(client, `{clanOrange}• {MAINCOLOUR}Mixing these two types is not proper roleplay. See {ALTCOLOUR}/rules {MAINCOLOUR}for info.`);
messagePlayerNormal(client, `{clanOrange}• {MAINCOLOUR}Some chat commands: {ALTCOLOUR}/dm /whisper /talk /shout /me.`);
@@ -241,97 +244,94 @@ function showChatHelpMessage(client) {
// ===========================================================================
function showRulesHelpMessage(client) {
messagePlayerInfo(client, `{clanOrange}== {jobYellow}Server Rules {clanOrange}=============================`);
messagePlayerNormal(client, `{clanOrange}• {MAINCOLOUR}Unrealistic actions (powergaming) are not allowed. You aren't superman.`);
messagePlayerNormal(client, `{clanOrange}• {MAINCOLOUR}No terrorist or terrorism roleplay is allowed.`);
messagePlayerNormal(client, `{clanOrange}• {MAINCOLOUR}Always follow instructions given by moderators and admins.`);
messagePlayerNormal(client, `{clanOrange}• {MAINCOLOUR}Do not mix the chats (metagaming). You can't use info in IC that was received OOC`);
messagePlayerNormal(client, `{clanOrange}• {MAINCOLOUR}Keep English in main chats. If you aren't good at English, use {ALTCOLOUR}/help language`);
messagePlayerInfo(client, makeChatBoxSectionHeader(getLocaleString(client, "HeaderServerRulesList")));
messagePlayerHelpContent(client, getGroupedLocaleString(client, "RulesHelp", 0));
messagePlayerHelpContent(client, getGroupedLocaleString(client, "RulesHelp", 1));
messagePlayerHelpContent(client, getGroupedLocaleString(client, "RulesHelp", 2));
messagePlayerHelpContent(client, getGroupedLocaleString(client, "RulesHelp", 3));
messagePlayerHelpContent(client, getGroupedLocaleString(client, "RulesHelp", 4), `{ALTCOLOUR}/help language {MAINCOLOUR}`);
}
// ===========================================================================
function showWebsiteHelpMessage(client) {
messagePlayerInfo(client, `{clanOrange}== {jobYellow}Website {clanOrange}=============================`);
messagePlayerInfo(client, makeChatBoxSectionHeader(getLocaleString(client, "HeaderWebsiteInfo")));
messagePlayerNormal(client, `{clanOrange}• {MAINCOLOUR}${server.getRule("Website")}`);
}
// ===========================================================================
function showDiscordHelpMessage(client) {
messagePlayerInfo(client, `{clanOrange}== {jobYellow}Discord {clanOrange}=============================`);
messagePlayerInfo(client, makeChatBoxSectionHeader(getLocaleString(client, "HeaderDiscordInfo")));
messagePlayerNormal(client, `{clanOrange}• {MAINCOLOUR}${server.getRule("Website")}`);
}
// ===========================================================================
function showAnimationHelpMessage(client) {
messagePlayerInfo(client, `{clanOrange}== {jobYellow}Animations {clanOrange}===============================`);
messagePlayerNormal(client, `{clanOrange}• {MAINCOLOUR}Animations allow you to enhance roleplay with visual actions`);
messagePlayerNormal(client, `{clanOrange}• {MAINCOLOUR}Use {ALTCOLOUR}/an {MAINCOLOUR}or {ALTCOLOUR}/anim {MAINCOLOUR}with a name to use an animation.`);
messagePlayerNormal(client, `{clanOrange}• {MAINCOLOUR}To see a list of animations, use {ALTCOLOUR}/animlist`);
}
// ===========================================================================
function showAmmunationHelpMessage(client) {
messagePlayerInfo(client, `{clanOrange}== {jobYellow}Ammunation {clanOrange}===============================`);
messagePlayerNormal(client, `{clanOrange}• {MAINCOLOUR}Visit an ammunation to buy weapons. Use {ALTCOLOUR}/gps {MAINCOLOUR}to find one.`);
messagePlayerNormal(client, `{clanOrange}• {MAINCOLOUR}Buying a weapon requires a weapon license.`);
messagePlayerNormal(client, `{clanOrange}• {MAINCOLOUR}Weapon licenses are managed by the police department. Apply there to get one.`);
messagePlayerNormal(client, `{clanOrange}• {MAINCOLOUR}Weapons can also be purchased illegally from weapon dealers and clans.`);
messagePlayerInfo(client, makeChatBoxSectionHeader(getLocaleString(client, "HeaderAnimationHelp")));
messagePlayerHelpContent(client, getGroupedLocaleString(client, "AnimationHelp", 0, `{ALTCOLOUR}/buy {MAINCOLOUR}`));
messagePlayerHelpContent(client, getGroupedLocaleString(client, "AnimationHelp", 1, `{ALTCOLOUR}/an {MAINCOLOUR}`, `{ALTCOLOUR}/anim {MAINCOLOUR}`));
messagePlayerHelpContent(client, getGroupedLocaleString(client, "AnimationHelp", 2, `{ALTCOLOUR}/animlist {MAINCOLOUR}`));
}
// ===========================================================================
function showClothesHelpMessage(client) {
messagePlayerInfo(client, `{clanOrange}== {jobYellow}Clothes {clanOrange}==================================`);
//messagePlayerNormal(client, `{clanOrange}• {MAINCOLOUR}To change your skin, use {ALTCOLOUR}/gps {MAINCOLOUR}to find a clothing store`);
messagePlayerNormal(client, `{clanOrange}• {MAINCOLOUR}At a clothing store, use {ALTCOLOUR}/buy {MAINCOLOUR} to purchase clothes`);
messagePlayerNormal(client, `{clanOrange}• {MAINCOLOUR}When you have a clothing item, equip and use it like any other item to show the skin selection (check {ALTCOLOUR}/help items {MAINCOLOUR}to learn how to use items)`);
messagePlayerNormal(client, `{clanOrange}• {MAINCOLOUR}Some skins are restricted to jobs, clans, or for other reasons.`);
messagePlayerInfo(client, makeChatBoxSectionHeader(getLocaleString(client, "HeaderSkinHelp")));
messagePlayerHelpContent(client, getGroupedLocaleString(client, "SkinHelp", 0, `{ALTCOLOUR}/buy {MAINCOLOUR}`));
messagePlayerHelpContent(client, getGroupedLocaleString(client, "SkinHelp", 1, `{ALTCOLOUR}/help items {MAINCOLOUR}`));
messagePlayerHelpContent(client, getGroupedLocaleString(client, "SkinHelp", 2));
}
// ===========================================================================
function showBindKeysHelpMessage(client) {
messagePlayerInfo(client, `{clanOrange}== {jobYellow}Bindable Keys {clanOrange}============================`);
messagePlayerNormal(client, `{clanOrange}• {MAINCOLOUR}You can set your own keys binds. Use {ALTCOLOUR}/keybinds {MAINCOLOUR}to see your binded keys.`);
messagePlayerNormal(client, `{clanOrange}• {MAINCOLOUR}Use {ALTCOLOUR}/bindkey {MAINCOLOUR}to add a new keybind and /unbindkey to remove one.`);
messagePlayerNormal(client, `{clanOrange}• {MAINCOLOUR}Default keys are: [#0066FF]K {MAINCOLOUR}for vehicle engine, [#0066FF]L {MAINCOLOUR}for lights, and [#0066FF]J {MAINCOLOUR}for lock/unlock`);
messagePlayerNormal(client, `{clanOrange}• {MAINCOLOUR}[#0066FF]I {MAINCOLOUR}to see your items and [#0066FF]1-9 {MAINCOLOUR}to equip an item or [#0066FF]0 (zero) {MAINCOLOUR}to equip none.`);
messagePlayerNormal(client, `{clanOrange}• {MAINCOLOUR}[#0066FF]U {MAINCOLOUR}to use or [#0066FF]O {MAINCOLOUR}to drop your current item, and [#0066FF]P {MAINCOLOUR}to pickup an item from the ground.`);
messagePlayerNormal(client, `{clanOrange}• {MAINCOLOUR}[#0066FF]M {MAINCOLOUR}for mouse cam (free look)`);
messagePlayerNormal(client, `{clanOrange}• {MAINCOLOUR}Your keybinds will automatically be usable on all ${getServerName()} servers`);
messagePlayerInfo(client, makeChatBoxSectionHeader(getLocaleString(client, "HeaderBindableKeysHelp")));
messagePlayerHelpContent(client, getGroupedLocaleString(client, "KeyBindHelp", 0, `{ALTCOLOUR}/keybinds {MAINCOLOUR}`));
messagePlayerHelpContent(client, getGroupedLocaleString(client, "KeyBindHelp", 1, `{ALTCOLOUR}/bindkey {MAINCOLOUR}`, `{ALTCOLOUR}/unbindkey {MAINCOLOUR}`));
messagePlayerHelpContent(client, getGroupedLocaleString(client, "KeyBindHelp", 2, `{ALTCOLOUR}K {MAINCOLOUR}`, `{ALTCOLOUR}L {MAINCOLOUR}`, `{ALTCOLOUR}J {MAINCOLOUR}`));
messagePlayerHelpContent(client, getGroupedLocaleString(client, "KeyBindHelp", 3, `{ALTCOLOUR}I {MAINCOLOUR}`, `{ALTCOLOUR}1-9 {MAINCOLOUR}`, `{ALTCOLOUR}0 {MAINCOLOUR}`));
messagePlayerHelpContent(client, getGroupedLocaleString(client, "KeyBindHelp", 4, `{ALTCOLOUR}U {MAINCOLOUR}`, `{ALTCOLOUR}O {MAINCOLOUR}`, `{ALTCOLOUR}P {MAINCOLOUR}`));
}
// ===========================================================================
function showBusinessHelpMessage(client) {
messagePlayerInfo(client, `{clanOrange}== {jobYellow}Business {clanOrange}=================================`);
messagePlayerNormal(client, `{clanOrange}• {MAINCOLOUR}Use /buy to purchase items or /bizitems to see a list of what's for sale at any business`);
messagePlayerNormal(client, `{clanOrange}• {MAINCOLOUR}Businesses are shown with blue names above the icon at their entrance.`);
messagePlayerNormal(client, `{clanOrange}• {MAINCOLOUR}Business owner commands: {ALTCOLOUR}/bizorder, /biz`);
messagePlayerNormal(client, `{clanOrange}• {MAINCOLOUR}A new car for sale will appear when you drive away from the dealer.`);
messagePlayerInfo(client, makeChatBoxSectionHeader(getLocaleString(client, "HeaderBusinessHelp")));
messagePlayerHelpContent(client, getGroupedLocaleString(client, "BusinessHelp", 0));
messagePlayerHelpContent(client, getGroupedLocaleString(client, "BusinessHelp", 1));
messagePlayerHelpContent(client, getGroupedLocaleString(client, "BusinessHelp", 2, `{ALTCOLOUR}/bizorder, /bizlock, /bizlights, /radiostation, /bizitemprice, /bizbuyprice, /bizfee, /biztill, /bizwithdraw, /bizdeposit`));
messagePlayerHelpContent(client, getGroupedLocaleString(client, "BusinessHelp", 3));
}
// ===========================================================================
function showClanHelpMessage(client) {
messagePlayerInfo(client, `{clanOrange}== {jobYellow}Clan {clanOrange}================================`);
messagePlayerNormal(client, `{clanOrange}• {MAINCOLOUR}Ask an admin to create a clan (Similar to factions/groups/families)`);
messagePlayerNormal(client, `{clanOrange}• {MAINCOLOUR}Clan owners have full control over their clan once it's created`);
messagePlayerNormal(client, `{clanOrange}• {MAINCOLOUR}Clan commands: {ALTCOLOUR}/clan, /clanmotd, /clanname, /clanowner, /clanhouse, /clanbiz, /claninvite, /clanuninvite, /clansetrank`);
messagePlayerNormal(client, `{clanOrange}• {MAINCOLOUR}{ALTCOLOUR}/clanranks, /clanflags, /clanaddrank, /clandelrank, /clanaddrankflag, /clandelrankflag, /clanaddmemberflag, /clandelmemberflag`);
messagePlayerInfo(client, makeChatBoxSectionHeader(getLocaleString(client, "HeaderClanHelp")));
messagePlayerHelpContent(client, getGroupedLocaleString(client, "ClanHelp", 0));
messagePlayerHelpContent(client, getGroupedLocaleString(client, "ClanHelp", 1));
messagePlayerHelpContent(client, getGroupedLocaleString(client, "ClanHelp", 2, `{ALTCOLOUR}/clan, /clanmotd, /clanname, /clanowner, /clanhouse, /clanbiz, /claninvite, /clanuninvite, /clansetrank`));
messagePlayerHelpContent(client, getGroupedLocaleString(client, "ClanHelp", 3, `{ALTCOLOUR}/clanranks, /clanflags, /clanaddrank, /clandelrank, /clanaddrankflag, /clandelrankflag, /clanaddmemberflag, /clandelmemberflag`));
}
// ===========================================================================
function showRadioHelpMessage(client) {
messagePlayerInfo(client, `{clanOrange}== {jobYellow}Radio {clanOrange}===============================`);
messagePlayerNormal(client, `{clanOrange}• {MAINCOLOUR}Use {ALTCOLOUR}/radiostations {MAINCOLOUR}to set the station for your vehicle, house, or business`);
messagePlayerNormal(client, `{clanOrange}• {MAINCOLOUR}Use {ALTCOLOUR}/radiostations {MAINCOLOUR}to see a list of stations`);
messagePlayerNormal(client, `{clanOrange}• {MAINCOLOUR}You can change your radio streaming volume using {ALTCOLOUR}/radiovolume {MAINCOLOUR}with 0-100 as the percent.`);
messagePlayerInfo(client, makeChatBoxSectionHeader(getLocaleString(client, "HeaderRadioHelp")));
messagePlayerHelpContent(client, getGroupedLocaleString(client, "RadioHelp", 0, `{ALTCOLOUR}/radiostation {MAINCOLOUR}`));
messagePlayerHelpContent(client, getGroupedLocaleString(client, "RadioHelp", 1, `{ALTCOLOUR}/radiostations {MAINCOLOUR}`));
messagePlayerHelpContent(client, getGroupedLocaleString(client, "RadioHelp", 2, `{ALTCOLOUR}/radiovolume {MAINCOLOUR}`));
}
// ===========================================================================
function showWealthAndTaxHelpMessage(client) {
messagePlayerInfo(client, makeChatBoxSectionHeader(getLocaleString(client, "HeaderWealthandTaxHelp")));
messagePlayerNormal(client, `{clanOrange}• {MAINCOLOUR}Your taxes on payday are ${100*getGlobalConfig().economy.incomeTaxRate}% of your calculated wealth.`);
messagePlayerNormal(client, `{clanOrange}• {MAINCOLOUR}Your calculated wealth is a total sum based on how many vehicles, houses, and businesses you have.`);
messagePlayerNormal(client, `{clanOrange}• {MAINCOLOUR}Each vehicle is {ALTCOLOUR}${getGlobalConfig().economy.upKeepCosts.upKeepPerVehicle}, {MAINCOLOUR}each house is {ALTCOLOUR}${getGlobalConfig().economy.upKeepCosts.upKeepPerHouse}, {MAINCOLOUR}and each business is {ALTCOLOUR}${getGlobalConfig().economy.upKeepCosts.upKeepPerBusiness}`);
messagePlayerNormal(client, `{clanOrange}• {MAINCOLOUR}Use {ALTCOLOUR}/wealth {MAINCOLOUR}to see your current wealth, and {ALTCOLOUR}/tax {MAINCOLOUR}to see how much you'll pay in tax each payday`);
}
// ===========================================================================
@@ -352,7 +352,7 @@ function showCommandHelpMessage(client, commandName) {
let command = getCommandData(commandName);
let aliases = getCommandAliasesNames(command);
messagePlayerInfo(client, `{clanOrange}== {jobYellow}Command Info {clanOrange}=============================`);
messagePlayerInfo(client, makeChatBoxSectionHeader(getLocaleString(client, "HeaderCommandInfo", commandName)));
messagePlayerNormal(client, `{clanOrange}• {MAINCOLOUR}Description: ${command.description}`);
if(aliases.length > 0) {

View File

@@ -65,14 +65,14 @@ function createHouseCommand(command, params, client) {
let entranceLocation = new HouseLocationData(false);
entranceLocation.entrancePosition = getPlayerPosition(client);
entranceLocation.entranceRotation = 0.0;
entranceLocation.entrancePickupModel = getGameConfig().pickupModels[getServerGame()].house;
entranceLocation.entranceBlipModel = getGameConfig().blipSprites[getServerGame()].house;
entranceLocation.entrancePickupModel = getGameConfig().pickupModels[getServerGame()].House;
entranceLocation.entranceBlipModel = getGameConfig().blipSprites[getServerGame()].House;
entranceLocation.entranceInterior = 0;
entranceLocation.entranceDimension = 0;
entranceLocation.exitPosition = toVector3(0.0, 0.0, 0.0);
entranceLocation.exitRotation = 0.0;
entranceLocation.exitPickupModel = getGameConfig().pickupModels[getServerGame()].exit;
entranceLocation.exitPickupModel = getGameConfig().pickupModels[getServerGame()].Exit;
entranceLocation.exitBlipModel = -1;
entranceLocation.exitInterior = 0;
entranceLocation.exitDimension = 0;
@@ -110,7 +110,7 @@ function lockUnlockHouseCommand(command, params, client) {
let houseId = getPlayerHouse(client);
if(!getHouseData(houseId)) {
messagePlayerError("House not found!");
messagePlayerError(client, getLocaleString(client, "InvalidHouse"));
return false;
}
@@ -125,7 +125,7 @@ function lockUnlockHouseCommand(command, params, client) {
setEntityData(getHouseData(houseId).entrancePickup, "vrr.label.locked", getHouseData(houseId).locked, true);
getHouseData(houseId).needsSaved = true;
messagePlayerSuccess(client, `House {houseGreen}${getHouseData(houseId).description} {MAINCOLOUR}${getLockedUnlockedTextFromBool((getHouseData(houseId).locked))}!`);
messagePlayerSuccess(client, `House {houseGreen}${getHouseData(houseId).description} {MAINCOLOUR}${getLockedUnlockedFromBool((getHouseData(houseId).locked))}!`);
}
// ===========================================================================
@@ -143,7 +143,7 @@ function lockUnlockHouseCommand(command, params, client) {
let houseId = getPlayerHouse(client);
if(!getHouseData(houseId)) {
messagePlayerError("House not found!");
messagePlayerError(client, getLocaleString(client, "InvalidHouse"));
return false;
}
@@ -172,7 +172,7 @@ function setHouseDescriptionCommand(command, params, client) {
let houseId = getPlayerHouse(client);
if(!getHouseData(houseId)) {
messagePlayerError("House not found!");
messagePlayerError(client, getLocaleString(client, "InvalidHouse"));
return false;
}
@@ -208,12 +208,12 @@ function setHouseOwnerCommand(command, params, client) {
let houseId = getPlayerHouse(client);
if(!newHouseOwner) {
messagePlayerError("Player not found!");
messagePlayerError(client, getLocaleString(client, "InvalidPlayer"));
return false;
}
if(!getHouseData(houseId)) {
messagePlayerError("House not found!");
messagePlayerError(client, getLocaleString(client, "InvalidHouse"));
return false;
}
@@ -246,14 +246,14 @@ function setHouseClanCommand(command, params, client) {
let houseId = getPlayerHouse(client);
if(!getHouseData(houseId)) {
messagePlayerError("House not found!");
messagePlayerError(client, getLocaleString(client, "InvalidHouse"));
return false;
}
let clanId = getPlayerClan(params);
if(!getClanData(clanId)) {
messagePlayerError(client, "Clan not found!");
messagePlayerError(client, getLocaleString(client, "InvalidClan"));
return false;
}
@@ -286,21 +286,21 @@ function setHouseClanCommand(command, params, client) {
let houseId = getPlayerHouse(client);
if(!getHouseData(houseId)) {
messagePlayerError("House not found!");
messagePlayerError(client, getLocaleString(client, "InvalidHouse"));
return false;
}
let clanId = getPlayerClan(params);
if(!getClanData(clanId)) {
messagePlayerError(client, "Clan not found!");
messagePlayerError(client, getLocaleString(client, "InvalidClan"));
return false;
}
let clanRankId = getClanRankFromParams(clanId, params);
if(!getClanRankData(clanId, clanRankId)) {
messagePlayerError(client, "Clan rank not found!");
messagePlayerError(client, getLocaleString(client, "ClanRankInvalid"));
return false;
}
@@ -335,7 +335,7 @@ function setHousePickupCommand(command, params, client) {
let houseId = getPlayerHouse(client);
if(!getHouseData(houseId)) {
messagePlayerError(client, "House not found!");
messagePlayerError(client, getLocaleString(client, "InvalidHouse"));
return false;
}
@@ -344,8 +344,14 @@ function setHousePickupCommand(command, params, client) {
getHouseData(houseId).entrancePickupModel = -1;
} else {
if(isNull(getGameConfig().pickupModels[getServerGame()][typeParam])) {
messagePlayerError(client, "Invalid house type! Use a house type name or a pickup model ID or 'none'");
messagePlayerInfo(client, `Pickup Types: [#AAAAAA]${Object.keys(getGameConfig().pickupModels[getServerGame()]).join(", ")}`)
messagePlayerError(client, "Invalid pickup type! Use a pickup type name or a model ID");
let pickupTypes = Object.keys(getGameConfig().pickupModels[getServerGame()]);
let chunkedList = splitArrayIntoChunks(pickupTypes, 10);
messagePlayerNormal(client, makeChatBoxSectionHeader(getLocaleString(client, "HeaderPickupTypes")));
for(let i in chunkedList) {
messagePlayerInfo(client, chunkedList[i].join(", "));
}
return false;
}
@@ -360,7 +366,7 @@ function setHousePickupCommand(command, params, client) {
getHouseData(houseId).needsSaved = true;
messageAdmins(`[#AAAAAA]${client.name} [#FFFFFF]set house [#11CC11]${getHouseData(houseId).description} [#FFFFFF]pickup display to [#AAAAAA]${toLowerCase(typeParam)}`);
messageAdmins(`{ALTCOLOUR}${client.name} {MAINCOLOUR}set house {houseGreen}${getHouseData(houseId).description} {MAINCOLOUR}pickup display to {ALTCOLOUR}${toLowerCase(typeParam)}`);
}
// ===========================================================================
@@ -375,12 +381,11 @@ function setHousePickupCommand(command, params, client) {
*
*/
function setHouseInteriorTypeCommand(command, params, client) {
let splitParams = params.split(" ");
let typeParam = splitParams[0] || "None";
let typeParam = getParam(params, " ", 1) || "None";
let houseId = getPlayerHouse(client);
if(!getHouseData(houseId)) {
messagePlayerError(client, "House not found!");
messagePlayerError(client, getLocaleString(client, "InvalidHouse"));
return false;
}
@@ -390,26 +395,28 @@ function setHouseInteriorTypeCommand(command, params, client) {
if(toLowerCase(typeParam) == "None") {
tempHouseLocation.exitPosition = toVector3(0.0, 0.0, 0.0);
tempHouseLocation.exitInterior = -1;
getHouseData(houseId).exitPickupModel = -1;
getHouseData(houseId).hasInterior = false;
messageAdmins(`{ALTCOLOUR}${getPlayerName(client)} {MAINCOLOUR}removed house {houseGreen}${getHouseData(houseId).description} {MAINCOLOUR}interior`);
return false;
}
if(isNull(getGameConfig().interiorTemplates[getServerGame()][typeParam])) {
if(isNull(getGameConfig().interiors[getServerGame()][typeParam])) {
messagePlayerError(client, "Invalid interior type! Use an interior type name");
let interiorTypesList = Object.keys(getGameConfig().interiorTemplates[getServerGame()]);
let interiorTypesList = Object.keys(getGameConfig().interiors[getServerGame()]);
let chunkedList = splitArrayIntoChunks(interiorTypesList, 10);
messagePlayerInfo(client, `{clanOrange}== {jobYellow}Interior Types {clanOrange}=======================`);
messagePlayerNormal(client, makeChatBoxSectionHeader("InteriorTypes"));
for(let i in chunkedList) {
messagePlayerInfo(client, chunkedList[i].join(", "));
}
return false;
}
getHouseData(houseId).exitPosition = getGameConfig().interiorTemplates[getServerGame()][typeParam][0];
getHouseData(houseId).exitInterior = getGameConfig().interiorTemplates[getServerGame()][typeParam][1];
getHouseData(houseId).exitPosition = getGameConfig().interiors[getServerGame()][typeParam][0];
getHouseData(houseId).exitInterior = getGameConfig().interiors[getServerGame()][typeParam][1];
getHouseData(houseId).exitDimension = getHouseData(houseId).databaseId+getGlobalConfig().houseDimensionStart;
getHouseData(houseId).exitPickupModel = getGameConfig().pickupModels[getServerGame()].Exit;
getHouseData(houseId).hasInterior = true;
}
@@ -420,7 +427,7 @@ function setHouseInteriorTypeCommand(command, params, client) {
getHouseData(houseId).needsSaved = true;
messageAdmins(`[#AAAAAA]${client.name} [#FFFFFF]set house [#11CC11]${getHouseData(houseId).description} [#FFFFFF]interior type to [#AAAAAA]${toLowerCase(typeParam)}`);
messageAdmins(`{ALTCOLOUR}${client.name} {MAINCOLOUR}set house {houseGreen}${getHouseData(houseId).description} {MAINCOLOUR}interior type to {ALTCOLOUR}${toLowerCase(typeParam)}`);
}
// ===========================================================================
@@ -439,7 +446,7 @@ function setHouseBlipCommand(command, params, client) {
let houseId = getPlayerHouse(client);
if(!getHouseData(houseId)) {
messagePlayerError(client, "House not found!");
messagePlayerError(client, getLocaleString(client, "InvalidHouse"));
return false;
}
@@ -448,8 +455,13 @@ function setHouseBlipCommand(command, params, client) {
getHouseData(houseId).entranceBlipModel = -1;
} else {
if(isNull(getGameConfig().blipSprites[getServerGame()][typeParam])) {
messagePlayerError(client, "Invalid house type! Use a house type name or a blip image ID");
messagePlayerInfo(client, `Pickup Types: [#AAAAAA]${Object.keys(getGameConfig().blipSprites[getServerGame()]).join(", ")}`)
let blipTypes = Object.keys(getGameConfig().blipSprites[getServerGame()]);
let chunkedList = splitArrayIntoChunks(blipTypes, 10);
messagePlayerNormal(client, makeChatBoxSectionHeader(getLocaleString(client, "HeaderBlipTypes")));
for(let i in chunkedList) {
messagePlayerInfo(client, chunkedList[i].join(", "));
}
return false;
}
@@ -466,7 +478,7 @@ function setHouseBlipCommand(command, params, client) {
resetHouseBlips(houseId);
getHouseData(houseId).needsSaved = true;
messageAdmins(`[#AAAAAA]${client.name} [#FFFFFF]set house [#11CC11]${getHouseData(houseId).description} [#FFFFFF]blip display to [#AAAAAA]${toLowerCase(typeParam)}`);
messageAdmins(`{ALTCOLOUR}${client.name} {MAINCOLOUR}set house {houseGreen}${getHouseData(houseId).description} {MAINCOLOUR}blip display to {ALTCOLOUR}${toLowerCase(typeParam)}`);
}
// ===========================================================================
@@ -560,7 +572,7 @@ function deleteHouseCommand(command, params, client) {
let houseId = getPlayerHouse(client);
if(!getHouseData(houseId)) {
messagePlayerError("House not found!");
messagePlayerError(client, getLocaleString(client, "InvalidHouse"));
return false;
}
@@ -592,8 +604,11 @@ function deleteHouse(houseId, whoDeleted = 0) {
disconnectFromDatabase(dbConnection);
}
deleteAllHouseBlips(houseId);
deleteAllHousePickups(houseId);
deleteHouseEntrancePickup(houseId);
deleteHouseExitPickup(houseId);
deleteHouseEntranceBlip(houseId);
deleteHouseExitBlip(houseId);
removePlayersFromHouse(houseId);
@@ -852,7 +867,7 @@ function createHouseEntrancePickup(houseId) {
}
if(getHouseData(houseId).entrancePickupModel != -1) {
let pickupModelId = getGameConfig().pickupModels[getServerGame()].house;
let pickupModelId = getGameConfig().pickupModels[getServerGame()].House;
if(getServerData().houses[houseId].entrancePickupModel != 0) {
pickupModelId = getHouseData(houseId).entrancePickupModel;
@@ -864,21 +879,6 @@ function createHouseEntrancePickup(houseId) {
setElementStreamInDistance(getBusinessData(businessId).entrancePickup, getGlobalConfig().housePickupStreamInDistance);
setElementStreamOutDistance(getBusinessData(businessId).entrancePickup, getGlobalConfig().housePickupStreamOutDistance);
setElementTransient(getHouseData(houseId).entrancePickup, false);
setEntityData(getHouseData(houseId).entrancePickup, "vrr.owner.type", VRR_PICKUP_HOUSE_ENTRANCE, false);
setEntityData(getHouseData(houseId).entrancePickup, "vrr.owner.id", houseId, false);
setEntityData(getHouseData(houseId).entrancePickup, "vrr.label.type", VRR_LABEL_HOUSE, true);
setEntityData(getHouseData(houseId).entrancePickup, "vrr.label.name", getHouseData(houseId).description, true);
setEntityData(getHouseData(houseId).entrancePickup, "vrr.label.locked", getHouseData(houseId).locked, true);
if(getHouseData(houseId).buyPrice > 0) {
setEntityData(getHouseData(houseId).entrancePickup, "vrr.label.price", getHouseData(houseId).buyPrice, true);
setEntityData(getHouseData(houseId).entrancePickup, "vrr.label.help", VRR_PROPLABEL_INFO_BUYHOUSE, true);
} else {
if(getHouseData(houseId).rentPrice > 0) {
setEntityData(getHouseData(houseId).entrancePickup, "vrr.label.rentprice", getHouseData(houseId).rentPrice, true);
setEntityData(getHouseData(houseId).entrancePickup, "vrr.label.help", VRR_PROPLABEL_INFO_RENTHOUSE, true);
}
}
addToWorld(getHouseData(houseId).entrancePickup);
}
}
@@ -891,7 +891,7 @@ function createHouseEntranceBlip(houseId) {
}
if(getHouseData(houseId).entranceBlipModel != -1) {
let blipModelId = getGameConfig().blipSprites[getServerGame()].house;
let blipModelId = getGameConfig().blipSprites[getServerGame()].House;
if(getServerData().houses[houseId].entranceBlipModel != 0) {
blipModelId = getHouseData(houseId).entranceBlipModel;
@@ -918,7 +918,7 @@ function createHouseExitPickup(houseId) {
if(getHouseData(houseId).hasInterior) {
if(getHouseData(houseId).exitPickupModel != -1) {
let pickupModelId = getGameConfig().pickupModels[getServerGame()].exit;
let pickupModelId = getGameConfig().pickupModels[getServerGame()].Exit;
if(getServerData().houses[houseId].exitPickupModel != 0) {
pickupModelId = getHouseData(houseId).exitPickupModel;
@@ -930,9 +930,6 @@ function createHouseExitPickup(houseId) {
setElementStreamInDistance(getBusinessData(businessId).exitPickup, getGlobalConfig().housePickupStreamInDistance);
setElementStreamOutDistance(getBusinessData(businessId).exitPickup, getGlobalConfig().housePickupStreamOutDistance);
setElementTransient(getHouseData(houseId).exitPickup, false);
setEntityData(getHouseData(houseId).exitPickup, "vrr.owner.type", VRR_PICKUP_HOUSE_EXIT, false);
setEntityData(getHouseData(houseId).exitPickup, "vrr.owner.id", houseId, false);
setEntityData(getHouseData(houseId).exitPickup, "vrr.label.type", VRR_LABEL_EXIT, true);
addToWorld(getHouseData(houseId).exitPickup);
}
}
@@ -947,7 +944,7 @@ function createHouseExitBlip(houseId) {
if(getHouseData(houseId).hasInterior) {
if(getHouseData(houseId).exitBlipModel != -1) {
let blipModelId = getGameConfig().blipSprites[getServerGame()].house;
let blipModelId = getGameConfig().blipSprites[getServerGame()].House;
if(getServerData().houses[houseId].exitBlipModel != 0) {
blipModelId = getHouseData(houseId).exitBlipModel;
@@ -1000,7 +997,7 @@ function getHouseInfoCommand(command, params, client) {
}
if(!getHouseData(houseId)) {
messagePlayerError(client, "House not found!");
messagePlayerError(client, getLocaleString(client, "InvalidHouse"));
return false;
}
@@ -1041,11 +1038,11 @@ function setHouseBuyPriceCommand(command, params, client) {
let splitParams = params.split(" ");
let amount = toInteger(splitParams[0]) || 0;
let amount = toInteger(getParam(params, " ", 1)) || 0;
let houseId = getPlayerHouse(client);
if(!getHouseData(houseId)) {
messagePlayerError(client, "House not found!");
messagePlayerError(client, getLocaleString(client, "InvalidHouse"));
return false;
}
@@ -1069,11 +1066,11 @@ function setHouseRentPriceCommand(command, params, client) {
let splitParams = params.split(" ");
let amount = toInteger(splitParams[0]) || 0;
let amount = toInteger(getParam(params, " ", 1)) || 0;
let houseId = getPlayerHouse(client);
if(!getHouseData(houseId)) {
messagePlayerError(client, "House not found!");
messagePlayerError(client, getLocaleString(client, "InvalidHouse"));
return false;
}
@@ -1093,17 +1090,17 @@ function buyHouseCommand(command, params, client) {
let houseId = getPlayerHouse(client);
if(!getHouseData(houseId)) {
messagePlayerError(client, "House not found!");
messagePlayerError(client, getLocaleString(client, "InvalidHouse"));
return false;
}
if(getHouseData(houseId).buyPrice <= 0) {
messagePlayerError(client, `{houseGreen}${getHouseData(houseId).description} {MAINCOLOUR}is not for sale!`);
messagePlayerError(client, getLocaleString(client, "HouseNotForSale"));
return false;
}
if(getPlayerCurrentSubAccount(client).cash < getHouseData(houseId).buyPrice) {
messagePlayerError(client, `You don't have enough money to buy house {houseGreen}${getHouseData(houseId).name}!`);
messagePlayerError(client, getLocaleString(client, "HousePurchaseNotEnoughMoney"));
return false;
}
@@ -1124,6 +1121,10 @@ function isPlayerInAnyHouse(client) {
// ===========================================================================
/**
* @param {number} houseIndex - The data index of the house
* @return {HouseData} The house's data (class instance)
*/
function getHouseData(houseId) {
if(typeof getServerData().houses[houseId] != "undefined") {
return getServerData().houses[houseId];
@@ -1390,4 +1391,50 @@ function canPlayerManageHouse(client, houseId) {
return false;
}
// ===========================================================================
function getHouseFromParams(params) {
if(isNaN(params)) {
for(let i in getServerData().houses) {
if(toLowerCase(getServerData().houses[i].description).indexOf(toLowerCase(params)) != -1) {
return i;
}
}
} else {
if(typeof getServerData().houses[params] != "undefined") {
return toInteger(params);
}
}
return false;
}
// ===========================================================================
function updateHousePickupLabelData(houseId) {
let houseData = getHouseData(houseId);
if(houseData.entrancePickup != null) {
setEntityData(houseData.entrancePickup, "vrr.owner.type", VRR_PICKUP_HOUSE_ENTRANCE, false);
setEntityData(houseData.entrancePickup, "vrr.owner.id", houseId, false);
setEntityData(houseData.entrancePickup, "vrr.label.type", VRR_LABEL_HOUSE, true);
//setEntityData(houseData.entrancePickup, "vrr.label.name", houseData.description, true);
setEntityData(houseData.entrancePickup, "vrr.label.locked", houseData.locked, true);
if(houseData.buyPrice > 0) {
setEntityData(houseData.entrancePickup, "vrr.label.price", houseData.buyPrice, true);
setEntityData(houseData.entrancePickup, "vrr.label.help", VRR_PROPLABEL_INFO_BUYHOUSE, true);
} else {
if(houseData.rentPrice > 0) {
setEntityData(houseData.entrancePickup, "vrr.label.rentprice", houseData.rentPrice, true);
setEntityData(houseData.entrancePickup, "vrr.label.help", VRR_PROPLABEL_INFO_RENTHOUSE, true);
}
}
}
if(houseData.exitPickup != null) {
setEntityData(houseData.exitPickup, "vrr.owner.type", VRR_PICKUP_HOUSE_EXIT, false);
setEntityData(houseData.exitPickup, "vrr.owner.id", houseId, false);
setEntityData(houseData.exitPickup, "vrr.label.type", VRR_LABEL_EXIT, true);
}
}
// ===========================================================================

85
scripts/server/index.js Normal file
View File

@@ -0,0 +1,85 @@
// Shared Scripts
require("../scripts/shared/const.js");
require("../scripts/shared/utilities.js");
require("../scripts/shared/gamedata.js");
// Multiplayer Mod (Wrapped Natives)
require("scripts/server/native/ragemp.js");
// Server Scripts
require("scripts/server/class.js");
require("scripts/server/accent.js");
require("scripts/server/account.js");
require("scripts/server/animation.js");
require("scripts/server/anticheat.js");
require("scripts/server/ban.js");
require("scripts/server/bitflag.js");
require("scripts/server/business.js");
require("scripts/server/chat.js");
require("scripts/server/clan.js");
require("scripts/server/client.js");
require("scripts/server/colour.js");
require("scripts/server/const.js");
require("scripts/server/database.js");
require("scripts/server/developer.js");
require("scripts/server/discord.js");
require("scripts/server/economy.js");
require("scripts/server/email.js");
require("scripts/server/event.js");
require("scripts/server/fishing.js");
require("scripts/server/gui.js");
require("scripts/server/help.js");
require("scripts/server/house.js");
require("scripts/server/item.js");
require("scripts/server/job.js");
require("scripts/server/keybind.js");
require("scripts/server/locale.js");
require("scripts/server/messaging.js");
require("scripts/server/misc.js");
require("scripts/server/npc.js");
require("scripts/server/staff.js");
require("scripts/server/radio.js");
require("scripts/server/security.js");
require("scripts/server/subaccount.js");
require("scripts/server/timers.js");
require("scripts/server/trigger.js");
require("scripts/server/utilities.js");
require("scripts/server/vehicle.js");
require("scripts/server/config.js");
require("scripts/server/core.js");
require("scripts/server/command.js");
// Server Business Scripts
require("scripts/server/business/bakery.js");
require("scripts/server/business/bar.js");
require("scripts/server/business/burger.js");
require("scripts/server/business/clothing.js");
require("scripts/server/business/club.js");
require("scripts/server/business/fuel.js");
require("scripts/server/business/mechanic.js");
require("scripts/server/business/pizza.js");
require("scripts/server/business/restaurant.js");
require("scripts/server/business/vehicle.js");
require("scripts/server/business/weapon.js");
// Server Job Scripts
require("scripts/server/job/bus.js");
require("scripts/server/job/drug.js");
require("scripts/server/job/fire.js");
require("scripts/server/job/garbage.js");
require("scripts/server/job/medic.js");
require("scripts/server/job/police.js");
require("scripts/server/job/taxi.js");
require("scripts/server/job/weapon.js");
// Server Item Scripts
require("scripts/server/item/food.js");
require("scripts/server/item/drink.js");
require("scripts/server/item/walkie-talkie.js");
require("scripts/server/item/phone.js");
require("scripts/server/item/handcuff.js");
require("scripts/server/item/rope.js");
require("scripts/server/item/tazer.js");
// Startup
require("scripts/server/startup.js");

View File

@@ -12,6 +12,7 @@ function initItemScript() {
getServerData().itemTypes = loadItemTypesFromDatabase();
getServerData().items = loadItemsFromDatabase();
setItemTypeDataIndexes();
setItemDataIndexes();
cacheAllGroundItems();
@@ -109,7 +110,7 @@ function createGroundItemObject(itemId) {
setElementRotation(getItemData(itemId).object, getItemTypeData(getItemData(itemId).itemTypeIndex).dropRotation);
setElementOnAllDimensions(getItemData(itemId).object, false);
setElementDimension(getItemData(itemId).object, getItemData(itemId).dimension);
setEntityData(getItemData(itemId).object, "vrr.scale", getItemTypeData(getItemData(itemId).itemTypeIndex).dropScale, true);
//setEntityData(getItemData(itemId).object, "vrr.scale", getItemTypeData(getItemData(itemId).itemTypeIndex).dropScale, true);
addToWorld(getItemData(itemId).object);
}
@@ -137,7 +138,7 @@ function createGroundItemCommand(command, params, client) {
let value = splitParams.slice(-1) || 1;
if(!getItemTypeData(itemType)) {
messagePlayerError(client, `Item '${itemType}' not found`);
messagePlayerError(client, getLocaleString(client, "InvalidItemType"));
return false;
}
@@ -159,7 +160,7 @@ function createItemCommand(command, params, client) {
let value = splitParams.slice(-1) || 1;
if(!getItemTypeData(itemType)) {
messagePlayerError(client, `Item '${params}' not found`);
messagePlayerError(client, getLocaleString("InvalidItemType"));
return false;
}
@@ -195,27 +196,31 @@ function useItemCommand(command, params, client) {
let itemId = getPlayerData(client).hotBarItems[hotBarSlot];
if(!getItemData(itemId)) {
messagePlayerError(client, `The item you're trying to use is bugged. A bug report has been sent to the server developers.`);
messagePlayerError(client, getLocaleString(client, "UseItemBug"));
submitBugReport(client, `(AUTOMATED REPORT) Use Item: Getting item data for item ${itemId} in player hotbar slot ${hotBarSlot} (cache ${getPlayerData(client).hotBarItems[hotBarSlot]}) returned false.`);
return false;
}
if(!getItemTypeData(getItemData(itemId).itemTypeIndex)) {
messagePlayerError(client, `The item you're trying to use is bugged. A bug report has been sent to the server developers.`);
messagePlayerError(client, getLocaleString(client, "UseItemBug"));
submitBugReport(client, `(AUTOMATED REPORT) Use Item: Getting item type ${getItemData(itemId).itemType} data for item ${itemId}/${getItemData(itemId).databaseId} in player hotbar slot ${hotBarSlot} (cache ${getPlayerData(client).hotBarItems[hotBarSlot]}) returned false.`);
return false;
}
if(getPlayerData(client).itemActionState != VRR_ITEM_ACTION_NONE) {
messagePlayerError(client, `Your hands are busy.`);
messagePlayerError(client, getLocaleString(client, "HandsBusy"));
return false;
}
if(getPlayerData(client).usingSkinSelect) {
messagePlayerError(client, `Your can't use an item while customizing your appearance`);
messagePlayerError(client, getLocaleString(client, "CantUseItemInSkinChange"));
return false;
}
if(getItemTypeData(getItemData(itemId).itemTypeIndex).useAnimationIndex != false) {
forcePlayerPlayAnimation(client, getItemTypeData(getItemData(itemId).itemTypeIndex).useAnimationIndex, 0.0);
}
getPlayerData(client).itemActionState = VRR_ITEM_ACTION_USE;
getPlayerData(client).itemActionItem = hotBarSlot;
showPlayerItemUseDelay(client, hotBarSlot);
@@ -276,15 +281,19 @@ function pickupItemCommand(command, params, client) {
}
if(getPlayerData(client).itemActionState != VRR_ITEM_ACTION_NONE) {
messagePlayerError(client, `Your hands are busy.`);
messagePlayerError(client, getLocaleString(client, "HandsBusy"));
return false;
}
if(getPlayerData(client).usingSkinSelect) {
messagePlayerError(client, `Your can't pick up an item while customizing your appearance`);
messagePlayerError(client, getLocaleString(client, "CantPickupItemInSkinChange"));
return false;
}
if(getItemTypeData(getItemData(itemId).itemTypeIndex).dropAnimationIndex != false) {
forcePlayerPlayAnimation(client, getItemTypeData(getItemData(itemId).itemTypeIndex).pickupAnimationIndex, 0.0);
}
getPlayerData(client).itemActionState = VRR_ITEM_ACTION_PICKUP;
getPlayerData(client).itemActionItem = itemId;
showPlayerItemPickupDelay(client, itemId);
@@ -328,12 +337,12 @@ function dropItemCommand(command, params, client) {
}
if(getPlayerData(client).itemActionState != VRR_ITEM_ACTION_NONE) {
messagePlayerError(client, `Your hands are busy.`);
messagePlayerError(client, getLocaleString(client, "HandsBusy"));
return false;
}
if(getPlayerData(client).usingSkinSelect) {
messagePlayerError(client, `Your can't drop an item while customizing your appearance`);
messagePlayerError(client, getLocaleString(client, "CantDropItemInSkinChange"));
return false;
}
@@ -342,6 +351,10 @@ function dropItemCommand(command, params, client) {
return false;
}
if(getItemTypeData(getItemData(itemId).itemTypeIndex).dropAnimationIndex != false) {
forcePlayerPlayAnimation(client, getItemTypeData(getItemData(itemId).itemTypeIndex).dropAnimationIndex, 0.0);
}
getPlayerData(client).itemActionState = VRR_ITEM_ACTION_DROP;
getPlayerData(client).itemActionItem = hotBarSlot;
showPlayerItemDropDelay(client, hotBarSlot);
@@ -371,12 +384,12 @@ function putItemCommand(command, params, client) {
}
if(getPlayerData(client).itemActionState != VRR_ITEM_ACTION_NONE) {
messagePlayerError(client, `Your hands are busy.`);
messagePlayerError(client, getLocaleString(client, "HandsBusy"));
return false;
}
if(getPlayerData(client).usingSkinSelect) {
messagePlayerError(client, `Your can't store an item while customizing your appearance`);
messagePlayerError(client, getLocaleString(client, "CantPutItemInSkinChange"));
return false;
}
@@ -385,6 +398,10 @@ function putItemCommand(command, params, client) {
return false;
}
if(getItemTypeData(getItemData(itemId).itemTypeIndex).putAnimationIndex != false) {
forcePlayerPlayAnimation(client, getItemTypeData(getItemData(itemId).itemTypeIndex).putAnimationIndex, 0.0);
}
getPlayerData(client).itemActionItem = hotBarSlot;
getPlayerData(client).itemActionState = VRR_ITEM_ACTION_PUT;
showPlayerItemPutDelay(client, hotBarSlot);
@@ -414,12 +431,12 @@ function takeItemCommand(command, params, client) {
}
if(getPlayerData(client).itemActionState != VRR_ITEM_ACTION_NONE) {
messagePlayerError(client, `Your hands are busy.`);
messagePlayerError(client, getLocaleString(client, "HandsBusy"));
return false;
}
if(getPlayerData(client).usingSkinSelect) {
messagePlayerError(client, `Your can't take an item while customizing your appearance`);
messagePlayerError(client, getLocaleString(client, "CantTakeItemInSkinChange"));
return false;
}
@@ -428,6 +445,10 @@ function takeItemCommand(command, params, client) {
// return false;
//}
if(getItemTypeData(getItemData(itemId).itemTypeIndex).takeAnimationIndex != false) {
forcePlayerPlayAnimation(client, getItemTypeData(getItemData(itemId).itemTypeIndex).takeAnimationIndex, 0.0);
}
getPlayerData(client).itemActionItem = itemId;
getPlayerData(client).itemActionState = VRR_ITEM_ACTION_TAKE;
showPlayerItemTakeDelay(client, itemId);
@@ -455,12 +476,11 @@ function setItemTypeDropModelCommand(command, params, client) {
return false;
}
let splitParams = params.split(" ");
let itemTypeIndex = getItemTypeFromParams(splitParams.slice(0,-1).join(" "));
let modelId = splitParams[splitParams.length-1];
if(!getItemTypeData(itemTypeIndex)) {
messagePlayerError(client, `Invalid item type`);
messagePlayerError(client, getLocaleString(client, "InvalidItemType"));
return false;
}
@@ -476,12 +496,11 @@ function setItemTypeOrderPriceCommand(command, params, client) {
return false;
}
let splitParams = params.split(" ");
let itemTypeIndex = getItemTypeFromParams(splitParams.slice(0,-1).join(" "));
let orderPrice = splitParams[splitParams.length-1];
if(!getItemTypeData(itemTypeIndex)) {
messagePlayerError(client, `Invalid item type`);
messagePlayerError(client, getLocaleString(client, "InvalidItemType"));
return false;
}
@@ -497,12 +516,11 @@ function setItemTypeRiskMultiplierCommand(command, params, client) {
return false;
}
let splitParams = params.split(" ");
let itemTypeIndex = getItemTypeFromParams(splitParams.slice(0,-1).join(" "));
let riskMultiplier = splitParams[splitParams.length-1];
if(!getItemTypeData(itemTypeIndex)) {
messagePlayerError(client, `Invalid item type`);
messagePlayerError(client, getLocaleString(client, "InvalidItemType"));
return false;
}
@@ -521,7 +539,7 @@ function toggleItemTypeEnabledCommand(command, params, client) {
let itemTypeIndex = getItemTypeFromParams(params);
if(!getItemTypeData(itemTypeIndex)) {
messagePlayerError(client, `Invalid item type`);
messagePlayerError(client, getLocaleString(client, "InvalidItemType"));
return false;
}
@@ -537,12 +555,11 @@ function setItemTypeUseTypeCommand(command, params, client) {
return false;
}
let splitParams = params.split(" ");
let itemTypeIndex = getItemTypeFromParams(splitParams.slice(0,-1).join(" "));
let useType = splitParams[splitParams.length-1];
if(!getItemTypeData(itemTypeIndex)) {
messagePlayerError(client, `Invalid item type`);
messagePlayerError(client, getLocaleString(client, "InvalidItemType"));
return false;
}
@@ -558,12 +575,11 @@ function setItemTypeUseValueCommand(command, params, client) {
return false;
}
let splitParams = params.split(" ");
let itemTypeIndex = getItemTypeFromParams(splitParams.slice(0,-1).join(" "));
let useValue = splitParams[splitParams.length-1];
if(!getItemTypeData(itemTypeIndex)) {
messagePlayerError(client, `Invalid item type`);
messagePlayerError(client, getLocaleString(client, "InvalidItemType"));
return false;
}
@@ -593,7 +609,26 @@ function playerUseItem(client, hotBarSlot) {
break;
case VRR_ITEM_USETYPE_WEAPON:
messagePlayerError(client, `The ${getItemName(itemIndex)} is a weapon. To use it, switch to it from your items. The use key has no effect.`);
for(let i in getPlayerData(client).hotBarItems) {
if(getPlayerData(client).hotBarItems[i] != -1) {
if(getItemData(getPlayerData(client).hotBarItems[i]) != false) {
if(getItemTypeData(getItemData(getPlayerData(client).hotBarItems[i]).itemTypeIndex).useType == VRR_ITEM_USETYPE_AMMO_CLIP) {
if(getItemTypeData(getItemData(getPlayerData(client).hotBarItems[i]).itemTypeIndex).useId == getItemTypeData(getItemData(itemIndex).itemTypeIndex).databaseId) {
givePlayerWeaponAmmo(client, getItemData(getPlayerData(client).hotBarItems[i]).value);
getItemData(getPlayerData(client).hotBarItems[hotBarSlot]).value = getItemData(getPlayerData(client).hotBarItems[hotBarSlot]).value + getItemData(getPlayerData(client).hotBarItems[i]).value;
deleteItem(getPlayerData(client).hotBarItems[i]);
meActionToNearbyPlayers(client, `loads some ammo into their ${getItemTypeData(getItemData(itemIndex).itemTypeIndex).name}`);
return true;
}
}
}
}
}
messagePlayerError(client, `You don't have any ammo to load into your ${getItemTypeData(getItemData(itemIndex).itemTypeIndex).name}!`);
break;
case VRR_ITEM_USETYPE_AMMO_CLIP:
messagePlayerError(client, `To load this ammo into a weapon, equip the weapon and ${(doesPlayerHaveKeyBindForCommand(client, "use")) ? `press {ALTCOLOUR}${toUpperCase(getKeyNameFromId(getPlayerKeyBindForCommand(client, "use").key))}` : `{ALTCOLOUR}/use`}`);
break;
case VRR_ITEM_USETYPE_STORAGE:
@@ -603,6 +638,7 @@ function playerUseItem(client, hotBarSlot) {
case VRR_ITEM_USETYPE_FOOD:
meActionToNearbyPlayers(client, `eats some of their ${getItemName(itemIndex)}`);
givePlayerHealth(client, getItemTypeData(getItemData(itemIndex).itemTypeIndex).useValue);
getItemData(itemIndex).value = getItemData(itemIndex).value - getItemTypeData(getItemData(itemIndex).itemTypeIndex).useValue;
if(getItemData(itemIndex).value <= 0) {
deleteItem(itemIndex);
switchPlayerActiveHotBarSlot(client, -1);
@@ -610,7 +646,7 @@ function playerUseItem(client, hotBarSlot) {
break;
case VRR_ITEM_USETYPE_DRINK:
meActionToNearbyPlayers(client, `drink some of their ${getItemName(itemIndex)}`);
meActionToNearbyPlayers(client, `drinks some of their ${getItemName(itemIndex)}`);
givePlayerHealth(client, getItemTypeData(getItemData(itemIndex).itemTypeIndex).useValue);
getItemData(itemIndex).value = getItemData(itemIndex).value - getItemTypeData(getItemData(itemIndex).itemTypeIndex).useValue;
if(getItemData(itemIndex).value <= 0) {
@@ -627,7 +663,7 @@ function playerUseItem(client, hotBarSlot) {
break;
case VRR_ITEM_USETYPE_ROPE:
closestPlayer = getClosestPlayer(getPlayerPosition(client), client);
closestPlayer = getClosestPlayer(getPlayerPosition(client), client.player);
if(!getPlayerData(closestPlayer)) {
messagePlayerError(client, "There isn't anyone close enough to tie up!");
@@ -714,7 +750,7 @@ function playerUseItem(client, hotBarSlot) {
vehicle = getClosestVehicle(getPlayerPosition(client));
if(getDistance(getPlayerPosition(client), getVehiclePosition(vehicle)) <= getGlobalConfig().vehicleRepairDistance) {
meActionToNearbyPlayers(client, `takes their decal kit and adds some decals to the vehicle.`);
setVehicleLivery(vehicle, getItemData(itemIndex).useValue);
setVehicleLivery(vehicle, getItemData(itemIndex).value);
}
break;
@@ -723,11 +759,11 @@ function playerUseItem(client, hotBarSlot) {
if(getDistance(getPlayerPosition(client), getVehiclePosition(vehicle)) <= getGlobalConfig().vehicleRepairDistance) {
if(getItemData(itemIndex).useId == 1) {
meActionToNearbyPlayers(client, `takes their vehicle colour kit and changes the primary colour of the vehicle.`);
vehicle.colour1 = getItemData(itemIndex).useValue;
vehicle.colour1 = getItemData(itemIndex).value;
} else {
if(getItemData(itemIndex).useId == 1) {
meActionToNearbyPlayers(client, `takes their vehicle colour kit and changes the secondary colour of the vehicle.`);
vehicle.colour2 = getItemData(itemIndex).useValue;
vehicle.colour2 = getItemData(itemIndex).value;
}
}
}
@@ -754,11 +790,11 @@ function playerUseItem(client, hotBarSlot) {
if(getDistance(getPlayerPosition(client), getFuelPumpData(fuelPump).position) <= getGlobalConfig().vehicleRepairDistance) {
if(getItemData(itemIndex).useId == 1) {
meActionToNearbyPlayers(client, `takes their vehicle colour kit and changes the primary colour of the vehicle.`);
vehicle.colour1 = getItemData(itemIndex).useValue;
vehicle.colour1 = getItemTypeData(itemIndex).value;
} else {
if(getItemData(itemIndex).useId == 1) {
meActionToNearbyPlayers(client, `takes their vehicle colour kit and changes the secondary colour of the vehicle.`);
vehicle.colour2 = getItemData(itemIndex).useValue;
vehicle.colour2 = getItemData(itemIndex).value;
}
}
}
@@ -790,14 +826,30 @@ function playerUseItem(client, hotBarSlot) {
case VRR_ITEM_USETYPE_SMOKEDRUG:
meActionToNearbyPlayers(client, `smokes some ${getItemName(itemIndex)}`);
givePlayerHealth(client, 25);
getPlayerData(client).incomingDamageMultiplier = getPlayerData(client).incomingDamageMultiplier-(getItemTypeData(getItemData(itemIndex).itemTypeIndex).useValue/100);
if(getPlayerData(client).incomingDamageMultiplier < 0.25) {
getPlayerData(client).incomingDamageMultiplier = 0.25;
}
deleteItem(itemIndex);
switchPlayerActiveHotBarSlot(client, -1);
break;
case VRR_ITEM_USETYPE_SNORTDRUG:
meActionToNearbyPlayers(client, `snorts some ${getItemName(itemIndex)}`);
givePlayerHealth(client, 50);
getPlayerData(client).incomingDamageMultiplier = getPlayerData(client).incomingDamageMultiplier-(getItemTypeData(getItemData(itemIndex).itemTypeIndex).useValue/100);
if(getPlayerData(client).incomingDamageMultiplier < 0.25) {
getPlayerData(client).incomingDamageMultiplier = 0.25;
}
deleteItem(itemIndex);
switchPlayerActiveHotBarSlot(client, -1);
break;
case VRR_ITEM_USETYPE_INJECTDRUG:
meActionToNearbyPlayers(client, `shoots up some ${getItemName(itemIndex)}`);
getPlayerData(client).incomingDamageMultiplier = getPlayerData(client).incomingDamageMultiplier-(getItemTypeData(getItemData(itemIndex).itemTypeIndex).useValue/100);
if(getPlayerData(client).incomingDamageMultiplier < 0.25) {
getPlayerData(client).incomingDamageMultiplier = 0.25;
}
deleteItem(itemIndex);
switchPlayerActiveHotBarSlot(client, -1);
break;
@@ -824,6 +876,10 @@ function playerUseItem(client, hotBarSlot) {
}
break;
case VRR_ITEM_USETYPE_AMMO_CLIP:
messagePlayerError(client, `Equip a compatible weapon and press R to use an ammo clip/magazine`);
break;
default:
messagePlayerError(client, `The ${getItemName(itemIndex)} doesn't do anything when you try to use it.`);
break;
@@ -920,10 +976,12 @@ function playerPickupItem(client, itemId) {
function playerTakeItem(client, itemId) {
let firstSlot = getPlayerFirstEmptyHotBarSlot(client);
if(firstSlot == -1) {
messagePlayerError(client, "You don't have enough space to hold another item");
messagePlayerError(client, getLocaleString(client, "NoSpaceSelfInventory"));
return false;
}
let ownerId = getItemIdFromDatabaseId(getItemData(itemId).ownerId);
getItemData(itemId).ownerType = VRR_ITEM_OWNER_PLAYER;
getItemData(itemId).ownerId = getPlayerCurrentSubAccount(client).databaseId;
@@ -932,19 +990,27 @@ function playerTakeItem(client, itemId) {
switch(bestOwner[1]) {
case VRR_ITEM_OWNER_HOUSE:
meActionToNearbyPlayers(client, `takes ${getProperDeterminerForName(getItemName(itemId))} ${getItemName(itemId)} from the house`);
meActionToNearbyPlayers(client, getLocaleString(client, "TakeItemFromHouse", getItemName(itemId)));
break;
case VRR_ITEM_OWNER_BIZFLOOR:
meActionToNearbyPlayers(client, `takes ${getProperDeterminerForName(getItemName(itemId))} ${getItemName(itemId)} from the business`);
meActionToNearbyPlayers(client, getLocaleString(client, "TakeItemFromBusiness", getItemName(itemId)));
break;
case VRR_ITEM_OWNER_BIZSTORAGE:
meActionToNearbyPlayers(client, `takes ${getProperDeterminerForName(getItemName(itemId))} ${getItemName(itemId)} from the business storage room`);
meActionToNearbyPlayers(client, getLocaleString(client, "TakeItemFromBusinessStorage", getItemName(itemId)));
break;
case VRR_ITEM_OWNER_VEHTRUNK:
meActionToNearbyPlayers(client, `takes ${getProperDeterminerForName(getItemName(itemId))} ${getItemName(itemId)} from the trunk`);
meActionToNearbyPlayers(client, getLocaleString(client, "TakeItemFromVehicleTrunk", getItemName(itemId)));
break;
case VRR_ITEM_OWNER_VEHDASH:
meActionToNearbyPlayers(client, getLocaleString(client, "TakeItemFromVehicleDash", getItemName(itemId)));
break;
case VRR_ITEM_OWNER_ITEM:
meActionToNearbyPlayers(client, getLocaleString(client, "TakeItemFromItem", getItemName(itemId)), getItemName(ownerId));
break;
}
}
@@ -997,8 +1063,16 @@ function playerSwitchItem(client, newHotBarSlot) {
setPlayerWeaponDamageEnabled(client, true);
setPlayerWeaponDamageEvent(client, VRR_WEAPON_DAMAGE_EVENT_NORMAL);
} else {
messagePlayerError(client, `The ${getItemName(newHotBarItem)} in slot ${newHotBarSlot} has no ammo, and can't be equipped!`);
return false;
let ammoItemSlot = getPlayerFirstAmmoItemForWeapon(client, getItemTypeData(getItemData(newHotBarItem).itemTypeIndex).useId);
if(ammoItemSlot != false) {
getItemData(newHotBarItem).value = getItemData(getPlayerData(client).hotBarItems[ammoItemSlot]).value;
givePlayerWeapon(client, toInteger(getItemTypeData(getItemData(newHotBarItem).itemTypeIndex).useId), toInteger(getItemData(newHotBarItem).value), true, true);
setPlayerWeaponDamageEnabled(client, true);
setPlayerWeaponDamageEvent(client, VRR_WEAPON_DAMAGE_EVENT_NORMAL);
deleteItem(getPlayerData(client).hotBarItems[ammoItemSlot]);
} else {
messagePlayerError(client, getLocaleString(client, "ItemUnequippableNoAmmo", getItemName(newHotBarItem), newHotBarSlot));
}
}
} else if(getItemTypeData(getItemData(newHotBarItem).itemTypeIndex).useType == VRR_ITEM_USETYPE_TAZER) {
if(getItemData(newHotBarItem).value > 0) {
@@ -1006,8 +1080,7 @@ function playerSwitchItem(client, newHotBarSlot) {
setPlayerWeaponDamageEnabled(client, false);
setPlayerWeaponDamageEvent(client, VRR_WEAPON_DAMAGE_EVENT_TAZER);
} else {
messagePlayerError(client, `The ${getItemName(newHotBarItem)} in slot ${newHotBarSlot} has no ammo, and can't be equipped!`);
return false;
messagePlayerError(client, getLocaleString(client, "ItemUnequippableNoAmmo", getItemName(newHotBarItem), newHotBarSlot));
}
}
}
@@ -1043,7 +1116,7 @@ function playerSwitchHotBarSlotCommand(command, params, client) {
let hotBarSlot = toInteger(params);
if(hotBarSlot < 0 || hotBarSlot > 9) {
messagePlayerError(client, "Use slot number between 1 and 9, or 0 for none!");
messagePlayerError(client, getLocaleString(client, "ItemSlotMustBeBetween", "1", "9"));
return false;
}
@@ -1060,12 +1133,12 @@ function playerSwitchHotBarSlotCommand(command, params, client) {
}
if(getPlayerData(client).itemActionState != VRR_ITEM_ACTION_NONE) {
messagePlayerError(client, `Your hands are busy.`);
messagePlayerError(client, getLocaleString(client, "HandsBusy"));
return false;
}
if(getPlayerData(client).usingSkinSelect) {
messagePlayerError(client, `Your can't switch items while customizing your appearance`);
messagePlayerError(client, getLocaleString(client, "CantSwitchItemInSkinChange"));
return false;
}
@@ -1099,6 +1172,23 @@ function setItemDataIndexes() {
// ===========================================================================
function setItemTypeDataIndexes() {
for(let i in getServerData().itemTypes) {
if(getServerData().itemTypes[i]) {
getServerData().itemTypes[i].index = i;
getServerData().itemTypes[i].useAnimationIndex = getAnimationFromParams(getServerData().itemTypes[i].useAnimationName);
getServerData().itemTypes[i].switchAnimationIndex = getAnimationFromParams(getServerData().itemTypes[i].switchAnimationName);
getServerData().itemTypes[i].dropAnimationIndex = getAnimationFromParams(getServerData().itemTypes[i].dropAnimationName);
getServerData().itemTypes[i].putAnimationIndex = getAnimationFromParams(getServerData().itemTypes[i].putAnimationName);
getServerData().itemTypes[i].takeAnimationIndex = getAnimationFromParams(getServerData().itemTypes[i].takeAnimationName);
getServerData().itemTypes[i].giveAnimationIndex = getAnimationFromParams(getServerData().itemTypes[i].giveAnimationName);
getServerData().itemTypes[i].pickupAnimationIndex = getAnimationFromParams(getServerData().itemTypes[i].pickupAnimationName);
}
}
}
// ===========================================================================
function cacheAllGroundItems() {
getServerData().groundItemCache = [];
@@ -1161,57 +1251,74 @@ function cachePlayerHotBarItems(client) {
// ===========================================================================
function deleteItem(itemId) {
let owner = -1;
let ownerTypeString = "Unknown";
switch(getItemData(itemId).ownerType) {
case VRR_ITEM_OWNER_GROUND:
ownerTypeString = "Ground/Dropped";
deleteGroundItemObject(itemId);
getServerData().groundItemCache.splice(getServerData().groundItemCache.indexOf(itemId), 1);
break;
case VRR_ITEM_OWNER_PLAYER:
if(getPlayerFromCharacterId(getItemData(itemId).ownerId)) {
switchPlayerActiveHotBarSlot(getPlayerFromCharacterId(getItemData(itemId).ownerId), -1);
getPlayerData(getPlayerFromCharacterId(getItemData(itemId).ownerId)).hotBarItems[getPlayerData(getPlayerFromCharacterId(getItemData(itemId).ownerId)).hotBarItems.indexOf(itemId)] = -1;
updatePlayerHotBar(getPlayerFromCharacterId(getItemData(itemId).ownerId));
ownerTypeString = "Player";
owner = getPlayerFromCharacterId(getItemData(itemId).ownerId);
if(getPlayerData(owner) != false) {
switchPlayerActiveHotBarSlot(owner, -1);
getPlayerData(owner).hotBarItems[getPlayerData(owner).hotBarItems.indexOf(itemId)] = -1;
updatePlayerHotBar(owner);
}
break;
case VRR_ITEM_OWNER_JOBLOCKER:
if(getPlayerFromCharacterId(getItemData(itemId).ownerId)) {
getPlayerData(getPlayerFromCharacterId(getItemData(itemId).ownerId)).jobLockerCache.splice(getPlayerData(getPlayerFromCharacterId(getItemData(itemId).ownerId)).jobLockerCache.indexOf(itemId), 1);
ownerTypeString = "Job Locker";
owner = getPlayerFromCharacterId(getItemData(itemId).ownerId);
if(getPlayerData(owner) != false) {
getPlayerData(owner).jobLockerCache.splice(getPlayerData(owner).jobLockerCache.indexOf(itemId), 1);
}
break;
case VRR_ITEM_OWNER_LOCKER:
if(getPlayerFromCharacterId(getItemData(itemId).ownerId)) {
getPlayerData(getPlayerFromCharacterId(getItemData(itemId).ownerId)).lockerCache.splice(getPlayerData(getPlayerFromCharacterId(getItemData(itemId).ownerId)).lockerCache.indexOf(itemId), 1);
ownerTypeString = "Locker";
owner = getPlayerFromCharacterId(getItemData(itemId).ownerId);
if(getPlayerData(owner) != false) {
getPlayerData(owner).lockerCache.splice(getPlayerData(owner).lockerCache.indexOf(itemId), 1);
}
break;
case VRR_ITEM_OWNER_VEHTRUNK:
if(getVehicleDataIndex(getItemData(itemId).ownerId)) {
getVehicleDataIndex(getItemData(itemId).ownerId).trunkItemCache.splice(getVehicleDataIndex(getItemData(itemId).ownerId).trunkItemCache.indexOf(itemId), 1);
ownerTypeString = "Vehicle Trunk";
owner = getVehicleFromDatabaseId(getItemData(itemId).ownerId)
if(getVehicleData(owner) != false) {
getVehicleDataIndex(getItemData(itemId).ownerId).trunkItemCache.splice(getVehicleData(owner).trunkItemCache.indexOf(itemId), 1);
}
break;
case VRR_ITEM_OWNER_BIZFLOOR:
if(getBusinessDataIndex(getItemData(itemId).ownerId)) {
getBusinessDataIndex(getItemData(itemId).ownerId).floorItemCache.splice(getBusinessDataIndex(getItemData(itemId).ownerId).floorItemCache.indexOf(itemId), 1);
ownerTypeString = "Business Floor";
owner = getBusinessIdFromDatabaseId(getItemData(itemId).ownerId);
if(getBusinessData(owner) != false) {
getBusinessData(owner).floorItemCache.splice(getBusinessData(owner).floorItemCache.indexOf(itemId), 1);
}
break;
case VRR_ITEM_OWNER_BIZSTORAGE:
if(getBusinessDataIndex(getItemData(itemId).ownerId)) {
getBusinessDataIndex(getItemData(itemId).ownerId).storageItemCache.splice(getBusinessDataIndex(getItemData(itemId).ownerId).storageItemCache.indexOf(itemId), 1);
ownerTypeString = "Business Storage";
owner = getBusinessIdFromDatabaseId(getItemData(itemId).ownerId);
if(getBusinessData(owner) != false) {
getBusinessData(owner).storageItemCache.splice(getBusinessData(owner).storageItemCache.indexOf(itemId), 1);
}
break;
case VRR_ITEM_OWNER_HOUSE:
if(getHouseDataIndex(getItemData(itemId).ownerId)) {
getHouseDataIndex(getItemData(itemId).ownerId).itemCache.splice(getHouseDataIndex(getItemData(itemId).ownerId).itemCache.indexOf(itemId), 1);
ownerTypeString = "House";
owner = getHouseIdFromDatabaseId(getItemData(itemId).ownerId);
if(getHouseData(owner) != false) {
getHouseData(owner).itemCache.splice(getHouseData(owner).itemCache.indexOf(itemId), 1);
}
break;
}
logToConsole(LOG_DEBUG, `Deleted item ${itemId} (DBID: ${getItemData(itemId).databaseId}, Owner Type: ${ownerTypeString}, Owner ID: ${getItemData(itemId).ownerId})`);
if(getItemData(itemId).databaseId > 0) {
quickDatabaseQuery(`DELETE FROM item_main WHERE item_id = ${getItemData(itemId).databaseId}`);
@@ -1297,7 +1404,7 @@ function listBusinessStorageInventoryCommand(command, params, client) {
let businessId = (isPlayerInAnyBusiness(client)) ? getPlayerBusiness(client) : getClosestBusinessEntrance(getPlayerPosition(client));
if(!getBusinessData(businessId)) {
messagePlayerError(client, "Business not found!");
messagePlayerError(client, getLocaleString(client, "InvalidBusiness"));
return false;
}
@@ -1315,7 +1422,7 @@ function listBusinessFloorInventoryCommand(command, params, client) {
let businessId = (isPlayerInAnyBusiness(client)) ? getPlayerBusiness(client) : getClosestBusinessEntrance(getPlayerPosition(client));
if(!getBusinessData(businessId)) {
messagePlayerError(client, "Business not found!");
messagePlayerError(client, getLocaleString(client, "InvalidBusiness"));
return false;
}
@@ -1333,7 +1440,7 @@ function listHouseInventoryCommand(command, params, client) {
let houseId = (isPlayerInAnyHouse(client)) ? getPlayerHouse(client) : getClosestHouseEntrance(getPlayerPosition(client));
if(!getHouseData(houseId)) {
messagePlayerError(client, "House not found!");
messagePlayerError(client, getLocaleString(client, "InvalidHouse"));
return false;
}
@@ -1538,12 +1645,24 @@ function restorePlayerJobLockerItems(client) {
// ===========================================================================
function getItemIndexFromDatabaseId(databaseId) {
for(let i in getServerData().items) {
if(getServerData().items[i].databaseId == databaseId) {
return i;
}
}
return false;
}
// ===========================================================================
function getItemTypeIndexFromDatabaseId(databaseId) {
for(let i in getServerData().itemTypes) {
if(getServerData().itemTypes[i].databaseId == databaseId) {
return i;
}
}
return false;
}
// ===========================================================================
@@ -1661,22 +1780,21 @@ function deleteItemInPlayerInventoryCommand(command, params, client) {
return false;
}
let splitParams = params.split(" ");
let targetClient = getPlayerFromParams(splitParams[0]);
let hotBarSlot = splitParams[1];
let targetClient = getPlayerFromParams(getParam(params, " ", 1));
let hotBarSlot = getParam(params, " ", 2);
if(!targetClient) {
messagePlayerError(client, `Player not found!`);
messagePlayerError(client, getLocaleString(client, "InvalidPlayer"));
return false;
}
if(isNaN(hotBarSlot)) {
messagePlayerError(client, `The item slot must be a number!`);
messagePlayerError(client, getLocaleString(client, "ItemSlotNotNumber"));
return false;
}
if(toInteger(hotBarSlot) <= 0 || toInteger(hotBarSlot) > 9) {
messagePlayerError(client, `The item slot must be between 1 and 9!`);
messagePlayerError(client, getLocaleString(client, "ItemSlotMustBeBetween", "1", "9"));
return false;
}
@@ -1703,12 +1821,11 @@ function deleteAllItemsInPlayerInventoryCommand(command, params, client) {
return false;
}
let splitParams = params.split(" ");
let targetClient = getPlayerFromParams(splitParams[0]);
let hotBarSlot = splitParams[1];
let targetClient = getPlayerFromParams(getParam(params, " ", 1));
let hotBarSlot = getParam(params, " ", 2);
if(!targetClient) {
messagePlayerError(client, `Player not found!`);
messagePlayerError(client, getLocaleString(client, "InvalidPlayer"));
return false;
}
@@ -1776,6 +1893,7 @@ function getOrderPriceForItemType(itemType) {
function clearPlayerItemActionState(client) {
getPlayerData(client).itemActionState = VRR_ITEM_ACTION_NONE;
getPlayerData(client).itemActionItem = -1;
makePlayerStopAnimation(client);
}
// ===========================================================================
@@ -1799,10 +1917,10 @@ function showBusinessFloorInventoryToPlayer(client, businessId) {
}
}
messagePlayerNormal(client, `💲 {businessBlue}== Business Items =========================`);
messagePlayerNormal(client, makeChatBoxSectionHeader(getLocaleString(client, "HeaderBusinessFloorItemList")));
let chunkedList = splitArrayIntoChunks(itemDisplay, 5);
for(let i in chunkedList) {
messagePlayerNormal(client, chunkedList[i].join(`{MAINCOLOUR}, `), COLOUR_WHITE);
messagePlayerNormal(client, chunkedList[i].join(`{MAINCOLOUR} `), COLOUR_WHITE);
}
}
@@ -1818,11 +1936,11 @@ function showBusinessStorageInventoryToPlayer(client, businessId) {
}
}
messagePlayerNormal(client, `🏢 {businessBlue}== Business Storage =======================`);
messagePlayerNormal(client, makeChatBoxSectionHeader(getLocaleString(client, "HeaderBusinessStorageItemList")));
let chunkedList = splitArrayIntoChunks(itemDisplay, 5);
for(let i in chunkedList) {
messagePlayerNormal(client, chunkedList[i].join(`{MAINCOLOUR}, `), COLOUR_WHITE);
messagePlayerNormal(client, chunkedList[i].join(`{MAINCOLOUR} `), COLOUR_WHITE);
}
}
@@ -1838,11 +1956,11 @@ function showItemInventoryToPlayer(client, itemId) {
}
}
messagePlayerNormal(client, `📦 {ALTCOLOUR}== Items Inside ===========================`);
messagePlayerNormal(client, makeChatBoxSectionHeader(getLocaleString(client, "HeaderItemItemsList")));
let chunkedList = splitArrayIntoChunks(itemDisplay, 5);
for(let i in chunkedList) {
messagePlayerNormal(client, chunkedList[i].join(`{MAINCOLOUR}, `), COLOUR_WHITE);
messagePlayerNormal(client, chunkedList[i].join(`{MAINCOLOUR} `), COLOUR_WHITE);
}
}
@@ -1864,14 +1982,14 @@ function showPlayerInventoryToPlayer(client, targetClient) {
}
if(client == targetClient) {
messagePlayerNormal(client, `🎒 {ALTCOLOUR}== Your Inventory =========================`);
messagePlayerNormal(client, makeChatBoxSectionHeader(getLocaleString(client, "HeaderSelfItemList")));
} else {
messagePlayerNormal(client, `🎒 {ALTCOLOUR}== ${getCharacterFullName(targetClient)}'s Inventory =========================`);
messagePlayerNormal(client, makeChatBoxSectionHeader(getLocaleString(client, "HeaderPlayerItemList")));
}
let chunkedList = splitArrayIntoChunks(itemDisplay, 5);
for(let i in chunkedList) {
messagePlayerNormal(client, chunkedList[i].join(`{MAINCOLOUR}, `), COLOUR_WHITE);
messagePlayerNormal(client, chunkedList[i].join(`{MAINCOLOUR} `), COLOUR_WHITE);
}
}
@@ -1887,11 +2005,11 @@ function showHouseInventoryToPlayer(client, houseId) {
}
}
messagePlayerNormal(client, `🏠 {houseGreen}== House Items ============================`);
messagePlayerNormal(client, makeChatBoxSectionHeader(getLocaleString(client, "HeaderHouseItemList")));
let chunkedList = splitArrayIntoChunks(itemDisplay, 5);
for(let i in chunkedList) {
messagePlayerNormal(client, chunkedList[i].join(`{MAINCOLOUR}, `), COLOUR_WHITE);
messagePlayerNormal(client, chunkedList[i].join(`{MAINCOLOUR} `), COLOUR_WHITE);
}
}
@@ -1946,4 +2064,39 @@ function createGroundPlant(itemId) {
}
// ===========================================================================
function getItemTypeFromParams(params) {
if(isNaN(params)) {
for(let i in getServerData().itemTypes) {
if(toLowerCase(getServerData().itemTypes[i].name).indexOf(toLowerCase(params)) != -1) {
return i;
}
}
} else {
if(typeof getServerData().itemTypes[params] != "undefined") {
return toInteger(params);
}
}
return false;
}
// ===========================================================================
function getPlayerFirstAmmoItemForWeapon(client, weaponId) {
for(let i in getPlayerData(client).hotBarItems) {
if(getPlayerData(client).hotBarItems[i] != -1) {
if(getItemData(getPlayerData(client).hotBarItems[i]) != false) {
if(getItemTypeData(getItemData(getPlayerData(client).hotBarItems[i]).itemTypeIndex).useType == VRR_ITEM_USETYPE_AMMO_CLIP) {
if(getItemTypeData(getItemData(getPlayerData(client).hotBarItems[i]).itemTypeIndex).useId == weaponId) {
return i;
}
}
}
}
}
return false;
}
// ===========================================================================

View File

@@ -19,6 +19,11 @@ function tazePlayer(client) {
getPlayerData(client).pedState = VRR_PEDSTATE_TAZED;
setPlayerControlState(client, false);
let animationId = getAnimationFromParams("tazed");
if(animationId != false) {
forcePlayerPlayAnimation(client, animationId);
}
setTimeout(function() {
unTazePlayer(client);
doActionToNearbyPlayers(client, `The tazer effect wears off`);
@@ -29,7 +34,11 @@ function tazePlayer(client) {
function unTazePlayer(client) {
getPlayerData(client).pedState = VRR_PEDSTATE_READY;
setPlayerControlState(client, true);
setPlayerPosition(client, getPlayerData(client).currentAnimationPositionReturnTo);
makePedStopAnimation(getPlayerData(client).ped);
}
// ===========================================================================

File diff suppressed because it is too large Load Diff

View File

@@ -9,439 +9,5 @@
// Routes are divided up per-island. Smaller islands will have less routes.
// Routes will attempt to cross over into other routes whenever possible, creating transfer stops.
// All routes will start and stop at the same transit station, creating a central hub for all routes
// Routes are identified by island name and colour. Example: Portland Red Line or Los Santos Blue Line
let busRoutes = [
false,
[ // GTA 3 (1)
[ // PORTLAND ISLAND (0)
{ // RED ROUTE (0)
name: "Portland Red Line",
island: 0,
busColour: 3,
payout: 175,
positions: [
toVector3(1269, -1056.4, 14.75),
toVector3(1088.7, -968.8, 14.91),
toVector3(1059.1, -870.9, 14.91),
toVector3(917.6, -815.9, 14.91),
toVector3(851.1, -766.1, 14.91),
toVector3(838.8, -598.7, 14.91),
toVector3(959.3, -581.6, 14.91),
toVector3(853.1, -485.9, 14.91),
toVector3(838.8, -312.68, 6.8),
toVector3(913.9, -177.4, 4.91),
toVector3(1123.3, -67.74, 7.41),
toVector3(1043.6, -191.63, 4.91),
toVector3(1213.2, -281.3, 25.76),
toVector3(1193.3, -474.3, 24.98),
toVector3(1335.4, -499.7, 45.28),
toVector3(1220.3, -341.4, 26.38),
toVector3(1122.6, -475.6, 19.91),
toVector3(1309.2, -642.4, 12.3),
toVector3(1350.5, -845, 14.91),
toVector3(1322.2, -1025.3, 14.76),
toVector3(1307.5, -995.54, 14.88),
],
},
],
[ // STAUNTON ISLAND (1)
{ // RED ROUTE (0)
name: "Staunton Red Line",
island: 1,
busColour: 3,
payout: 175,
positions: [
toVector3(-1.11, -388.4, 16.11),
toVector3(-15.75, -735.3, 26.15),
toVector3(33.63, -1029.4, 26.11),
toVector3(-53.92, -1233.4, 26.11),
toVector3(126.58, -1323.7, 26.11),
toVector3(189.39, -1285.6, 26.11),
toVector3(266.9, -1179.1, 26.11),
toVector3(283.93, -1370.2, 26.11),
toVector3(144.44, -1455.5, 26.11),
toVector3(34.5, -1511.7, 26.11),
toVector3(325.31, -1579, 26.03),
toVector3(302.33, -1417.7, 26.11),
toVector3(309.76, -1290, 26.11),
toVector3(378.5, -1235.1, 26.11),
toVector3(404, -1376.3, 26.11),
toVector3(189.07, -1159.3, 26.11),
toVector3(189.44, -956.9, 26.11),
toVector3(254.18, -722.3, 26.11),
toVector3(383.4, -704.2, 26.11),
toVector3(429.3, -420.6, 22.04),
toVector3(570.9, -336.4, 19.71),
toVector3(267.46, 91.12, 15.96),
toVector3(99.13, -31.96, 16.11),
toVector3(243.94, -187.01, 21.31),
toVector3(99.17, -263.44, 16.11),
toVector3(-26.92, -283.73, 16.11),
],
},
],
],
[ // GTA VC
[ // WESTERN ISLAND (0)
{ // RED ROUTE (0)
name: "Vice City Red Line",
island: 0,
busColour: 3,
payout: 100,
positions: [
toVector3(-997.698, 175.8, 10.704),
toVector3(-607.007, 659.024, 10.9994),
toVector3(-665.23, 843.213, 11.3572),
toVector3(-669.703, 1174.17, 10.9954),
toVector3(19.0071, 967.446, 10.8685),
toVector3(-441.901, 1099.23, 10.9998),
toVector3(-1048.15, 1341.77, 8.76068),
toVector3(-870.697, 1049.45, 11.0081),
toVector3(-683.681, 610.935, 11.0217),
toVector3(-1011.02, 291.984, 11.3042),
toVector3(-1185.89, -264.69, 11.5162),
],
},
{ // GREEN ROUTE (1)
name: "Vice City Green Line",
island: 0,
busColour: 46,
payout: 250,
positions: [
toVector3(-1106.57, -300.12, 11.189),
toVector3(-1012.97, -372.445, 10.8688),
toVector3(-1018.07, -573.031, 11.0513),
toVector3(-1184.86, -647.271, 11.565),
toVector3(-1034.59, -908.376, 14.0954),
toVector3(-990.653, -1074.29, 14.7919),
toVector3(-1199.02, -946.758, 14.7914),
toVector3(-1431.57, -780.312, 14.7926),
toVector3(-1282.71, -785.966, 14.7917),
toVector3(-1204.48, -939.911, 14.7917),
toVector3(-1006.98, -1079.19, 14.7916),
toVector3(-928.565, -1257.33, 11.9578),
toVector3(-912.603, -1442.4, 11.8644),
toVector3(-683.223, -1389.97, 11.0019),
toVector3(-799.104, -1062.2, 11.0011),
toVector3(-812.002, -672.31, 11.0046),
toVector3(-834.03, -477.273, 11.0118),
toVector3(-840.406, -307.896, 11.0001),
toVector3(-829.729, -119.308, 11.0004),
toVector3(-903.957, 33.4505, 10.6344),
toVector3(-1002.04, -37.9656, 10.9094),
toVector3(-1066.83, -13.3146, 11.3389),
toVector3(-1067.5, 109.544, 11.3122),
toVector3(-1003.59, 171.078, 10.8953),
toVector3(-748.054, 198.243, 11.2455),
toVector3(-850, -110.625, 11.0203),
toVector3(-898.862, -280.373, 10.6645),
toVector3(-1082.1, -294.416, 11.2065),
],
},
],
],
[ // GTA SA
[ // LOS SANTOS ISLAND (0)
{ // RED ROUTE (0)
/*
Serves:
* Southeastern Los Santos (Ganton, East Beach, Airport, Docks, Willowfield)
Crossovers:
* Unity Station (Yellow, Blue, Green)
* Ganton (Green)
* Airport Gate (Yellow)
Notable Stops:
* Docks
* Airport Gate
*/
name: "Los Santos Yellow Line",
island: 0,
busColour: 6,
payout: 200,
positions: [
toVector3(1823.79, -1852.66, 13.5144),
toVector3(1804.12, -1609.59, 13.4419),
toVector3(1660.32, -1510.09, 13.4877),
toVector3(1612.54, -1322.23, 17.4085),
toVector3(1778.93, -1286.59, 13.5744),
toVector3(1854.72, -1208.16, 20.9552),
toVector3(1659.95, -1158.07, 23.8315),
toVector3(1461.6, -1031.05, 23.7518),
toVector3(1277.71, -1036.63, 31.6085),
toVector3(1322.74, -1151.38, 23.7558),
toVector3(1194.26, -1334.15, 13.4953),
toVector3(1081.29, -1392.64, 13.7023),
toVector3(1034.65, -1555.27, 13.4591),
toVector3(1033.26, -1782.3, 13.6323),
toVector3(1262.27, -1855, 13.4887),
toVector3(1445.39, -1875.5, 13.4944),
toVector3(1742.23, -2168.78, 13.557),
toVector3(1943.35, -2169.25, 13.4741),
toVector3(1963.51, -1969.6, 13.5867),
toVector3(1824.2, -1886.48, 13.4287),
]
},
{ // BLUE ROUTE (1)
/*
Serves:
* Northwestern Los Santos (Vinewood, Temple, Market, Rodeo)
Crossovers:
* Unity Station (Red, Yellow, Green)
* Skate Park (Yellow, Green)
* Glen Park (Yellow, Green)
* Alhambra Club (Yellow, Green)
* All Saints General Hospital (Yellow)
Notable Stops:
* Madd Doggs Mansion
* All Saints General Hospital
* Market Ammunation
* Vinewood Blvd
* Vinewood Hills
* Santa Maria Beach/Pier
*/
name: "Los Santos Blue Line",
island: 0,
busColour: 2,
payout: 250,
positions: [
toVector3(1824.17, -1851.5, 13.5134),
toVector3(1853.95, -1395.48, 13.4882),
toVector3(1659.33, -1158.59, 23.8368),
toVector3(1375.08, -1139.12, 23.7585),
toVector3(1186.53, -1139.9, 23.8007),
toVector3(1021.63, -1139.48, 23.7568),
toVector3(965.119, -1100.04, 23.7962),
toVector3(1058.53, -1042.64, 32.03),
toVector3(1238.74, -1041.7, 31.8307),
toVector3(1377.08, -977.352, 32.2744),
toVector3(1461.71, -731.011, 93.5068),
toVector3(1248.83, -729.438, 94.7962),
toVector3(932.221, -828.904, 94.6709),
toVector3(717.372, -982.938, 52.8477),
toVector3(452.042, -1182.3, 66.3269),
toVector3(287.664, -1221.08, 75.3682),
toVector3(225.497, -1346.85, 51.5658),
toVector3(438.728, -1720.92, 9.92785),
toVector3(894.789, -1788.3, 13.5674),
toVector3(919.419, -1592.92, 13.4843),
toVector3(939.902, -1408.49, 13.3463),
toVector3(1207.53, -1329.3, 13.5012),
toVector3(1324.24, -1282.88, 13.4815),
toVector3(1296.85, -1551.41, 13.4839),
toVector3(1294.85, -1811.15, 13.4816),
toVector3(1649.38, -1875.42, 13.4858),
toVector3(1819.59, -1870.9, 13.4987),
]
},
{ // GREEN ROUTE (2)
/*
Serves:
* Northeastern Los Santos (Idlewood, Ganton, Jefferson, East Los Santos, East Beach)
Crossovers:
* Unity Station (Red, Blue, Yellow)
* Skate Park (Blue, Yellow)
* Glen Park (Blue, Yellow)
* Ganton (Red)
* Alhambra Club (Yellow, Blue)
Notable Stops:
* County General Hospital
* Glen Park
* Skate Park
* Stadium
*/
name: "Los Santos Green Line",
island: 0,
busColour: 86,
payout: 175,
positions: [
toVector3(1823.94, -1853.88, 13.5103),
toVector3(1823.97, -1655.31, 13.4738),
toVector3(1854.81, -1409.54, 13.4829),
toVector3(1869.02, -1152.77, 23.8096),
toVector3(1975.68, -1104.29, 25.5835),
toVector3(2077.6, -985.15, 50.0375),
toVector3(2161.61, -1022.78, 62.5533),
toVector3(2173.38, -1148.91, 24.9203),
toVector3(2166.28, -1267.17, 23.9138),
toVector3(2087.27, -1298.99, 23.9193),
toVector3(2008.67, -1338.34, 23.9207),
toVector3(2026.04, -1468.12, 14.867),
toVector3(2108.83, -1684.64, 13.4771),
toVector3(2185.67, -1745.22, 13.4681),
toVector3(2287.18, -1734.76, 13.4821),
toVector3(2411.06, -1793.34, 13.4746),
toVector3(2451.02, -1934.86, 13.4209),
toVector3(2529.97, -1750.13, 13.479),
toVector3(2685.6, -1659.48, 11.4476),
toVector3(2739.7, -1524.93, 29.6406),
toVector3(2739.95, -1278.48, 57.8435),
toVector3(2683.93, -1068.66, 69.2199),
toVector3(2578.78, -1045.36, 69.5098),
toVector3(2326.9, -1128.69, 27.8126),
toVector3(2367.83, -1270.92, 23.941),
toVector3(2324.15, -1382.25, 23.9621),
toVector3(2137.14, -1382.12, 23.9376),
toVector3(2010.74, -1459.87, 13.4914),
toVector3(1824.35, -1562.74, 13.4622),
toVector3(1818.98, -1872.52, 13.5075),
]
},
{ // YELLOW ROUTE (3)
/*
Serves:
* Central Los Santos (Downtown, Commerce, Market)
Crossovers:
* Unity Station (Red, Blue, Green)
* Skate Park (Blue, Green)
* Glen Park (Blue, Green)
* All Saints General Hospital (Blue)
* Alhambra Club (Yellow, Blue)
* Airport Gate (Red)
Notable Stops:
* All Saints General Hospital
* Bank
* Star Tower
* Airport Gate
*/
name: "Los Santos Red Line",
island: 0,
busColour: 3,
payout: 150,
positions: [
toVector3(1823.79, -1852.66, 13.5144),
toVector3(1804.12, -1609.59, 13.4419),
toVector3(1660.32, -1510.09, 13.4877),
toVector3(1612.54, -1322.23, 17.4085),
toVector3(1778.93, -1286.59, 13.5744),
toVector3(1854.72, -1208.16, 20.9552),
toVector3(1659.95, -1158.07, 23.8315),
toVector3(1461.6, -1031.05, 23.7518),
toVector3(1277.71, -1036.63, 31.6085),
toVector3(1322.74, -1151.38, 23.7558),
toVector3(1194.26, -1334.15, 13.4953),
toVector3(1081.29, -1392.64, 13.7023),
toVector3(1034.65, -1555.27, 13.4591),
toVector3(1033.26, -1782.3, 13.6323),
toVector3(1262.27, -1855, 13.4887),
toVector3(1445.39, -1875.5, 13.4944),
toVector3(1742.23, -2168.78, 13.557),
toVector3(1943.35, -2169.25, 13.4741),
toVector3(1963.51, -1969.6, 13.5867),
toVector3(1824.2, -1886.48, 13.4287),
]
}
],
],
// GTA UG
[
],
// GTA IV
[
],
];
// ===========================================================================
function getRandomBusRoute(island) {
if(busRoutes[getServerGame()][island].length == 1) {
return 0;
}
return getRandom(0, busRoutes[getServerGame()][island].length-1);
}
// ===========================================================================
function getNextStopOnBusRoute(island, busRoute, busRouteStop) {
if(!isLastStopOnBusRoute(island, busRoute, busRouteStop)) {
return busRouteStop+1;
} else {
return busRoutes[getServerGame()][island][busRoute].positions.length-1;
}
}
// ===========================================================================
function isLastStopOnBusRoute(island, busRoute, busRouteStop) {
if(busRouteStop == busRoutes[getServerGame()][island][busRoute].positions.length-1) {
return true;
}
return false;
}
// ===========================================================================
function showNextBusStop(client) {
getPlayerData(client).jobRouteStop = getNextStopOnBusRoute(getPlayerData(client).jobRouteStop, getPlayerData(client).jobRoute, getPlayerData(client).jobRouteStop);
showCurrentBusStop(client);
}
// ===========================================================================
function showCurrentBusStop(client) {
sendJobRouteStopToPlayer(client, getBusRouteStopPosition(getPlayerIsland(client), getPlayerData(client).jobRoute, getPlayerData(client).jobRouteStop), getColourByName("busDriverGreen"))
}
// ===========================================================================
function playerArrivedAtBusStop(client) {
if(isLastStopOnBusRoute(getPlayerData(client).jobRouteIsland, getPlayerData(client).jobRoute, getPlayerData(client).jobRouteStop)) {
finishSuccessfulBusRoute(client);
return false;
}
showGameMessage(client, "⌛ Please wait a moment for passengers to get on and off the bus.", getColourByName("busDriverGreen"), 3500);
freezeJobVehicleForRouteStop(client);
getPlayerData(client).jobRouteStop = getNextStopOnBusRoute(getPlayerData(client).jobRouteIsland, getPlayerData(client).jobRoute, getPlayerData(client).jobRouteStop);
setTimeout(function() {
unFreezeJobVehicleForRouteStop(client);
showCurrentBusStop(client);
showGameMessage(client, "Proceed to the next stop (green checkpoint)", getColourByName("busDriverGreen"), 3500);
}, 5000);
}
// ===========================================================================
function getBusRouteStopPosition(island, busRoute, busRouteStop) {
return busRoutes[getServerGame()][island][busRoute].positions[busRouteStop];
}
// ===========================================================================
function getBusRouteData(island, busRoute) {
return busRoutes[getServerGame()][island][busRoute];
}
// ===========================================================================
function finishSuccessfulBusRoute(client) {
respawnVehicle(getPlayerData(client).jobRouteVehicle);
let payout = toInteger(applyServerInflationMultiplier(getBusRouteData(getPlayerData(client).jobRouteIsland, getPlayerData(client).jobRoute).payout));
getPlayerData(client).payDayAmount = getPlayerData(client).payDayAmount + payout;
messagePlayerNormal(client, `You finished the ${getBusRouteData(getPlayerData(client).jobRouteIsland, getPlayerData(client).jobRoute).name} bus route!. Your bus has been returned to the bus depot.`, getColourByName("yellow"));
messagePlayerNormal(client, `You earned {ALTCOLOUR}$${payout}{MAINCOLOUR}. Your total paycheck of {ALTCOLOUR}${getPlayerData(client).payDayAmount} {MAINCOLOUR}will be received next payday.`);
getPlayerData(client).jobRouteVehicle = false;
getPlayerData(client).jobRoute = 0;
getPlayerData(client).jobRouteStop = 0;
getPlayerData(client).jobRouteIsland = 0;
}
// ===========================================================================

View File

@@ -6,153 +6,3 @@
// DESC: Provides garbage collector job functions and usage
// TYPE: Job (JavaScript)
// ===========================================================================
let garbageRoutes = [
false,
[ // GTA 3
[ // PORTLAND ISLAND (0)
{ // ROUTE 0
name: "Portland #1",
island: 0,
payout: 150,
positions: [
toVector3(1169.8, -45.54, 10.4),
toVector3(928, -59.1, 8.61),
toVector3(935.4, -262.45, 5.52),
toVector3(935.4, -262.45, 5.52),
toVector3(1042.5, -375.9, 15.4),
toVector3(987, -450.5, 15.39),
toVector3(871.3, -277.07, 5.4),
toVector3(1119.4, -766.7, 15.4),
toVector3(1082.3, -990.8, 15.4),
toVector3(1166.9, -1046.8, 15.41),
toVector3(1310.1, -980.4, 15.46),
toVector3(1129.5, -645.3, 15.4),
toVector3(1128.9, -446.1, 20.41),
toVector3(1226.5, -52.41, 10.42) ,
],
},
],
[ // STAUNTON ISLAND (1)
{ // ROUTE 0
name: "Staunton #1",
island: 1,
payout: 150,
positions: [
toVector3(49.85, -1539.9, 26.6),
toVector3(49.71, -1458.1, 26.6),
toVector3(170.78, -1403.8, 26.59),
toVector3(183.48, -1485.9, 26.6),
toVector3(320.43, -1452.4, 26.6),
toVector3(310.13, -1311.8, 26.6),
toVector3(134.76, -1097.7, 26.6),
toVector3(55.63, -1058.6, 26.6),
toVector3(-0.02, -790.9, 26.64),
],
},
]
],
// GTA VC
[
],
// GTA SA
[
],
false,
// GTA IV
[
],
];
// ===========================================================================
function getRandomGarbageRoute(island) {
if(garbageRoutes[getServerGame()][island].length == 1) {
return 0;
}
return getRandom(0, garbageRoutes[getServerGame()][island].length-1);
}
// ===========================================================================
function getNextStopOnGarbageRoute(island, garbageRoute, garbageRouteStop) {
if(!isLastStopOnGarbageRoute(island, garbageRoute, garbageRouteStop)) {
return garbageRouteStop+1;
} else {
return garbageRoutes[getServerGame()][island][garbageRoute].positions.length-1;
}
}
// ===========================================================================
function isLastStopOnGarbageRoute(island, garbageRoute, garbageRouteStop) {
if(garbageRouteStop == garbageRoutes[getServerGame()][island][garbageRoute].positions.length-1) {
return true;
}
return false;
}
// ===========================================================================
function showNextGarbageStop(client) {
getPlayerData(client).jobRouteStop = getNextStopOnGarbageRoute(getPlayerData(client).jobRouteStop, getPlayerData(client).jobRoute, getPlayerData(client).jobRouteStop);
showCurrentGarbageStop(client);
}
// ===========================================================================
function showCurrentGarbageStop(client) {
triggerNetworkEvent("vrr.showGarbageStop", client, getGarbageRouteStopPosition(getPlayerIsland(client), getPlayerData(client).jobRoute, getPlayerData(client).jobRouteStop), getColourByName("garbageDriverGreen"));
}
// ===========================================================================
function playerArrivedAtGarbageStop(client) {
if(isLastStopOnGarbageRoute(getPlayerData(client).jobRouteIsland, getPlayerData(client).jobRoute, getPlayerData(client).jobRouteStop)) {
finishSuccessfulGarbageRoute(client);
return false;
}
showGameMessage(client, "⌛ Please wait a moment while the garbage is loaded into your truck.", getColourByName("mediumGrey"), 3500);
freezeGarbageForStop(client);
getPlayerData(client).jobRouteStop = getNextStopOnGarbageRoute(getPlayerData(client).jobRouteIsland, getPlayerData(client).jobRoute, getPlayerData(client).jobRouteStop);
setTimeout(function() {
showCurrentGarbageStop(client);
showGameMessage(client, "Proceed to the next stop (grey checkpoint)", getColourByName("mediumGrey"), 3500);
}, 5000);
}
// ===========================================================================
function getGarbageRouteStopPosition(island, garbageRoute, garbageRouteStop) {
return garbageRoutes[getServerGame()][island][garbageRoute].positions[garbageRouteStop];
}
// ===========================================================================
function getGarbageRouteData(island, garbageRoute) {
return garbageRoutes[getServerGame()][island][garbageRoute];
}
// ===========================================================================
function finishSuccessfulGarbageRoute(client) {
respawnVehicle(getPlayerData(client).jobRouteVehicle);
let payout = toInteger(applyServerInflationMultiplier(getGarbageRouteData(getPlayerData(client).jobRouteIsland, getPlayerData(client).jobRoute).payout));
getPlayerData(client).payDayAmount = getPlayerData(client).payDayAmount + payout;
messagePlayerNormal(client, `You finished the ${getGarbageRouteData(getPlayerData(client).jobRouteIsland, getPlayerData(client).jobRoute).name} garbage route! Your trashmaster has been returned to the garbage depot.`, getColourByName("yellow"));
messagePlayerNormal(client, `You earned $${getGarbageRouteData(getPlayerData(client).jobRouteIsland, getPlayerData(client).jobRoute).payout*getServerData().inflationMultiplier}. Your total paycheck of {ALTCOLOUR}${getPlayerData(client).payDayAmount} will be received in {ALTCOLOUR}${getTimeDifferenceDisplay(sdl.ticks-getPlayerData(client).payDayTickStart)}: $${getPlayerData(client).payDayAmount}`);
getPlayerData(client).jobRouteVehicle = false;
getPlayerData(client).jobRoute = 0;
getPlayerData(client).jobRouteStop = 0;
getPlayerData(client).jobRouteIsland = 0;
}
// ===========================================================================

View File

@@ -6,255 +6,3 @@
// DESC: Provides pizza delivery driver job functions and usage
// TYPE: Job (JavaScript)
// ===========================================================================
let pizzaDeliveryStops = [
false,
[ // GTA 3 (1)
[ // PORTLAND ISLAND (0)
toVector3(1269, -1056.4, 14.75),
toVector3(1088.7, -968.8, 14.91),
toVector3(1059.1, -870.9, 14.91),
toVector3(917.6, -815.9, 14.91),
toVector3(851.1, -766.1, 14.91),
toVector3(838.8, -598.7, 14.91),
toVector3(959.3, -581.6, 14.91),
toVector3(853.1, -485.9, 14.91),
toVector3(838.8, -312.68, 6.8),
toVector3(913.9, -177.4, 4.91),
toVector3(1123.3, -67.74, 7.41),
toVector3(1043.6, -191.63, 4.91),
toVector3(1213.2, -281.3, 25.76),
toVector3(1193.3, -474.3, 24.98),
toVector3(1335.4, -499.7, 45.28),
toVector3(1220.3, -341.4, 26.38),
toVector3(1122.6, -475.6, 19.91),
toVector3(1309.2, -642.4, 12.3),
toVector3(1350.5, -845, 14.91),
toVector3(1322.2, -1025.3, 14.76),
toVector3(1307.5, -995.54, 14.88),
],
[ // STAUNTON ISLAND (1)
toVector3(-1.11, -388.4, 16.11),
toVector3(-15.75, -735.3, 26.15),
toVector3(33.63, -1029.4, 26.11),
toVector3(-53.92, -1233.4, 26.11),
toVector3(126.58, -1323.7, 26.11),
toVector3(189.39, -1285.6, 26.11),
toVector3(266.9, -1179.1, 26.11),
toVector3(283.93, -1370.2, 26.11),
toVector3(144.44, -1455.5, 26.11),
toVector3(34.5, -1511.7, 26.11),
toVector3(325.31, -1579, 26.03),
toVector3(302.33, -1417.7, 26.11),
toVector3(309.76, -1290, 26.11),
toVector3(378.5, -1235.1, 26.11),
toVector3(404, -1376.3, 26.11),
toVector3(189.07, -1159.3, 26.11),
toVector3(189.44, -956.9, 26.11),
toVector3(254.18, -722.3, 26.11),
toVector3(383.4, -704.2, 26.11),
toVector3(429.3, -420.6, 22.04),
toVector3(570.9, -336.4, 19.71),
toVector3(267.46, 91.12, 15.96),
toVector3(99.13, -31.96, 16.11),
toVector3(243.94, -187.01, 21.31),
toVector3(99.17, -263.44, 16.11),
toVector3(-26.92, -283.73, 16.11),
],
],
[ // GTA VC
[ // WESTERN ISLAND (0)
toVector3(-997.698, 175.8, 10.704),
toVector3(-607.007, 659.024, 10.9994),
toVector3(-665.23, 843.213, 11.3572),
toVector3(-669.703, 1174.17, 10.9954),
toVector3(19.0071, 967.446, 10.8685),
toVector3(-441.901, 1099.23, 10.9998),
toVector3(-1048.15, 1341.77, 8.76068),
toVector3(-870.697, 1049.45, 11.0081),
toVector3(-683.681, 610.935, 11.0217),
toVector3(-1011.02, 291.984, 11.3042),
toVector3(-1185.89, -264.69, 11.5162),
toVector3(-1106.57, -300.12, 11.189),
toVector3(-1012.97, -372.445, 10.8688),
toVector3(-1018.07, -573.031, 11.0513),
toVector3(-1184.86, -647.271, 11.565),
toVector3(-1034.59, -908.376, 14.0954),
toVector3(-990.653, -1074.29, 14.7919),
toVector3(-1199.02, -946.758, 14.7914),
toVector3(-1431.57, -780.312, 14.7926),
toVector3(-1282.71, -785.966, 14.7917),
toVector3(-1204.48, -939.911, 14.7917),
toVector3(-1006.98, -1079.19, 14.7916),
toVector3(-928.565, -1257.33, 11.9578),
toVector3(-912.603, -1442.4, 11.8644),
toVector3(-683.223, -1389.97, 11.0019),
toVector3(-799.104, -1062.2, 11.0011),
toVector3(-812.002, -672.31, 11.0046),
toVector3(-834.03, -477.273, 11.0118),
toVector3(-840.406, -307.896, 11.0001),
toVector3(-829.729, -119.308, 11.0004),
toVector3(-903.957, 33.4505, 10.6344),
toVector3(-1002.04, -37.9656, 10.9094),
toVector3(-1066.83, -13.3146, 11.3389),
toVector3(-1067.5, 109.544, 11.3122),
toVector3(-1003.59, 171.078, 10.8953),
toVector3(-748.054, 198.243, 11.2455),
toVector3(-850, -110.625, 11.0203),
toVector3(-898.862, -280.373, 10.6645),
toVector3(-1082.1, -294.416, 11.2065),
],
],
[ // GTA SA
[ // LOS SANTOS ISLAND (0)
toVector3(1823.79, -1852.66, 13.5144),
toVector3(1804.12, -1609.59, 13.4419),
toVector3(1660.32, -1510.09, 13.4877),
toVector3(1612.54, -1322.23, 17.4085),
toVector3(1778.93, -1286.59, 13.5744),
toVector3(1854.72, -1208.16, 20.9552),
toVector3(1659.95, -1158.07, 23.8315),
toVector3(1461.6, -1031.05, 23.7518),
toVector3(1277.71, -1036.63, 31.6085),
toVector3(1322.74, -1151.38, 23.7558),
toVector3(1194.26, -1334.15, 13.4953),
toVector3(1081.29, -1392.64, 13.7023),
toVector3(1034.65, -1555.27, 13.4591),
toVector3(1033.26, -1782.3, 13.6323),
toVector3(1262.27, -1855, 13.4887),
toVector3(1445.39, -1875.5, 13.4944),
toVector3(1742.23, -2168.78, 13.557),
toVector3(1943.35, -2169.25, 13.4741),
toVector3(1963.51, -1969.6, 13.5867),
toVector3(1824.2, -1886.48, 13.4287),
toVector3(1824.17, -1851.5, 13.5134),
toVector3(1853.95, -1395.48, 13.4882),
toVector3(1659.33, -1158.59, 23.8368),
toVector3(1375.08, -1139.12, 23.7585),
toVector3(1186.53, -1139.9, 23.8007),
toVector3(1021.63, -1139.48, 23.7568),
toVector3(965.119, -1100.04, 23.7962),
toVector3(1058.53, -1042.64, 32.03),
toVector3(1238.74, -1041.7, 31.8307),
toVector3(1377.08, -977.352, 32.2744),
toVector3(1461.71, -731.011, 93.5068),
toVector3(1248.83, -729.438, 94.7962),
toVector3(932.221, -828.904, 94.6709),
toVector3(717.372, -982.938, 52.8477),
toVector3(452.042, -1182.3, 66.3269),
toVector3(287.664, -1221.08, 75.3682),
toVector3(225.497, -1346.85, 51.5658),
toVector3(438.728, -1720.92, 9.92785),
toVector3(894.789, -1788.3, 13.5674),
toVector3(919.419, -1592.92, 13.4843),
toVector3(939.902, -1408.49, 13.3463),
toVector3(1207.53, -1329.3, 13.5012),
toVector3(1324.24, -1282.88, 13.4815),
toVector3(1296.85, -1551.41, 13.4839),
toVector3(1294.85, -1811.15, 13.4816),
toVector3(1649.38, -1875.42, 13.4858),
toVector3(1819.59, -1870.9, 13.4987),
toVector3(1823.94, -1853.88, 13.5103),
toVector3(1823.97, -1655.31, 13.4738),
toVector3(1854.81, -1409.54, 13.4829),
toVector3(1869.02, -1152.77, 23.8096),
toVector3(1975.68, -1104.29, 25.5835),
toVector3(2077.6, -985.15, 50.0375),
toVector3(2161.61, -1022.78, 62.5533),
toVector3(2173.38, -1148.91, 24.9203),
toVector3(2166.28, -1267.17, 23.9138),
toVector3(2087.27, -1298.99, 23.9193),
toVector3(2008.67, -1338.34, 23.9207),
toVector3(2026.04, -1468.12, 14.867),
toVector3(2108.83, -1684.64, 13.4771),
toVector3(2185.67, -1745.22, 13.4681),
toVector3(2287.18, -1734.76, 13.4821),
toVector3(2411.06, -1793.34, 13.4746),
toVector3(2451.02, -1934.86, 13.4209),
toVector3(2529.97, -1750.13, 13.479),
toVector3(2685.6, -1659.48, 11.4476),
toVector3(2739.7, -1524.93, 29.6406),
toVector3(2739.95, -1278.48, 57.8435),
toVector3(2683.93, -1068.66, 69.2199),
toVector3(2578.78, -1045.36, 69.5098),
toVector3(2326.9, -1128.69, 27.8126),
toVector3(2367.83, -1270.92, 23.941),
toVector3(2324.15, -1382.25, 23.9621),
toVector3(2137.14, -1382.12, 23.9376),
toVector3(2010.74, -1459.87, 13.4914),
toVector3(1824.35, -1562.74, 13.4622),
toVector3(1818.98, -1872.52, 13.5075),
toVector3(1823.79, -1852.66, 13.5144),
toVector3(1804.12, -1609.59, 13.4419),
toVector3(1660.32, -1510.09, 13.4877),
toVector3(1612.54, -1322.23, 17.4085),
toVector3(1778.93, -1286.59, 13.5744),
toVector3(1854.72, -1208.16, 20.9552),
toVector3(1659.95, -1158.07, 23.8315),
toVector3(1461.6, -1031.05, 23.7518),
toVector3(1277.71, -1036.63, 31.6085),
toVector3(1322.74, -1151.38, 23.7558),
toVector3(1194.26, -1334.15, 13.4953),
toVector3(1081.29, -1392.64, 13.7023),
toVector3(1034.65, -1555.27, 13.4591),
toVector3(1033.26, -1782.3, 13.6323),
toVector3(1262.27, -1855, 13.4887),
toVector3(1445.39, -1875.5, 13.4944),
toVector3(1742.23, -2168.78, 13.557),
toVector3(1943.35, -2169.25, 13.4741),
toVector3(1963.51, -1969.6, 13.5867),
toVector3(1824.2, -1886.48, 13.4287),
],
],
// GTA UG
[
],
// GTA IV
[
],
];
// ===========================================================================
function getRandomPizzaDeliveryStop(island) {
if(pizzaDeliveryStops[getServerGame()][island].length == 1) {
return 0;
}
return getRandom(0, pizzaDeliveryStops[getServerGame()][island].length-1);
}
// ===========================================================================
function showCurrentPizzaDeliveryStop(client) {
sendJobDeliveryPointToPlayer(client, getPizzaDeliveryStopPosition(getPlayerIsland(client), getPlayerData(client).jobRoute), getColourByName("deliveryPurple"))
}
// ===========================================================================
function playerArrivedAtPizzaDeliveryDestination(client) {
respawnVehicle(getPlayerData(client).jobDeliveryVehicle);
let payout = applyServerInflationMultiplier(getPizzaDeliveryPay(getPlayerData(client).jobDeliveryStart, getPlayerData(client).jobDeliveryStop));
getPlayerData(client).payDayAmount += payout;
messagePlayerNormal(client, `You delivered the pizza! Return to the pizza restaurant if you want to deliver another pizza.`, getColourByName("yellow"));
messagePlayerNormal(client, `You earned $${payout}. Your total paycheck of {ALTCOLOUR}${getPlayerData(client).payDayAmount} will be received in {ALTCOLOUR}${getTimeDisplayUntilPlayerPayDay(client)}`);
getPlayerData(client).jobDeliveryVehicle = false;
getPlayerData(client).jobDeliveryStart = 0;
getPlayerData(client).jobDeliveryStop = 0;
}
// ===========================================================================
function getPizzaDeliveryPay(startPoint, stopPoint) {
return Math.floor(getDistance(startPoint, stopPoint));
}
// ===========================================================================

View File

@@ -7,73 +7,6 @@
// TYPE: Job (JavaScript)
// ===========================================================================
let patrolRoutes = [
false,
[ // GTA 3 (1)
[ // PORTLAND (0)
],
[ // STAUNTON ISLAND (1)
{ // SECTOR 1 (0)
name: "Staunton Island Sector 1",
island: 0,
payout: 175,
type: VRR_PATROLTYPE_VEHICLE,
positions: [
toVector3(404.5, -1209.73, 25.8024),
toVector3(334.831, -1388.93, 25.8005),
toVector3(143.949, -1433.8, 25.802),
toVector3(144.79, -1592.07, 25.8019),
toVector3(49.9422, -1566.3, 25.8021),
toVector3(48.9107, -1324.22, 25.8026),
toVector3(50.0236, -1101.78, 25.8023),
toVector3(131.694, -1111.31, 25.7952),
toVector3(189.424, -1063.86, 25.7998),
toVector3(272.875, -1044.04, 25.8019),
toVector3(355.409, -847.512, 25.1725),
toVector3(521.08, -399.068, 20.9302),
toVector3(403.586, -471.898, 25.8008),
toVector3(403.915, -608.12, 25.7963),
toVector3(324.298, -687.727, 25.7945),
toVector3(230.278, -738.004, 25.8017),
toVector3(145.977, -907.481, 25.8045),
toVector3(81.1892, -924.272, 25.8088),
toVector3(35.0571, -1023.52, 25.7989),
toVector3(40.047, -1224.51, 25.801),
toVector3(105.924, -1313.85, 25.7972),
toVector3(149.367, -1377.78, 25.8016),
toVector3(271.09, -1399.14, 25.8019),
toVector3(303.644, -1079.71, 25.8029),
toVector3(342.905, -873.693, 22.5513),
toVector3(542.573, -466.857, 23.3019),
toVector3(516.223, -398.79, 20.9548),
toVector3(404.847, -480.079, 25.7463),
toVector3(404.132, -908.893, 25.7912),
toVector3(403.389, -1098.75, 25.8034),
],
}
],
[ // SHORESIDE VALE (2)
]
],
[ // GTA VC (2)
[ // EAST (1)
],
[ // WEST (2)
]
],
];
// ===========================================================================
function policeTazerCommand(command, params, client) {
if(!canPlayerUseJobs(client)) {
messagePlayerError(client, "You are not allowed to use jobs.");
@@ -228,25 +161,4 @@ function policeDetainCommand(command, params, client) {
return true;
}
// ===========================================================================
function playerArivedAtPolicePatrolPoint(client) {
if(isLastStopOnPolicePatrolRoute(getPlayerData(client).jobRouteIsland, getPlayerData(client).jobRoute, getPlayerData(client).jobRouteStop)) {
messagePlayerNormal(client, `You finished the ${getPatrolRouteData(getPlayerData(client).jobRouteIsland, getPlayerData(client).jobRoute).name} patrol route! You earned $${getBusRouteData(getPlayerData(client).jobRouteIsland, getPlayerData(client).jobRoute).payout*getServerData().inflationMultiplier}`, getColourByName("yellow"));
messagePlayerNormal(client, `You can either continue driving the patrol route again, or use /stoproute to end your patrol.`, getColourByName("yellow"));
givePlayerCash(client, getPolicePatrolRouteData(getPlayerData(client).jobRouteIsland, getPlayerData(client).jobRoute).payout*getServerData().inflationMultiplier);
updatePlayerCash(client);
getPlayerData(client).jobRouteVehicle = false;
getPlayerData(client).jobRoute = 0;
getPlayerData(client).jobRouteStop = 0;
getPlayerData(client).jobRouteIsland = 0;
getPlayerData(client).jobRouteState = VRR_JOBROUTE_INPROGRESS;
return false;
}
showGameMessage(client, "Proceed to the next point on your patrol route", getColourByName("policeBlue"), 2000);
getPlayerData(client).jobRouteStop = getNextStopOnPolicePatrolRoute(getPlayerData(client).jobRouteIsland, getPlayerData(client).jobRoute, getPlayerData(client).jobRouteStop);
showCurrentPolicePatrolPoint(client);
}
// ===========================================================================

View File

@@ -1,15 +1,16 @@
{
"compilerOptions": {
"module": "commonjs",
"target": "ES6",
"target": "es6",
"moduleResolution": "classic"
},
"include": [
"./*.js",
"*.js",
"job/*.js",
"business/*.js",
"item/*.js",
"npc/*.js",
"native/*.js",
"../shared/*.js"
]
}

View File

@@ -19,8 +19,8 @@ function initKeyBindScript() {
function addKeyBindCommand(command, params, client) {
let splitParams = params.split(" ");
let keyId = getKeyIdFromParams(splitParams[0]);
let tempCommand = splitParams[1];
let keyId = getKeyIdFromParams(getParam(params, " ", 1));
let tempCommand = getParam(params, " ", 2);
let tempParams = (splitParams.length > 2) ? splitParams.slice(2).join(" ") : "";
if(!keyId) {
@@ -49,7 +49,7 @@ function addKeyBindCommand(command, params, client) {
function removeKeyBindCommand(command, params, client) {
let splitParams = params.split(" ");
let keyId = getKeyIdFromParams(splitParams[0]);
let keyId = getKeyIdFromParams(getParam(params, " ", 1));
if(!keyId) {
messagePlayerError(client, "The key ID or name you input is invalid!");
@@ -75,7 +75,7 @@ function addPlayerKeyBind(client, keys, command, params, tempKey = false) {
keyBindData.databaseId = -1;
}
getPlayerData(client).accountData.keyBinds.push(keyBindData);
getPlayerData(client).keyBinds.push(keyBindData);
sendAddAccountKeyBindToClient(client, keys, (keys.length > 1) ? VRR_KEYSTATE_COMBO : VRR_KEYSTATE_UP);
if(!doesPlayerHaveKeyBindsDisabled(client) && doesPlayerHaveKeyBindForCommand(client, "enter")) {
@@ -90,10 +90,13 @@ function addPlayerKeyBind(client, keys, command, params, tempKey = false) {
// ===========================================================================
function removePlayerKeyBind(client, keyId) {
quickDatabaseQuery(`DELETE FROM acct_hotkey WHERE acct_hotkey_acct = ${getPlayerData(client).accountData.databaseId} AND acct_hotkey_key = ${keyId}`);
for(let i in getPlayerData(client).accountData.keyBinds) {
if(getPlayerData(client).accountData.keyBinds[i].key == keyId) {
getPlayerData(client).accountData.keyBinds.splice(i, 1);
if(isPlayerLoggedIn(client)) {
quickDatabaseQuery(`DELETE FROM acct_hotkey WHERE acct_hotkey_acct = ${getPlayerData(client).accountData.databaseId} AND acct_hotkey_key = ${keyId}`);
}
for(let i in getPlayerData(client).keyBinds) {
if(getPlayerData(client).keyBinds[i].key == keyId) {
getPlayerData(client).keyBinds.splice(i, 1);
}
}
sendRemoveAccountKeyBindToClient(client, keyId);
@@ -110,8 +113,8 @@ function removePlayerKeyBind(client, keyId) {
// ===========================================================================
function doesPlayerHaveKeyBindForCommand(client, command) {
for(let i in getPlayerData(client).accountData.keyBinds) {
if(toLowerCase(getPlayerData(client).accountData.keyBinds[i].commandString.split(" ")[0]) == toLowerCase(command)) {
for(let i in getPlayerData(client).keyBinds) {
if(toLowerCase(getPlayerData(client).keyBinds[i].commandString.split(" ")[0]) == toLowerCase(command)) {
return true;
}
}
@@ -121,9 +124,9 @@ function doesPlayerHaveKeyBindForCommand(client, command) {
// ===========================================================================
function getPlayerKeyBindForCommand(client, command) {
for(let i in getPlayerData(client).accountData.keyBinds) {
if(toLowerCase(getPlayerData(client).accountData.keyBinds[i].commandString.split(" ")[0]) == toLowerCase(command)) {
return getPlayerData(client).accountData.keyBinds[i];
for(let i in getPlayerData(client).keyBinds) {
if(toLowerCase(getPlayerData(client).keyBinds[i].commandString.split(" ")[0]) == toLowerCase(command)) {
return getPlayerData(client).keyBinds[i];
}
}
return false;
@@ -132,8 +135,8 @@ function getPlayerKeyBindForCommand(client, command) {
// ===========================================================================
function doesPlayerHaveKeyBindForKey(client, key) {
for(let i in getPlayerData(client).accountData.keyBinds) {
if(getPlayerData(client).accountData.keyBinds[i].key == key) {
for(let i in getPlayerData(client).keyBinds) {
if(getPlayerData(client).keyBinds[i].key == key) {
return true;
}
}
@@ -149,9 +152,9 @@ function doesPlayerHaveKeyBindsDisabled(client) {
// ===========================================================================
function getPlayerKeyBindForKey(client, key) {
for(let i in getPlayerData(client).accountData.keyBinds) {
if(getPlayerData(client).accountData.keyBinds[i].key == key) {
return getPlayerData(client).accountData.keyBinds[i];
for(let i in getPlayerData(client).keyBinds) {
if(getPlayerData(client).keyBinds[i].key == key) {
return getPlayerData(client).keyBinds[i];
}
}
return false;
@@ -188,8 +191,8 @@ function playerUsedKeyBind(client, key) {
function sendAccountKeyBindsToClient(client) {
sendClearKeyBindsToClient(client);
for(let i in getPlayerData(client).accountData.keyBinds) {
sendAddAccountKeyBindToClient(client, getPlayerData(client).accountData.keyBinds[i].key, getPlayerData(client).accountData.keyBinds[i].keyState);
for(let i in getPlayerData(client).keyBinds) {
sendAddAccountKeyBindToClient(client, getPlayerData(client).keyBinds[i].key, getPlayerData(client).keyBinds[i].keyState);
}
}
@@ -203,11 +206,11 @@ function loadKeyBindConfiguration() {
// ===========================================================================
function showKeyBindListCommand(command, params, client) {
let keybindList = getPlayerData(client).accountData.keyBinds.map(function(x) { return `{ALTCOLOUR}${toUpperCase(getKeyNameFromId(x.key))}: {MAINCOLOUR}${x.commandString}`; });
let keybindList = getPlayerData(client).keyBinds.map(function(x) { return `{ALTCOLOUR}${toUpperCase(getKeyNameFromId(x.key))}: {MAINCOLOUR}${x.commandString}`; });
let chunkedList = splitArrayIntoChunks(keybindList, 6);
messagePlayerInfo(client, `{clanOrange}== {jobYellow}Your Key Binds {clanOrange}===========================`);
messagePlayerInfo(client, makeChatBoxSectionHeader(getLocaleString(client, "HeaderKeyBindsList")));
for(let i in chunkedList) {
messagePlayerInfo(client, chunkedList[i].join(", "));

View File

@@ -7,16 +7,32 @@
// TYPE: Server (JavaScript)
// ===========================================================================
let translateURL = "http://api.mymemory.translated.net/get?de={3}&q={0}&langpair={1}|{2}";
// ===========================================================================
function initLocaleScript() {
logToConsole(LOG_INFO, "[VRR.Locale]: Initializing locale script ...");
getServerData().localeStrings = loadAllLocaleStrings();
// Translation Cache
getServerData().cachedTranslations = new Array(getGlobalConfig().locale.locales.length);
getServerData().cachedTranslationFrom = new Array(getGlobalConfig().locale.locales.length);
getServerData().cachedTranslationFrom.fill([]);
getServerData().cachedTranslations.fill(getServerData().cachedTranslationFrom);
getGlobalConfig().locale.defaultLanguageId = getLocaleFromParams(getGlobalConfig().locale.defaultLanguageId);
logToConsole(LOG_INFO, "[VRR.Locale]: Locale script initialized!");
}
// ===========================================================================
function getLocaleString(client, stringName, ...args) {
let tempString = getRawLocaleString(stringName, getPlayerLocaleName(client));
let tempString = getRawLocaleString(stringName, getPlayerData(client).locale);
if(tempString == "") {
submitBugReport(client, `(AUTOMATED REPORT) Locale string "${stringName}" is missing for "${getPlayerLocaleName(client)}"`);
}
tempString = replaceColoursInMessage(tempString);
@@ -29,19 +45,34 @@ 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]);
}
return tempString;
}
// ===========================================================================
function getRawLocaleString(stringName, localeName) {
return getLocaleStrings()[localeName][stringName];
}
// ===========================================================================
function getPlayerLocaleName(client) {
if(client == null) {
return getLocaleNameFromParams(`English`);
}
function getRawGroupedLocaleString(stringName, localeName, index) {
return getLocaleStrings()[localeName][stringName][index];
}
return "english";
//return getPlayerData(client).accountData.locale;
// ===========================================================================
function getPlayerLocaleName(client) {
let localeId = getPlayerData(client).locale;
return getLocales()[localeId][0];
}
// ===========================================================================
@@ -49,11 +80,11 @@ function getPlayerLocaleName(client) {
function loadAllLocaleStrings() {
let tempLocaleStrings = {};
let locales = getGlobalConfig().locales;
let locales = getGlobalConfig().locale.locales;
for(let i in locales) {
let localeData = locales[i];
let localeFile = JSON.parse(loadTextFile(`locale/${localeData[1]}.json`));
tempLocaleStrings[localeData[1]] = localeFile;
tempLocaleStrings[i] = localeFile;
}
return tempLocaleStrings;
@@ -65,4 +96,119 @@ function getLocaleStrings() {
return getServerData().localeStrings;
}
// ===========================================================================
function getLocaleFromParams(params) {
let locales = getLocales();
if(isNaN(params)) {
for(let i in locales) {
if(toLowerCase(locales[i][2]).indexOf(toLowerCase(params)) != -1) {
return i;
}
if(toLowerCase(locales[i][0]).indexOf(toLowerCase(params)) != -1) {
return i;
}
}
}
return -1;
}
// ===========================================================================
function getLocales() {
return getGlobalConfig().locale.locales;
}
// ===========================================================================
function showLocaleListCommand(command, params, client) {
let localeList = getLocales().map(function(x) { return x[0]; });
let chunkedList = splitArrayIntoChunks(localeList, 10);
messagePlayerInfo(client, getLocaleString(client, "HeaderLocaleList"));
for(let i in chunkedList) {
messagePlayerInfo(client, chunkedList[i].join(", "));
}
}
// ===========================================================================
function setLocaleCommand(command, params, client) {
if(areParamsEmpty(params)) {
messagePlayerSyntax(client, getCommandSyntaxText(command));
return false;
}
let localeId = getLocaleFromParams(params);
if(!getLocaleData(localeId)) {
messagePlayerInfo(client, getLocaleString(client, "InvalidLocale"));
return false;
}
getPlayerData(client).accountData.locale = localeId;
getPlayerData(client).locale = localeId;
messagePlayerSuccess(client, getLocaleString(client, "LocaleChanged1"), getLocaleString(client, "LocaleNativeName"));
}
// ===========================================================================
function getLocaleData(localeId) {
if(typeof getLocales()[localeId] != "undefined") {
return getLocales()[localeId];
}
return false;
}
// ===========================================================================
function reloadLocaleConfigurationCommand(command, params, client) {
getGlobalConfig().locale = loadLocaleConfig();
getServerData().localeStrings = loadAllLocaleStrings();
// Translation Cache
getServerData().cachedTranslations = new Array(getGlobalConfig().locale.locales.length);
getServerData().cachedTranslationFrom = new Array(getGlobalConfig().locale.locales.length);
getServerData().cachedTranslationFrom.fill([]);
getServerData().cachedTranslations.fill(getServerData().cachedTranslationFrom);
getGlobalConfig().locale.defaultLanguageId = getLocaleFromParams(getGlobalConfig().locale.defaultLanguage);
messageAdmins(`${client.name}{MAINCOLOUR} has reloaded the locale settings and texts`);
}
// ===========================================================================
async function translateMessage(messageText, translateFrom = getGlobalConfig().locale.defaultLanguageId, translateTo = getGlobalConfig().locale.defaultLanguageId) {
return new Promise(resolve => {
if(translateFrom == translateTo) {
resolve(messageText);
}
for(let i in cachedTranslations[translateFrom][translateTo]) {
if(cachedTranslations[translateFrom][translateTo][i][0] == messageText) {
logToConsole(LOG_DEBUG, `[Translate]: Using existing translation for ${getGlobalConfig().locale.locales[translateFrom][0]} to ${getGlobalConfig().locale.locales[translateTo][0]} - (${messageText}), (${cachedTranslations[translateFrom][translateTo][i][1]})`);
resolve(cachedTranslations[translateFrom][translateTo][i][1]);
}
}
let thisTranslationURL = translateURL.format(encodeURI(messageText), toUpperCase(getGlobalConfig().locale.locales[translateFrom][2]), toUpperCase(getGlobalConfig().locale.locales[translateTo][2]), getGlobalConfig().locale.apiEmail);
httpGet(
thisTranslationURL,
"",
function(data) {
data = ArrayBufferToString(data);
let translationData = JSON.parse(data);
cachedTranslations[translateFrom][translateTo].push([messageText, translationData.responseData.translatedText]);
resolve(translationData.responseData.translatedText);
},
function(data) {
}
);
});
}
// ===========================================================================

View File

@@ -163,6 +163,12 @@ function messagePlayerWhisper(client, whisperingClient, messageText) {
// ===========================================================================
function messagePlayerMegaPhone(client, shoutingClient, messageText) {
messagePlayerNormal(client, `📢 ${getPlayerAccentInlineOutput(shoutingClient)}${getClientSubAccountName(shoutingClient)} (megaphone): ${messageText}!`, getColourByType("yellow"));
}
// ===========================================================================
function messagePlayerShout(client, shoutingClient, messageText) {
messagePlayerNormal(client, `🗣️ ${getPlayerAccentInlineOutput(shoutingClient)}${getClientSubAccountName(shoutingClient)} shouts: ${messageText}!`, getColourByType("shoutMessage"));
}
@@ -197,7 +203,7 @@ function messagePlayerAdminChat(client, adminChattingClient, messageText) {
function messagePlayerNewbieTip(client, message) {
if(!hasBitFlag(getPlayerData(client).accountData.settings, getAccountSettingsFlagValue("NoActionTips"))) {
messagePlayerNormal(client, `💡 TIP: ${message}`);
messagePlayerNormal(client, `💡 ${message}`);
}
}
@@ -206,9 +212,43 @@ function messagePlayerNewbieTip(client, message) {
function messagePlayerTimedRandomTip(client, message) {
if(isPlayerLoggedIn(client) && isPlayerSpawned(client)) {
if(!hasBitFlag(getPlayerData(client).accountData.settings, getAccountSettingsFlagValue("NoRandomTips"))) {
messagePlayerNormal(client, `💡 TIP: ${message}`);
messagePlayerNormal(client, `💡 ${message}`);
}
}
}
// ===========================================================================
// ===========================================================================
function makeChatBoxSectionHeader(name) {
let resultString = `{clanOrange}== {jobYellow}${name} `;
let endFiller = fillStringWithCharacter("=", getGlobalConfig().chatSectionHeaderLength-resultString.length);
return `${resultString} {clanOrange}${endFiller}`;
}
// ===========================================================================
function clearChatBox(client) {
//game.messages.clear();
for(let i = 0; i <= 20; i++) {
messageClient(" ", client, COLOUR_WHITE);
}
}
// ===========================================================================
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}`);
}
// ===========================================================================

View File

@@ -21,7 +21,7 @@ function getPositionCommand(command, params, client) {
let position = getPlayerPosition(client);
messagePlayerNormal(client, `Your position is: ${position.x.toFixed(2)}, ${position.y.toFixed(2)}, ${position.z.toFixed(2)}`);
logToConsole(LOG_DEBUG, `${getPlayerDisplayForConsole(client)}'s position is: ${position.x.toFixed(2)}, ${position.y.toFixed(2)}, ${position.z.toFixed(2)}`);
logToConsole(LOG_INFO, `${getPlayerDisplayForConsole(client)}'s position is: ${position.x.toFixed(2)}, ${position.y.toFixed(2)}, ${position.z.toFixed(2)}`);
return true;
}
@@ -59,8 +59,7 @@ function setNewCharacterMoneyCommand(command, params, client) {
return false;
}
let splitParams = params.split(" ");
let amount = toInteger(splitParams[0]) || 1000;
let amount = toInteger(getParam(params, " ", 1)) || 1000;
getServerConfig().newCharacter.cash = amount;
getServerConfig().needsSaved = true;
@@ -117,35 +116,10 @@ function submitBugReportCommand(command, params, client) {
// ===========================================================================
function enterExitPropertyCommand(command, params, client) {
//let closestBusinessEntrance = getClosestBusinessEntrance(getPlayerPosition(client), getPlayerDimension(client));
//let closestBusinessExit = getClosestBusinessExit(getPlayerPosition(client), getPlayerDimension(client));
//let closestHouseEntrance = getClosestHouseEntrance(getPlayerPosition(client), getPlayerDimension(client));
//let closestHouseExit = getClosestHouseExit(getPlayerPosition(client), getPlayerDimension(client));
let closestProperty = null;
let isEntrance = false;
let isBusiness = false;
//if(getDistance(getPlayerPosition(client), getBusinessData(closestBusinessEntrance).entrancePosition) <= getDistance(getPlayerPosition(client), getHouseData(closestHouseEntrance).entrancePosition)) {
// closestEntrance = getBusinessData(closestBusinessEntrance);
//} else {
// closestEntrance = getHouseData(closestHouseEntrance);
//}
//if(getDistance(getPlayerPosition(client), getBusinessData(closestBusinessExit).exitPosition) <= getDistance(getPlayerPosition(client), getHouseData(closestHouseExit).exitPosition)) {
// closestExit = getBusinessData(closestBusinessExit);
//} else {
// closestExit = getHouseData(closestHouseExit);
//}
//if(getDistance(getPlayerPosition(client), closestEntrance.entrancePosition) <= getDistance(getPlayerPosition(client), closestExit.exitPosition)) {
// closestProperty = closestEntrance;
// isEntrance = true;
//} else {
// closestProperty = closestExit;
// isEntrance = false;
//}
if(!getPlayerData(client).currentPickup) {
return false;
}
@@ -191,18 +165,18 @@ function enterExitPropertyCommand(command, params, client) {
if(isEntrance) {
if(getDistance(closestProperty.entrancePosition, getPlayerPosition(client)) <= getGlobalConfig().enterPropertyDistance) {
if(closestProperty.locked) {
meActionToNearbyPlayers(client, `tries to open the ${(isBusiness) ? "business" : "house"} door but fails because it's locked`);
meActionToNearbyPlayers(client, getLocaleString(client, "EnterExitPropertyDoorLocked", (isBusiness) ? getLocaleString(client, "Business") : getLocaleString(client, "House")));
return false;
}
if(!closestProperty.hasInterior) {
messagePlayerAlert(client, `This ${(isBusiness) ? "business" : "house"} does not have an interior, but you can still use commands at the door icon.`);
messagePlayerAlert(client, getLocaleString(client, "PropertyNoInterior", (isBusiness) ? getLocaleString(client, "Business") : getLocaleString(client, "House")));
return false;
}
clearPlayerStateToEnterExitProperty(client);
getPlayerData(client).pedState = VRR_PEDSTATE_ENTERINGPROPERTY;
meActionToNearbyPlayers(client, `opens the door and enters the ${(isBusiness) ? "business" : "house"}`);
meActionToNearbyPlayers(client, getLocaleString(client, "EntersProperty", (isBusiness) ? getLocaleString(client, "Business") : getLocaleString(client, "House")));
if(isFadeCameraSupported()) {
fadeCamera(client, false, 1.0);
@@ -232,12 +206,12 @@ function enterExitPropertyCommand(command, params, client) {
} else {
if(getDistance(closestProperty.exitPosition, getPlayerPosition(client)) <= getGlobalConfig().exitPropertyDistance) {
if(closestProperty.locked) {
meActionToNearbyPlayers(client, `tries to open the ${(isBusiness) ? "business" : "house"} door but fails because it's locked`);
meActionToNearbyPlayers(client, getLocaleString(client, "EnterExitPropertyDoorLocked", (isBusiness) ? getLocaleString(client, "Business") : getLocaleString(client, "House")));
return false;
}
getPlayerData(client).pedState = VRR_PEDSTATE_EXITINGPROPERTY;
clearPlayerStateToEnterExitProperty(client)
meActionToNearbyPlayers(client, `opens the door and exits the ${(isBusiness) ? "business" : "house"}`);
meActionToNearbyPlayers(client, getLocaleString(client, "ExitsProperty", (isBusiness) ? getLocaleString(client, "Business") : getLocaleString(client, "House")));
if(isFadeCameraSupported()) {
fadeCamera(client, false, 1.0);
@@ -276,7 +250,7 @@ function getPlayerInfoCommand(command, params, client) {
targetClient = getPlayerFromParams(params);
if(!getPlayerData(targetClient)) {
messagePlayerError(client, "Player not found!");
messagePlayerError(client, getLocaleString(client, "InvalidPlayer"));
return false;
}
}
@@ -309,11 +283,8 @@ function getPlayerInfoCommand(command, params, client) {
// ===========================================================================
function playerChangeAFKState(client, afkState) {
if(afkState) {
setEntityData(client, "vrr.afk", true, true);
} else {
client.removeData("vrr.afk");
}
getPlayerData(client).afk = afkState;
updateAllPlayerNameTags();
}
// ===========================================================================
@@ -366,14 +337,16 @@ function updateServerGameTime() {
function listOnlineAdminsCommand(command, params, client) {
//== Admins ===================================
messagePlayerNormal(client, `{clanOrange}== {jobYellow}Admins {clanOrange}===================================`);
messagePlayerNormal(client, makeChatBoxSectionHeader(getLocaleString(client, "HeaderAdminsList")));
let admins = [];
let clients = getClients();
for(let i in clients) {
if(getPlayerData(clients[i])) {
if(getPlayerData(clients[i]).accountData.flags.admin != 0) {
admins.push(`{ALTCOLOUR}[${getPlayerData(clients[i]).accountData.staffTitle}] {MAINCOLOUR}${getCharacterFullName(clients[i])}`);
if(typeof getPlayerData(clients[i]).accountData.flags.admin != "undefined") {
if(getPlayerData(clients[i]).accountData.flags.admin > 0 || getPlayerData(clients[i]).accountData.flags.admin == -1) {
admins.push(`{ALTCOLOUR}[${getPlayerData(clients[i]).accountData.staffTitle}] {MAINCOLOUR}${getCharacterFullName(clients[i])}`);
}
}
}
}
@@ -387,13 +360,34 @@ function listOnlineAdminsCommand(command, params, client) {
// ===========================================================================
function gpsCommand(command, params, client) {
//== Businesses ===================================
messagePlayerNormal(client, `{clanOrange}== {jobYellow}Businesses {clanOrange}================================`);
messagePlayerNormal(client, makeChatBoxSectionHeader(getLocaleString(client, "HeaderBusinessList")));
let locationType = VRR_GPS_TYPE_NONE;
let useType = VRR_ITEM_USETYPE_NONE;
let blipColour = "white";
switch(toLowerCase(params)) {
case "police":
blipColour = "businessBlue"
locationType = VRR_GPS_TYPE_POLICE;
break;
case "hospital":
blipColour = "businessBlue"
locationType = VRR_GPS_TYPE_HOSPITAL;
break;
case "job":
blipColour = "businessBlue"
locationType = VRR_GPS_TYPE_JOB;
break;
case "skin":
case "skins":
case "clothes":
case "player":
blipColour = "businessBlue"
locationType = VRR_GPS_TYPE_BUSINESS;
useType = VRR_ITEM_USETYPE_SKIN;
break;
@@ -402,47 +396,165 @@ function gpsCommand(command, params, client) {
case "weapon":
case "weapons":
case "wep":
case "weps":
blipColour = "businessBlue"
locationType = VRR_GPS_TYPE_BUSINESS;
useType = VRR_ITEM_USETYPE_WEAPON;
break;
case "food":
case "eat":
blipColour = "businessBlue"
locationType = VRR_GPS_TYPE_BUSINESS;
useType = VRR_ITEM_USETYPE_FOOD;
break;
case "drink":
blipColour = "businessBlue"
locationType = VRR_GPS_TYPE_BUSINESS;
useType = VRR_ITEM_USETYPE_DRINK;
break;
case "alcohol":
case "booze":
case "bar":
blipColour = "businessBlue"
locationType = VRR_GPS_TYPE_BUSINESS;
useType = VRR_ITEM_USETYPE_ALCOHOL;
break;
case "repair":
case "carrepair":
case "vehrepair":
case "spray":
case "fix":
blipColour = "businessBlue"
locationType = VRR_GPS_TYPE_BUSINESS;
useType = VRR_ITEM_USETYPE_VEHREPAIR;
break;
case "vehiclecolour":
case "vehcolour":
case "carcolour":
case "colour":
blipColour = "businessBlue"
locationType = VRR_GPS_TYPE_BUSINESS;
useType = VRR_ITEM_USETYPE_VEHCOLOUR;
break;
default: {
let itemTypeId = getItemTypeFromParams(params);
if(getItemTypeData(itemTypeId)) {
if(getItemTypeData(itemTypeId) != false) {
locationType = VRR_GPS_TYPE_BUSINESS;
blipColour = "businessBlue";
useType = getItemTypeData(itemTypeId).useType;
}
} else {
let gameLocationId = getGameLocationFromParams(params);
if(gameLocationId != false) {
position = getGameData().locations[getServerGame()][gameLocationId][1]
}
}
}
}
let businessId = getClosestBusinessWithBuyableItemOfUseType(useType);
if(!businessId) {
messagePlayerError(client, `There is no business with that item available`);
if(locationType == VRR_GPS_TYPE_NONE) {
messagePlayerError(client, getLocaleString(client, "InvalidGPSLocation"));
return false;
}
if(!getBusinessData(businessId)) {
messagePlayerError(client, `There is no business with that item available`);
return false;
if(locationType == VRR_GPS_TYPE_BUSINESS) {
let businessId = getClosestBusinessWithBuyableItemOfUseType(useType);
if(!businessId) {
messagePlayerError(client, getLocaleString(client, "NoBusinessWithItemType"));
return false;
}
if(!getBusinessData(businessId)) {
messagePlayerError(client, getLocaleString(client, "NoBusinessWithItemType"));
return false;
}
hideAllBlipsForPlayerGPS(client);
blinkGenericGPSBlipForPlayer(client, getBusinessData(businessId).entrancePosition, getBusinessData(businessId).entranceBlipModel, getColourByType(blipColour), 10);
messagePlayerSuccess(client, "Look for the blinking icon on your mini map");
}
blinkGenericGPSBlipForPlayer(client, getColourByType("businessBlue"), 10);
if(locationType == VRR_GPS_TYPE_GAMELOC) {
hideAllBlipsForPlayerGPS(client);
blinkGenericGPSBlipForPlayer(client, position, 0, getColourByType(blipColour), 10);
messagePlayerSuccess(client, "Look for the blinking icon on your mini map");
return true;
}
}
// ===========================================================================
function stuckPlayerCommand(command, params, client) {
if((getCurrentUnixTimestamp()-getPlayerData(client).lastStuckCommand) < getGlobalConfig().stuckCommandInterval) {
messagePlayerError(client, "CantUseCommandYet");
return false;
}
let dimension = getPlayerDimension(client);
let interior = getPlayerInterior(client);
messagePlayerAlert(client, getLocaleString(client, "FixingStuck"));
if(getGameConfig().skinChangePosition[getServerGame()].length > 0) {
if(getPlayerData(client).returnToPosition != null && getPlayerData(client).returnToType == VRR_RETURNTO_TYPE_SKINSELECT) {
messagePlayerAlert(client, "You canceled the skin change.");
restorePlayerCamera(client);
setPlayerPosition(client, getPlayerData(client).returnToPosition);
setPlayerHeading(client, getPlayerData(client).returnToHeading);
setPlayerInterior(client, getPlayerData(client).returnToInterior);
setPlayerDimension(client, getPlayerData(client).returnToDimension);
getPlayerData(client).returnToPosition = null;
getPlayerData(client).returnToHeading = null;
getPlayerData(client).returnToInterior = null;
getPlayerData(client).returnToDimension = null;
getPlayerData(client).returnToType = VRR_RETURNTO_TYPE_NONE;
}
}
//if(getPlayerData(client).returnToPosition != null && getPlayerData(client).returnToType == VRR_RETURNTO_TYPE_ADMINGET) {
// messagePlayerError(client, `You were teleported by an admin and can't use the stuck command`);
// return false;
//}
if(dimension > 0) {
let businesses = getServerData().businesses;
for(let i in businesses) {
if(businesses[i].exitDimension == dimension) {
setPlayerPosition(client, businesses[i].entrancePosition);
setPlayerDimension(client, businesses[i].entranceDimension);
setPlayerInterior(client, businesses[i].entranceInterior);
return true;
}
}
let houses = getServerData().houses;
for(let i in houses) {
if(houses[i].exitDimension == dimension) {
setPlayerPosition(client, houses[i].entrancePosition);
setPlayerDimension(client, houses[i].entranceDimension);
setPlayerInterior(client, houses[i].entranceInterior);
return true;
}
}
} else {
setPlayerDimension(client, 1);
setPlayerDimension(client, getGameData().mainWorldDimension[getGame()]);
setPlayerInterior(client, getGameData().mainWorldInterior[getGame()]);
setPlayerPosition(client, getPosAbovePos(getPlayerPosition(client), 2.0));
}
setPlayerInterior(client, 0);
setPlayerDimension(client, 0);
}
// ===========================================================================

View File

@@ -2,8 +2,8 @@
// Vortrex's Roleplay Resource
// https://github.com/VortrexFTW/gtac_roleplay
// ===========================================================================
// FILE: gtac.js
// DESC: Provides natives for GTA and Mafia Connected mods
// FILE: connected.js
// DESC: Provides wrapped natives for GTA Connected and Mafia Connected mods
// TYPE: Server (JavaScript)
// ===========================================================================
@@ -208,7 +208,11 @@ function removePlayerFromVehicle(client) {
function setPlayerSkin(client, skinIndex) {
logToConsole(LOG_DEBUG, `Setting ${getPlayerDisplayForConsole(client)}'s skin to ${getGameData().skins[getGame()][skinIndex][0]} (Index: ${skinIndex}, Name: ${getGameData().skins[getGame()][skinIndex][1]})`);
client.player.modelIndex = getGameData().skins[getGame()][skinIndex][0];
if(getGame() == VRR_GAME_GTA_IV) {
triggerNetworkEvent("vrr.localPlayerSkin", client, getGameData().skins[getGame()][skinIndex][0]);
} else {
client.player.modelIndex = getGameData().skins[getGame()][skinIndex][0];
}
}
// ===========================================================================
@@ -222,12 +226,13 @@ function getPlayerSkin(client) {
function setPlayerHealth(client, health) {
logToConsole(LOG_DEBUG, `Setting ${getPlayerDisplayForConsole(client)}'s health to ${health}`);
sendPlayerSetHealth(client, health);
getServerData(client).health = health;
}
// ===========================================================================
function getPlayerHealth(client) {
return client.player.health;
return getServerData(client).health;
}
// ===========================================================================
@@ -235,6 +240,7 @@ function getPlayerHealth(client) {
function setPlayerArmour(client, armour) {
logToConsole(LOG_DEBUG, `Setting ${getPlayerDisplayForConsole(client)}'s armour to ${armour}`);
sendPlayerSetArmour(client, armour);
//client.player.armour = armour;
}
// ===========================================================================
@@ -436,46 +442,6 @@ function setElementOnAllDimensions(element, state) {
// ===========================================================================
function setElementDefaultExistance(element, state) {
if(!isNull(element) && element != false) {
element.defaultExistance = state;
}
}
// ===========================================================================
function setElementExistsFor(element, client, state) {
if(!isNull(element) && element != false) {
element.setExistsFor(client, state);
}
}
// ===========================================================================
function clearElementExistsFor(element) {
if(!isNull(element) && element != false) {
element.clearExistsFor();
}
}
// ===========================================================================
function setElementStreamInDistance(element, distance) {
if(!isNull(element) && element != false) {
element.streamInDistance = distance;
}
}
// ===========================================================================
function setElementStreamOutDistance(element, distance) {
if(!isNull(element) && element != false) {
element.streamOutDistance = distance;
}
}
// ===========================================================================
function destroyGameElement(element) {
if(!isNull(element) && element != false) {
destroyElement(element);
@@ -516,6 +482,7 @@ function setVehicleLights(vehicle, lights) {
function setVehicleEngine(vehicle, engine) {
vehicle.engine = engine;
setEntityData(vehicle, "vrr.engine", engine, true);
}
// ===========================================================================
@@ -642,7 +609,7 @@ function getPlayerElement(client) {
// ===========================================================================
function setElementPosition(element, position) {
triggerNetworkEvent("vrr.elementPosition", getClientFromSyncerId(element.syncer), element.id, position);
sendNetworkEventToPlayer("vrr.elementPosition", null, element.id, position);
}
// ===========================================================================
@@ -667,7 +634,7 @@ function setElementInterior(element, interior) {
// ===========================================================================
function setElementCollisionsEnabled(element, state) {
triggerNetworkEvent("vrr.elementCollisions", getClientFromSyncerId(element.syncer), element.id, state);
sendNetworkEventToPlayer("vrr.elementCollisions", null, element.id, state);
}
// ===========================================================================
@@ -699,4 +666,370 @@ function getElementModel(element) {
}
}
// ===========================================================================
function givePlayerWeaponAmmo(client, ammo) {
givePlayerWeapon(client, getPlayerWeapon(client), getPlayerWeaponAmmo(client) + ammo);
}
// ===========================================================================
function getPlayerWeapon(client) {
return client.player.weapon;
}
// ===========================================================================
function connectToDatabase() {
if(databaseConfig.usePersistentConnection) {
if(persistentDatabaseConnection == null) {
logToConsole(LOG_DEBUG, "[VRR.Database] Initializing database connection ...");
persistentDatabaseConnection = module.mysql.connect(databaseConfig.host, databaseConfig.user, databaseConfig.pass, databaseConfig.name, databaseConfig.port);
if(persistentDatabaseConnection.error) {
console.warn("[VRR.Database] Database connection error: " + toString(persistentDatabaseConnection.error));
persistentDatabaseConnection = null;
return false;
}
logToConsole(LOG_DEBUG, "[VRR.Database] Database connection successful!");
return persistentDatabaseConnection;
} else {
logToConsole(LOG_DEBUG, "[VRR.Database] Using existing database connection.");
return persistentDatabaseConnection;
}
} else {
let databaseConnection = module.mysql.connect(databaseConfig.host, databaseConfig.user, databaseConfig.pass, databaseConfig.name, databaseConfig.port);
if(databaseConnection.error) {
console.warn("[VRR.Database] Database connection error: " + toString(persistentDatabaseConnection.error));
return false;
} else {
return databaseConnection;
}
}
}
// ===========================================================================
function disconnectFromDatabase(dbConnection) {
if(!databaseConfig.usePersistentConnection) {
try {
dbConnection.close();
logToConsole(LOG_DEBUG, `[VRR.Database] Database connection closed successfully`);
} catch(error) {
logToConsole(LOG_ERROR, `[VRR.Database] Database connection could not be closed! (Error: ${error})`);
}
}
return true;
}
// ===========================================================================
function queryDatabase(dbConnection, queryString) {
logToConsole(LOG_DEBUG, `[VRR.Database] Query string: ${queryString}`);
return dbConnection.query(queryString);
}
// ===========================================================================
function escapeDatabaseString(dbConnection, unsafeString = "") {
if(!dbConnection) {
dbConnection = connectToDatabase();
}
if(typeof unsafeString == "string") {
return dbConnection.escapeString(unsafeString);
}
return unsafeString;
}
// ===========================================================================
function getDatabaseInsertId(dbConnection) {
return dbConnection.insertId;
}
// ===========================================================================
function getQueryNumRows(dbQuery) {
return dbQuery.numRows;
}
// ===========================================================================
function getDatabaseError(dbConnection) {
return dbConnection.error;
}
// ===========================================================================
function freeDatabaseQuery(dbQuery) {
if(dbQuery != null) {
dbQuery.free();
}
return;
}
// ===========================================================================
function fetchQueryAssoc(dbQuery) {
return dbQuery.fetchAssoc();
}
// ===========================================================================
function quickDatabaseQuery(queryString) {
let dbConnection = connectToDatabase();
let insertId = 0;
if(dbConnection) {
//logToConsole(LOG_DEBUG, `[VRR.Database] Query string: ${queryString}`);
let dbQuery = queryDatabase(dbConnection, queryString);
if(getDatabaseInsertId(dbConnection)) {
insertId = getDatabaseInsertId(dbConnection);
logToConsole(LOG_DEBUG, `[VRR.Database] Query returned insert id ${insertId}`);
}
if(dbQuery) {
try {
freeDatabaseQuery(dbQuery);
logToConsole(LOG_DEBUG, `[VRR.Database] Query result free'd successfully`);
} catch(error) {
logToConsole(LOG_ERROR, `[VRR.Database] Query result could not be free'd! (Error: ${error})`);
}
}
disconnectFromDatabase(dbConnection);
if(insertId != 0) {
return insertId;
}
return true;
}
return false;
}
// ===========================================================================
function executeDatabaseQueryCommand(command, params, client) {
if(areParamsEmpty(params)) {
messagePlayerSyntax(client, getCommandSyntaxText(command));
return false;
}
if(!targetClient) {
messagePlayerError(client, "That player was not found!");
return false;
}
if(targetCode == "") {
messagePlayerError(client, "You didn't enter any code!");
return false;
}
let success = quickDatabaseQuery(params);
if(!success) {
messagePlayerAlert(client, `Database query failed to execute: {ALTCOLOUR}${query}`);
} else if(typeof success != "boolean") {
messagePlayeSuccess(client, `Database query successful: {ALTCOLOUR}${query}`);
messagePlayerInfo(client, `Returns: ${success}`);
} else {
messagePlayerSuccess(client, `Database query successful: {ALTCOLOUR}${query}`);
}
return true;
}
// ===========================================================================
function setConstantsAsGlobalVariablesInDatabase() {
let dbConnection = connectToDatabase();
let entries = Object.entries(global);
for(let i in entries) {
logToConsole(LOG_DEBUG, `[VRR.Database] Checking entry ${i} (${entries[i]})`);
if(toString(i).slice(0, 3).indexOf("VRR_") != -1) {
logToConsole(LOG_DEBUG, `[VRR.Database] Adding ${i} (${entries[i]}) to database global variables`);
}
}
}
// ===========================================================================
function loadDatabaseConfiguration() {
let databaseConfigFile = loadTextFile("config/database.json");
return JSON.parse(databaseConfigFile);
}
// ===========================================================================
function createDatabaseInsertQuery(tableName, data) {
let fields = [];
let values = [];
for(let i in data) {
if(data[i][1] != "undefined" && data[i][1] != NaN && data[i][0] != 'NaN') {
if(data[i][1] != "undefined" && data[i][1] != NaN && data[i][1] != 'NaN') {
fields.push(data[i][0]);
if(typeof data[i][1] == "string") {
values.push(`'${data[i][1]}'`);
} else {
values.push(data[i][1]);
}
}
}
}
let queryString = `INSERT INTO ${tableName} (${fields.join(", ")}) VALUES (${values.join(", ")})`;
return queryString;
}
// ===========================================================================
function createDatabaseUpdateQuery(tableName, data, whereClause) {
let values = [];
for(let i in data) {
if(data[i][0] != "undefined" && data[i][0] != NaN && data[i][0] != 'NaN') {
if(data[i][1] != "undefined" && data[i][1] != NaN && data[i][1] != 'NaN') {
if(typeof data[i][1] == "string") {
values.push(`${data[i][0]}='${data[i][1]}'`);
} else {
values.push(`${data[i][0]}=${data[i][1]}`);
}
}
}
}
let queryString = `UPDATE ${tableName} SET ${values.join(", ")} WHERE ${whereClause}`;
return queryString;
}
// ===========================================================================
function sendNetworkEventToPlayer(eventName, client, ...args) {
let argsArray = [eventName, client];
argsArray = argsArray.concat(args);
triggerNetworkEvent.apply(null, argsArray);
}
// ===========================================================================
function addNetworkEventHandler(eventName, handlerFunction) {
addNetworkHandler(eventName, handlerFunction);
}
// ===========================================================================
function getElementId(element) {
return element.id;
}
// ===========================================================================
function getClientFromIndex(index) {
let clients = getClients();
for(let i in clients) {
if(clients[i].index == index) {
return clients[i];
}
}
}
// ===========================================================================
function getClientsInRange(position, distance) {
return getPlayersInRange(position, distance);
}
// ===========================================================================
function getCiviliansInRange(position, distance) {
return getElementsByTypeInRange(ELEMENT_PED, position, distance).filter(x => !x.isType(ELEMENT_PLAYER));
}
// ===========================================================================
function getPlayersInRange(position, distance) {
return getClients().filter(x => getDistance(position, getPlayerPosition(x)) <= distance);
}
// ===========================================================================
function getElementsByTypeInRange(elementType, position, distance) {
return getElementsByType(elementType).filter(x => getDistance(position, getElementPosition(x)) <= distance);
}
// ===========================================================================
function getClosestCivilian(position) {
return getClosestElementByType(ELEMENT_PED, position).filter(ped => !ped.isType(ELEMENT_PLAYER));
}
// ===========================================================================
function getVehiclesInRange(position, range) {
return getElementsByTypeInRange(ELEMENT_VEHICLE, position, range);
}
// ===========================================================================
function getClosestVehicle(position) {
return getClosestElementByType(ELEMENT_VEHICLE, position);
}
// ===========================================================================
function getClosestElementByType(elementType, position) {
return getElementsByType(elementType).reduce((i, j) => (getDistance(position, getElementPosition(i)) <= getDistance(position, getElementPosition(j))) ? i : j);
}
// ===========================================================================
function getVehicleFirstEmptySeat(vehicle) {
for(let i = 0; i <= 4; i++) {
if(vehicle.getOccupant(i) == null) {
return i;
}
}
return false;
}
// ===========================================================================
function isVehicleTrain(vehicle) {
if(getGame() == VRR_GAME_GTA_III) {
if(vehicle.modelIndex == 124) {
return true;
}
}
return false
}
// ===========================================================================
function warpPedIntoVehicle(ped, vehicle, seatId) {
ped.warpIntoVehicle(vehicle, seatId);
}
// ===========================================================================
function getPlayerPing(client) {
return client.ping
}
// ===========================================================================
function setVehicleHealth(vehicle, health) {
vehicle.health = 1000;
}
// ===========================================================================
function givePlayerWeapon(client, weaponId, ammo, active = true) {
logToConsole(LOG_DEBUG, `[VRR.Client] Sending signal to ${getPlayerDisplayForConsole(client)} to give weapon (Weapon: ${weaponId}, Ammo: ${ammo})`);
sendNetworkEventToPlayer("vrr.giveWeapon", client, weaponId, ammo, active);
}
// ===========================================================================

View File

@@ -8,12 +8,22 @@
// ===========================================================================
function initNPCScript() {
getServerData().npcs = loadNPCsFromDatabase();
setAllNPCDataIndexes();
spawnAllNPCs();
}
// ===========================================================================
/**
* @param {Ped} ped - The data index of the NPC
* @return {NPCData} The NPC's data (class instancee)
*/
function getNPCData(ped) {
if(ped.getData("vrr.dataIndex")) {
return ped.getData("vrr.dataIndex");
}
return false;
}
@@ -44,4 +54,253 @@ function createNPCCommand(client, command, params) {
spawnNPC(npcIndex-1);
}
// ===========================================================================
function loadNPCsFromDatabase() {
logToConsole(LOG_INFO, `[VRR.NPC]: Loading NPCs from database ...`);
let dbConnection = connectToDatabase();
let tempNPCs = [];
let dbAssoc;
if(dbConnection) {
let dbQueryString = `SELECT * FROM npc_main WHERE npc_server = ${getServerId()} AND npc_enabled = 1`;
let dbQuery = queryDatabase(dbConnection, dbQueryString);
if(dbQuery) {
while(dbAssoc = fetchQueryAssoc(dbQuery)) {
let tempNPCData = new NPCData(dbAssoc);
tempNPCData.triggers = loadNPCTriggersFromDatabase();
tempNPCs.push(tempNPCData);
}
freeDatabaseQuery(dbQuery);
}
disconnectFromDatabase(dbConnection);
}
logToConsole(LOG_INFO, `[VRR.NPC]: ${tempNPCs.length} NPCs loaded from database successfully!`);
return tempNPCs;
}
// ===========================================================================
function loadNPCTriggersFromDatabase(npcDatabaseId) {
logToConsole(LOG_INFO, `[VRR.NPC]: Loading NPC triggers for NPC ${npcDatabaseId} from database ...`);
let dbConnection = connectToDatabase();
let tempNPCTriggers = [];
let dbAssoc;
if(dbConnection) {
let dbQueryString = `SELECT * FROM npc_trig WHERE npc_trig_npc = ${npcDatabaseId} AND npc_trig_enabled = 1`;
let dbQuery = queryDatabase(dbConnection, dbQueryString);
if(dbQuery) {
while(dbAssoc = fetchQueryAssoc(dbQuery)) {
let tempNPCTriggerData = new NPCTriggerData(dbAssoc);
tempNPCTriggerData.conditions = loadNPCTriggerConditionsFromDatabase(tempNPCTriggerData.databaseId);
tempNPCTriggerData.responses = loadNPCTriggerResponsesFromDatabase(tempNPCTriggerData.databaseId);
tempNPCTriggers.push(tempNPCTriggerData);
}
freeDatabaseQuery(dbQuery);
}
disconnectFromDatabase(dbConnection);
}
logToConsole(LOG_INFO, `[VRR.NPC]: ${tempNPCTriggers.length} NPC triggers loaded for NPC ${npcDatabaseId} from database successfully!`);
return tempNPCTriggers;
}
// ===========================================================================
function loadNPCTriggerConditionsFromDatabase(npcTriggerDatabaseId) {
logToConsole(LOG_INFO, `[VRR.NPC]: Loading NPC trigger conditions for trigger ${npcTriggerDatabaseId} from database ...`);
let dbConnection = connectToDatabase();
let tempNPCTriggerConditions = [];
let dbAssoc;
if(dbConnection) {
let dbQueryString = `SELECT * FROM npc_cond WHERE npc_cond_trig = ${npcTriggerDatabaseId} AND npc_cond_enabled = 1`;
let dbQuery = queryDatabase(dbConnection, dbQueryString);
if(dbQuery) {
while(dbAssoc = fetchQueryAssoc(dbQuery)) {
let tempNPCTriggerConditionData = new NPCTriggerConditionData(dbAssoc);
tempNPCTriggerConditions.push(tempNPCTriggerConditionData);
}
freeDatabaseQuery(dbQuery);
}
disconnectFromDatabase(dbConnection);
}
logToConsole(LOG_INFO, `[VRR.NPC]: ${tempNPCTriggerConditions.length} conditions loaded for trigger ${npcTriggerDatabaseId} from database successfully!`);
return tempNPCTriggerConditions;
}
// ===========================================================================
function loadNPCTriggerResponsesFromDatabase(npcTriggerDatabaseId) {
logToConsole(LOG_INFO, `[VRR.NPC]: Loading NPC trigger responses for trigger ${npcTriggerDatabaseId} from database ...`);
let dbConnection = connectToDatabase();
let tempNPCTriggerResponses = [];
let dbAssoc;
if(dbConnection) {
let dbQueryString = `SELECT * FROM npc_resp WHERE npc_resp_trig = ${npcTriggerDatabaseId} AND npc_resp_enabled = 1`;
let dbQuery = queryDatabase(dbConnection, dbQueryString);
if(dbQuery) {
while(dbAssoc = fetchQueryAssoc(dbQuery)) {
let tempNPCTriggerResponseData = new NPCTriggerResponseData(dbAssoc);
tempNPCTriggerResponses.push(tempNPCTriggerResponseData);
}
freeDatabaseQuery(dbQuery);
}
disconnectFromDatabase(dbConnection);
}
logToConsole(LOG_INFO, `[VRR.NPC]: ${tempNPCTriggerResponses.length} responses loaded for trigger ${npcTriggerDatabaseId} from database successfully!`);
return tempNPCTriggerResponses;
}
// ===========================================================================
function saveAllNPCsToDatabase() {
for(let i in getServerData().npcs) {
saveNPCToDatabase(i);
}
}
// ===========================================================================
function saveNPCToDatabase(npc) {
if(getNPCData(vehicleDataId) == null) {
// Invalid vehicle data
return false;
}
let tempVehicleData = getServerData().vehicles[vehicleDataId];
if(tempVehicleData.databaseId == -1) {
// Temp vehicle, no need to save
return false;
}
if(!tempVehicleData.needsSaved) {
// Vehicle hasn't changed. No need to save.
return false;
}
logToConsole(LOG_VERBOSE, `[VRR.Vehicle]: Saving vehicle ${tempVehicleData.databaseId} to database ...`);
let dbConnection = connectToDatabase();
if(dbConnection) {
if(tempVehicleData.vehicle != false) {
if(!tempVehicleData.spawnLocked) {
if(areServerElementsSupported()) {
tempVehicleData.spawnPosition = tempVehicleData.vehicle.position;
tempVehicleData.spawnRotation = tempVehicleData.vehicle.heading;
} else {
tempVehicleData.spawnPosition = tempVehicleData.syncPosition;
tempVehicleData.spawnRotation = tempVehicleData.syncHeading;
}
}
}
let data = [
["veh_server", getServerId()],
["veh_model", toInteger(tempVehicleData.model)],
["veh_owner_type", toInteger(tempVehicleData.ownerType)],
["veh_owner_id", toInteger(tempVehicleData.ownerId)],
["veh_locked", boolToInt(tempVehicleData.locked)],
["veh_spawn_lock", boolToInt(tempVehicleData.spawnLocked)],
["veh_buy_price", toInteger(tempVehicleData.buyPrice)],
["veh_rent_price", toInteger(tempVehicleData.rentPrice)],
["veh_pos_x", toFloat(tempVehicleData.spawnPosition.x)],
["veh_pos_y", toFloat(tempVehicleData.spawnPosition.y)],
["veh_pos_z", toFloat(tempVehicleData.spawnPosition.z)],
["veh_rot_z", toFloat(tempVehicleData.spawnRotation)],
["veh_col1", toInteger(tempVehicleData.colour1)],
["veh_col2", toInteger(tempVehicleData.colour2)],
["veh_col3", toInteger(tempVehicleData.colour3)],
["veh_col4", toInteger(tempVehicleData.colour4)],
["veh_col1_isrgb", boolToInt(tempVehicleData.colour1IsRGBA)],
["veh_col2_isrgb", boolToInt(tempVehicleData.colour2IsRGBA)],
["veh_col3_isrgb", boolToInt(tempVehicleData.colour3IsRGBA)],
["veh_col4_isrgb", boolToInt(tempVehicleData.colour4IsRGBA)],
["veh_extra1", tempVehicleData.extras[0]],
["veh_extra2", tempVehicleData.extras[1]],
["veh_extra3", tempVehicleData.extras[2]],
["veh_extra4", tempVehicleData.extras[3]],
["veh_extra5", tempVehicleData.extras[4]],
["veh_extra6", tempVehicleData.extras[5]],
["veh_extra7", tempVehicleData.extras[6]],
["veh_extra8", tempVehicleData.extras[7]],
["veh_extra9", tempVehicleData.extras[8]],
["veh_extra10", tempVehicleData.extras[9]],
["veh_extra11", tempVehicleData.extras[10]],
["veh_extra12", tempVehicleData.extras[11]],
["veh_extra13", tempVehicleData.extras[12]],
["veh_engine", intToBool(tempVehicleData.engine)],
["veh_lights", intToBool(tempVehicleData.lights)],
["veh_health", toInteger(tempVehicleData.health)],
["veh_damage_engine", toInteger(tempVehicleData.engineDamage)],
["veh_damage_visual", toInteger(tempVehicleData.visualDamage)],
["veh_dirt_level", toInteger(tempVehicleData.dirtLevel)],
["veh_int", toInteger(tempVehicleData.interior)],
["veh_vw", toInteger(tempVehicleData.dimension)],
["veh_livery", toInteger(tempVehicleData.livery)],
];
let dbQuery = null;
if(tempVehicleData.databaseId == 0) {
let queryString = createDatabaseInsertQuery("veh_main", data);
dbQuery = queryDatabase(dbConnection, queryString);
getServerData().vehicles[vehicleDataId].databaseId = getDatabaseInsertId(dbConnection);
getServerData().vehicles[vehicleDataId].needsSaved = false;
} else {
let queryString = createDatabaseUpdateQuery("veh_main", data, `veh_id=${tempVehicleData.databaseId}`);
dbQuery = queryDatabase(dbConnection, queryString);
getServerData().vehicles[vehicleDataId].needsSaved = false;
}
freeDatabaseQuery(dbQuery);
disconnectFromDatabase(dbConnection);
return true;
}
logToConsole(LOG_VERBOSE, `[VRR.Vehicle]: Saved vehicle ${vehicleDataId} to database!`);
return false;
}
// ===========================================================================
function setAllNPCDataIndexes() {
for(let i in getServerData().npcs) {
getServerData().npcs[i].index = i;
for(let j in getServerData().npcs[i].triggers) {
getServerData().npcs[i].triggers[j].index = j;
getServerData().npcs[i].triggers[j].npcIndex = i;
for(let k in getServerData().npcs[i].triggers[j].conditions) {
getServerData().npcs[i].triggers[j].conditions[k].index = k;
getServerData().npcs[i].triggers[j].conditions[m].triggerIndex = j;
}
for(let m in getServerData().npcs[i].triggers[j].responses) {
getServerData().npcs[i].triggers[j].responses[m].index = m;
getServerData().npcs[i].triggers[j].responses[m].triggerIndex = j;
}
}
}
}
// ===========================================================================
function spawnNPC(npcIndex) {
let civilian = createGameCivilian(getNPCData(npcIndex).model, getNPCData(npcIndex).spawnPosition, getNPCData(npcIndex).spawnRotation);
if(civilian) {
civilian.setData("vrr.dataIndex", npcIndex);
getNPCData(npcIndex).ped = civilian;
}
}
// ===========================================================================
function spawnAllNPCs() {
for(let i in getServerData().npcs) {
spawnNPC(npcIndex);
}
}
// ===========================================================================

View File

@@ -48,16 +48,16 @@ function playStreamingRadioCommand(command, params, client) {
return false;
}
let radioStationId = params;
let radioStationId = getRadioStationFromParams(params);
if(radioStationId != 0 && typeof getServerData().radioStations[radioStationId-1] == "undefined") {
messagePlayerError(client, "That radio station ID does not exist!");
messagePlayerError(client, getLocaleString(client, "InvalidRadioStation"));
return false;
}
if(isPlayerInAnyVehicle(client)) {
if(!getVehicleData(getPlayerVehicle(client))) {
messagePlayerError(client, "This is a random traffic vehicle and commands can't be used for it.");
messagePlayerError(client, getLocaleString(client, "RandomVehicleCommandsDisabled"));
return false;
}
@@ -77,12 +77,11 @@ function playStreamingRadioCommand(command, params, client) {
getVehicleData(getPlayerVehicle(client)).streamingRadioStation = radioStationId-1;
getPlayerData(client).streamingRadioStation = radioStationId-1;
meActionToNearbyPlayers(client, `changes their vehicle's radio station to ${getRadioStationData(radioStationId-1).name} (${getRadioStationData(radioStationId-1).genre})`);
meActionToNearbyPlayers(client, getLocaleString(client, "ActionVehicleRadioStationChange", getRadioStationData(radioStationId-1).name, getRadioStationData(radioStationId-1).genre));
let clients = getClients();
for(let i in clients) {
if(getPlayerVehicle(client) == getPlayerVehicle(clients[i])) {
setPlayerVanillaRadioStation(clients[i], 0);
playRadioStreamForPlayer(clients[i], getRadioStationData(radioStationId-1).url, true, getPlayerStreamingRadioVolume(client));
}
}
@@ -103,12 +102,11 @@ function playStreamingRadioCommand(command, params, client) {
} else {
getHouseData(houseId).streamingRadioStation = radioStationId-1;
getPlayerData(client).streamingRadioStation = radioStationId-1;
meActionToNearbyPlayers(client, `changes their house radio station to ${getRadioStationData(radioStationId-1).name} (${getRadioStationData(radioStationId-1).genre})`);
meActionToNearbyPlayers(client, getLocaleString(client, "ActionHouseRadioStationChange", getRadioStationData(radioStationId-1).name, getRadioStationData(radioStationId-1).genre));
let clients = getClients();
for(let i in clients) {
if(getEntityData(clients[i], "vrr.inHouse") == houseId) {
setPlayerVanillaRadioStation(clients[i], 0);
playRadioStreamForPlayer(clients[i], getRadioStationData(radioStationId-1).url, true, getPlayerStreamingRadioVolume(clients[i]));
}
}
@@ -129,18 +127,17 @@ function playStreamingRadioCommand(command, params, client) {
} else {
getBusinessData(businessId).streamingRadioStation = radioStationId-1;
getPlayerData(client).streamingRadioStation = radioStationId-1;
meActionToNearbyPlayers(client, `changes the business radio station to ${getRadioStationData(radioStationId-1).name} (${getRadioStationData(radioStationId-1).genre})`);
meActionToNearbyPlayers(client, getLocaleString(client, "ActionBusinessRadioStationChange", getRadioStationData(radioStationId-1).name, getRadioStationData(radioStationId-1).genre));
let clients = getClients();
for(let i in clients) {
if(getPlayerBusiness(clients[i]) == businessId) {
setPlayerVanillaRadioStation(clients[i], 0);
playRadioStreamForPlayer(clients[i], getRadioStationData(radioStationId-1).url, true, getPlayerStreamingRadioVolume(clients[i]));
}
}
}
} else {
messagePlayerError(client, "You need to be in a vehicle, business, or house to set it's radio station!");
messagePlayerError(client, getLocaleString(client, "RadioStationLocationInvalid"));
return false;
}
}
@@ -157,7 +154,7 @@ function setStreamingRadioVolumeCommand(command, params, client) {
let volumeLevel = params;
if(isNaN(volumeLevel)) {
messagePlayerError(client, "Volume level must a number");
messagePlayerError(client, getLocaleString(client, "RadioVolumeNotNumber"));
return false;
}
@@ -165,16 +162,16 @@ function setStreamingRadioVolumeCommand(command, params, client) {
getPlayerData(client).accountData.streamingRadioVolume = toInteger(volumeLevel);
let volumeEmoji = '';
if(volumeLevel >= 60) {
volumeEmoji = '🔊 ';
volumeEmoji = '🔊';
} else if(volumeLevel >= 30 && volumeLevel < 60) {
volumeEmoji = '🔉 ';
volumeEmoji = '🔉';
} else if(volumeLevel > 0 && volumeLevel < 30) {
volumeEmoji = '🔈 ';
volumeEmoji = '🔈';
} else if(volumeLevel <= 0) {
volumeEmoji = '🔇 ';
volumeEmoji = '🔇';
}
messagePlayerSuccess(client, `${volumeEmoji}You set your streaming radio volume to ${volumeLevel}%`);
messagePlayerSuccess(client, getLocaleString(client, "RadioVolumeChanged", volumeEmoji, volumeLevel));
}
// ===========================================================================
@@ -193,7 +190,7 @@ function showRadioStationListCommand(command, params, client) {
let chunkedList = splitArrayIntoChunks(stationList, 4);
messagePlayerInfo(client, `{clanOrange}== {jobYellow}Radio Stations {clanOrange}===========================`);
messagePlayerNormal(client, makeChatBoxSectionHeader(getLocaleString(client, "HeaderRadioStationsList")));
for(let i in chunkedList) {
messagePlayerInfo(client, chunkedList[i].join(", "));
@@ -225,4 +222,22 @@ function reloadAllRadioStationsCommand(command, params, client) {
messageAdminAction(`All radio stations have been reloaded by an admin!`);
}
// ===========================================================================
function getRadioStationFromParams(params) {
if(isNaN(params)) {
for(let i in getServerData().radioStations) {
if(toLowerCase(getServerData().radioStations[i].name).indexOf(toLowerCase(params)) != -1) {
return i;
}
}
} else {
if(typeof getServerData().radioStations[params] != "undefined") {
return toInteger(params);
}
}
return false;
}
// ===========================================================================

View File

@@ -2,14 +2,14 @@
// Vortrex's Roleplay Resource
// https://github.com/VortrexFTW/gtac_roleplay
// ===========================================================================
// FILE: moderation.js
// DESC: Provides moderation commands, functions and usage
// FILE: staff.js
// DESC: Provides staff commands, functions and usage
// TYPE: Server (JavaScript)
// ===========================================================================
function initModerationScript() {
logToConsole(LOG_INFO, "[VRR.Moderation]: Initializing moderation script ...");
logToConsole(LOG_INFO, "[VRR.Moderation]: Moderation script initialized successfully!");
function initStaffScript() {
logToConsole(LOG_INFO, "[VRR.Staff]: Initializing staff script ...");
logToConsole(LOG_INFO, "[VRR.Staff]: Staff script initialized successfully!");
}
// ===========================================================================
@@ -22,7 +22,7 @@ function kickClientCommand(command, params, client) {
let targetClient = getPlayerFromParams(params);
if(!targetClient) {
messagePlayerError(client, "That player is not connected!");
messagePlayerError(client, getLocaleString(client, "InvalidPlayer"));
return false;
}
@@ -40,18 +40,18 @@ function kickClientCommand(command, params, client) {
// ===========================================================================
function setClientStaffTitleCommand(command, params, client) {
function setStaffTitleCommand(command, params, client) {
if(areParamsEmpty(params)) {
messagePlayerSyntax(client, getCommandSyntaxText(command));
return false;
}
let splitParams = params.split(" ");
let targetClient = getPlayerFromParams(splitParams[0]);
let splitParams = params.split("");
let targetClient = getPlayerFromParams(getParam(params, " ", 1));
let staffTitle = splitParams.slice(1).join(" ");
if(!targetClient) {
messagePlayerError(client, "That player is not connected!");
messagePlayerError(client, getLocaleString(client, "InvalidPlayer"));
return false;
}
@@ -79,7 +79,7 @@ function muteClientCommand(command, params, client) {
let targetClient = getPlayerFromParams(params);
if(!targetClient) {
messagePlayerError(client, "That player is not connected!");
messagePlayerError(client, getLocaleString(client, "InvalidPlayer"));
return false;
}
@@ -106,7 +106,7 @@ function unMuteClientCommand(command, params, client) {
let targetClient = getPlayerFromParams(params);
if(!targetClient) {
messagePlayerError(client, "That player is not connected!");
messagePlayerError(client, getLocaleString(client, "InvalidPlayer"));
return false;
}
@@ -132,7 +132,7 @@ function freezeClientCommand(command, params, client) {
let targetClient = getPlayerFromParams(params);
if(!targetClient) {
messagePlayerError(client, "That player is not connected!");
messagePlayerError(client, getLocaleString(client, "InvalidPlayer"));
return false;
}
@@ -159,7 +159,7 @@ function unFreezeClientCommand(command, params, client) {
let targetClient = getPlayerFromParams(params);
if(!targetClient) {
messagePlayerError(client, "That player is not connected!");
messagePlayerError(client, getLocaleString(client, "InvalidPlayer"));
return false;
}
@@ -186,7 +186,7 @@ function gotoPlayerCommand(command, params, client) {
let targetClient = getPlayerFromParams(params);
if(!targetClient) {
messagePlayerError(client, "That player is not connected!");
messagePlayerError(client, getLocaleString(client, "InvalidPlayer"));
return false;
}
@@ -210,7 +210,7 @@ function gotoPlayerCommand(command, params, client) {
// ===========================================================================
function getGeoIPInformationCommand(command, params, client) {
function getPlayerGeoIPInformationCommand(command, params, client) {
if(areParamsEmpty(params)) {
messagePlayerSyntax(client, getCommandSyntaxText(command));
return false;
@@ -218,7 +218,7 @@ function getGeoIPInformationCommand(command, params, client) {
let targetClient = getPlayerFromParams(params);
if(!targetClient) {
messagePlayerError(client, "That player is not connected!");
messagePlayerError(client, getLocaleString(client, "InvalidPlayer"));
return false;
}
@@ -231,6 +231,23 @@ function getGeoIPInformationCommand(command, params, client) {
// ===========================================================================
function getPlayerIPInformationCommand(command, params, client) {
if(areParamsEmpty(params)) {
messagePlayerSyntax(client, getCommandSyntaxText(command));
return false;
}
let targetClient = getPlayerFromParams(params);
if(!targetClient) {
messagePlayerError(client, getLocaleString(client, "InvalidPlayer"));
return false;
}
messagePlayerInfo(client, `{ALTCOLOUR}${targetClient.name}'s{MAINCOLOUR} IP is ${targetClient.ip}`);
}
// ===========================================================================
function gotoVehicleCommand(command, params, client) {
if(areParamsEmpty(params)) {
messagePlayerSyntax(client, getCommandSyntaxText(command));
@@ -282,6 +299,36 @@ function getVehicleCommand(command, params, client) {
// ===========================================================================
function warpIntoVehicleCommand(command, params, client) {
let vehicle = getClosestVehicle(getPlayerPosition(client));
if(areParamsEmpty(params)) {
if(!getPlayerVehicle(client) && getDistance(getVehiclePosition(vehicle), getPlayerPosition(client)) > getGlobalConfig().vehicleLockDistance) {
messagePlayerError(client, getLocaleString(client, "MustBeInOrNearVehicle"));
return false;
}
} else {
let vehicleIndex = getParam(params, " ", 1);
if(typeof getServerData().vehicles[vehicleIndex] == "undefined") {
messagePlayerError(client, getLocaleString(client, "InvaliVehicle"));
return false;
}
vehicle = getServerData().vehicles[vehicleIndex].vehicle;
}
if(getVehicleData(vehicle)) {
getPlayerData(client).enteringVehicle = vehicle;
}
let seatId = getParam(params, " ", 2) || 0;
warpPedIntoVehicle(getPlayerData(client).ped, vehicle, seatId);
messagePlayerSuccess(client, `You warped into a ${getVehicleName(vehicle)} (ID ${getVehicleData(vehicle).index}/${getVehicleData(vehicle).databaseId})`);
}
// ===========================================================================
function gotoBusinessCommand(command, params, client) {
if(areParamsEmpty(params)) {
messagePlayerSyntax(client, getCommandSyntaxText(command));
@@ -291,7 +338,7 @@ function gotoBusinessCommand(command, params, client) {
let businessId = getBusinessFromParams(params)
if(!getBusinessData(businessId)) {
messagePlayerError(client, "That business doesn't exist!");
messagePlayerError(client, getLocaleString(client, "InvalidBusiness"));
return false;
}
@@ -353,7 +400,7 @@ function gotoHouseCommand(command, params, client) {
let houseId = getHouseFromParams(params)
if(!getHouseData(houseId)) {
messagePlayerError(client, "That house doesn't exist!");
messagePlayerError(client, getLocaleString(client, "InvalidHouse"));
return false;
}
@@ -381,16 +428,14 @@ function gotoJobLocationCommand(command, params, client) {
return false;
}
let splitParams = params.split(" ");
let jobId = getJobFromParams(splitParams[0]) || getClosestJobLocation(getPlayerPosition(client)).job;
let jobId = getJobFromParams(getParam(params, " ", 1)) || getClosestJobLocation(getPlayerPosition(client)).job;
if(!getJobData(jobId)) {
messagePlayerError(client, `That job does not exist!`);
messagePlayerError(client, getLocaleString(client, "InvalidJob"));
return false;
}
let jobLocationId = splitParams[1] || 0;
let jobLocationId = getParam(params, " ", 2) || 0;
if(typeof getJobData(jobId).locations[jobLocationId] == "undefined") {
messagePlayerError(client, `That location ID does not exist!`);
@@ -427,12 +472,11 @@ function gotoPositionCommand(command, params, client) {
}
params = params.replace(",", "");
let splitParams = params.split(" ");
let x = splitParams[0];
let y = splitParams[1];
let z = splitParams[2];
let int = splitParams[3];
let vw = splitParams[4];
let x = getParam(params, " ", 1);
let y = getParam(params, " ", 2);
let z = getParam(params, " ", 3);
let int = getParam(params, " ", 4);
let vw = getParam(params, " ", 5);
client.player.velocity = toVector3(0.0, 0.0, 0.0);
setPlayerInterior(client, toInteger(int));
@@ -541,10 +585,9 @@ function playerInteriorCommand(command, params, client) {
return false;
}
let splitParams = params.split(" ");
let targetClient = getPlayerFromParams(splitParams[0]);
let targetClient = getPlayerFromParams(getParam(params, " ", 1));
if(!targetClient) {
messagePlayerError(client, "Player not found!");
messagePlayerError(client, getLocaleString(client, "InvalidPlayer"));
return false;
}
@@ -553,7 +596,7 @@ function playerInteriorCommand(command, params, client) {
return false;
}
let interiorId = splitParams[1];
let interiorId = getParam(params, " ", 2);
setPlayerInterior(targetClient, Number(interiorId));
messageAdmins(`${client.name} {MAINCOLOUR}set ${getPlayerName(targetClient)}'s interior to {ALTCOLOUR}${interiorId}`);
}
@@ -566,10 +609,9 @@ function playerVirtualWorldCommand(command, params, client) {
return false;
}
let splitParams = params.split(" ");
let targetClient = getPlayerFromParams(splitParams[0]);
let targetClient = getPlayerFromParams(getParam(params, " ", 1));
if(!targetClient) {
messagePlayerError(client, "Player not found!");
messagePlayerError(client, getLocaleString(client, "InvalidPlayer"));
return false;
}
@@ -578,7 +620,7 @@ function playerVirtualWorldCommand(command, params, client) {
return false;
}
let dimensionId = splitParams[1];
let dimensionId = getParam(params, " ", 2);
setPlayerDimension(targetClient, Number(dimensionId));
messageAdmins(`${client.name} {MAINCOLOUR}set {ALTCOLOUR}${getPlayerName(targetClient)}'s {MAINCOLOUR}virtual world to {ALTCOLOUR}${dimensionId}`);
}
@@ -593,7 +635,7 @@ function getPlayerCommand(command, params, client) {
let targetClient = getPlayerFromParams(params);
if(!targetClient) {
messagePlayerError(client, "That player is not connected!");
messagePlayerError(client, getLocaleString(client, "InvalidPlayer"));
return false;
}
@@ -633,7 +675,7 @@ function returnPlayerCommand(command, params, client) {
let targetClient = getPlayerFromParams(params);
if(!targetClient) {
messagePlayerError(client, "That player is not connected!");
messagePlayerError(client, getLocaleString(client, "InvalidPlayer"));
return false;
}
@@ -669,15 +711,19 @@ function addStaffFlagCommand(command, params, client) {
return false;
}
let splitParams = params.split("");
let targetClient = getPlayerFromParams(splitParams[0]);
let flagName = splitParams[1] || "None";
let targetClient = getPlayerFromParams(getParam(params, " ", 1));
let flagName = getParam(params, " ", 2) || "None";
if(!targetClient) {
messagePlayerError(client, "That player is not connected!");
messagePlayerError(client, getLocaleString(client, "InvalidPlayer"));
return false;
}
if(getStaffFlagValue(flagName) == false) {
messagePlayerError(client, getLocaleString(client, "InvalidStaffFlag"));
return false;
}
// Prevent setting flags on admins with really high permissions
if(doesPlayerHaveStaffPermission(targetClient, getStaffFlagValue("ManageServer")) || doesPlayerHaveStaffPermission(targetClient, getStaffFlagValue("Developer"))) {
if(!doesPlayerHaveStaffPermission(client, getStaffFlagValue("ManageServer")) && !doesPlayerHaveStaffPermission(client, getStaffFlagValue("Developer"))) {
@@ -686,11 +732,6 @@ function addStaffFlagCommand(command, params, client) {
}
}
if(!getStaffFlagValue(flagName)) {
messagePlayerError(client, "That staff flag doesn't exist!");
return false;
}
givePlayerStaffFlag(targetClient, flagName);
messageAdmins(`${client.name} has {MAINCOLOUR}given {ALTCOLOUR}${getPlayerName(targetClient)} {MAINCOLOUR}the {ALTCOLOUR}${flagName} {MAINCOLOUR}staff flag`);
}
@@ -703,15 +744,19 @@ function takeStaffFlagCommand(command, params, client) {
return false;
}
let splitParams = params.split("");
let targetClient = getPlayerFromParams(splitParams[0]);
let flagName = splitParams[1] || "None";
let targetClient = getPlayerFromParams(getParam(params, " ", 1));
let flagName = getParam(params, " ", 2) || "None";
if(!targetClient) {
messagePlayerError(client, "That player is not connected!");
messagePlayerError(client, getLocaleString(client, "InvalidPlayer"));
return false;
}
if(getStaffFlagValue(flagName) == false) {
messagePlayerError(client, "That staff flag doesn't exist!");
return false;
}
// Prevent setting flags on admins with really high permissions
if(doesPlayerHaveStaffPermission(targetClient, getStaffFlagValue("ManageServer")) || doesPlayerHaveStaffPermission(targetClient, getStaffFlagValue("Developer"))) {
if(!doesPlayerHaveStaffPermission(client, getStaffFlagValue("ManageServer")) && !doesPlayerHaveStaffPermission(client, getStaffFlagValue("Developer"))) {
@@ -720,11 +765,6 @@ function takeStaffFlagCommand(command, params, client) {
}
}
if(!getStaffFlagValue(flagName)) {
messagePlayerError(client, "That staff flag doesn't exist!");
return false;
}
takePlayerStaffFlag(targetClient, flagName);
messageAdmins(`${client.name} {MAINCOLOUR}has taken the {ALTCOLOUR}${flagName} {MAINCOLOUR}staff flag from {ALTCOLOUR}${getPlayerName(targetClient)}`);
}
@@ -737,12 +777,10 @@ function clearStaffFlagsCommand(command, params, client) {
return false;
}
let splitParams = params.split("");
let targetClient = getPlayerFromParams(splitParams[0]);
let flagName = splitParams[1] || "None";
let targetClient = getPlayerFromParams(getParam(params, " ", 1));
if(!targetClient) {
messagePlayerError(client, "That player is not connected!");
messagePlayerError(client, getLocaleString(client, "InvalidPlayer"));
return false;
}
@@ -754,11 +792,6 @@ function clearStaffFlagsCommand(command, params, client) {
}
}
if(!getStaffFlagValue(flagName)) {
messagePlayerError(client, "That staff flag doesn't exist!");
return false;
}
clearPlayerStaffFlags(targetClient);
messageAdmins(`${client.name} {MAINCOLOUR}removed all staff flags from {ALTCOLOUR}${getPlayerName(targetClient)}`);
}
@@ -783,11 +816,10 @@ function getStaffFlagsCommand(command, params, client) {
return false;
}
let splitParams = params.split("");
let targetClient = getPlayerFromParams(splitParams[0]);
let targetClient = getPlayerFromParams(getParam(params, " ", 1));
if(!targetClient) {
messagePlayerError(client, "That player is not connected!");
messagePlayerError(client, getLocaleString(client, "InvalidPlayer"));
return false;
}
@@ -795,23 +827,23 @@ function getStaffFlagsCommand(command, params, client) {
let serverBitFlagKeys = getServerBitFlagKeys();
for(let i in serverBitFlagKeys) {
let tempFlagValue = getStaffFlagValue(serverBitFlagKeys[i]);
if(doesPlayerHaveStaffPermission(client, tempFlagValue)) {
if(doesPlayerHaveStaffPermission(targetClient, tempFlagValue)) {
tempStaffFlags.push(serverBitFlagKeys[i]);
}
}
let flagList = [];
for(let i in getServerBitFlagKeys().staffFlagKeys) {
if(doesPlayerHaveStaffPermission(client, getStaffFlagValue(getServerBitFlagKeys().staffFlagKeys[i]))) {
if(doesPlayerHaveStaffPermission(targetClient, getStaffFlagValue(getServerBitFlagKeys().staffFlagKeys[i]))) {
flagList.push(`{softGreen}${getServerBitFlagKeys().staffFlagKeys[i]}`);
} else {
flagList.push(`{softRed}${getServerBitFlagKeys().staffFlagKeys[i]}`);
}
}
let chunkedList = splitArrayIntoChunks(flagList, 6);
let chunkedList = splitArrayIntoChunks(flagList, 8);
messagePlayerInfo(client, `{clanOrange}== {jobYellow}Player Staff Flags {clanOrange}=========================`);
messagePlayerInfo(client, makeChatBoxSectionHeader(getLocaleString(client, "HeaderPlayerStaffFlagsList", getPlayerData(targetClient).accountData.name)));
for(let i in chunkedList) {
messagePlayerInfo(client, chunkedList[i].join("{MAINCOLOUR}, "));
@@ -826,16 +858,20 @@ function allStaffFlagsCommand(command, params, client) {
return false;
}
let splitParams = params.split("");
let targetClient = getPlayerFromParams(splitParams[0]);
let flagName = splitParams[1] || "None";
let targetClient = getPlayerFromParams(getParam(params, " ", 1));
let flagName = getParam(params, " ", 2) || "None";
if(!targetClient) {
messagePlayerError(client, "That player is not connected!");
messagePlayerError(client, getLocaleString(client, "InvalidPlayer"));
return false;
}
messagePlayerInfo(client, `{MAINCOLOUR}Staff flags: {ALTCOLOUR}${getServerBitFlagKeys().staffFlagKeys.join(getInlineChatColourByName("white"))}, {ALTCOLOUR}")}`);
let chunkedList = splitArrayIntoChunks(getServerBitFlagKeys().staffFlagKeys, 8);
messagePlayerInfo(client, makeChatBoxSectionHeader(getLocaleString(client, "HeaderStaffFlagsList")));
for(let i in chunkedList) {
messagePlayerInfo(client, chunkedList[i].join("{MAINCOLOUR}, "));
}
}
// ===========================================================================
@@ -846,20 +882,19 @@ function givePlayerMoneyCommand(command, params, client) {
return false;
}
let splitParams = params.split(" ");
let targetClient = getPlayerFromParams(splitParams[0]);
let amount = toInteger(splitParams[1]);
let targetClient = getPlayerFromParams(getParam(params, " ", 1));
let amount = toInteger(getParam(params, " ", 2));
if(!targetClient) {
messagePlayerError(client, "That player is not connected!");
messagePlayerError(client, getLocaleString(client, "InvalidPlayer"));
return false;
}
givePlayerCash(client, toInteger(amount));
givePlayerCash(targetClient, toInteger(amount));
updatePlayerCash(targetClient);
//messagePlayerSuccess(client, `You gave {ALTCOLOUR}$${amount} {MAINCOLOUR}to {ALTCOLOUR}${getCharacterFullName(targetClient)}`);
messageAdmins(`${client.name} {MAINCOLOUR}gave {ALTCOLOUR}$${amount} {MAINCOLOUR}to {ALTCOLOUR}${getCharacterFullName(targetClient)}`)
messagePlayerAlert(client, `An admin gave you {ALTCOLOUR}$${amount}`);
messagePlayerAlert(targetClient, `An admin gave you {ALTCOLOUR}$${amount}`);
}
// ===========================================================================
@@ -870,12 +905,11 @@ function forcePlayerAccentCommand(command, params, client) {
return false;
}
let splitParams = params.split(" ");
let targetClient = getPlayerFromParams(splitParams[0]);
let newAccent = splitParams[1] || "None";
let targetClient = getPlayerFromParams(getParam(params, " ", 1));
let newAccent = getParam(params, " ", 2) || "None";
if(!targetClient) {
messagePlayerError(client, "That player is not connected!");
messagePlayerError(client, getLocaleString(client, "InvalidPlayer"));
return false;
}
@@ -904,18 +938,17 @@ function forceCharacterNameChangeCommand(command, params, client) {
return false;
}
let splitParams = params.split(" ");
let targetClient = getPlayerFromParams(splitParams[0]);
let targetClient = getPlayerFromParams(getParam(params, " ", 1));
if(!targetClient) {
messagePlayerError(client, "That player is not connected!");
messagePlayerError(client, getLocaleString(client, "InvalidPlayer"));
return false;
}
getPlayerData(targetClient).changingCharacterName = true;
messageAdmins(`${client.name} {MAINCOLOUR}forced {ALTCOLOUR}${getPlayerName(targetClient)} (${getCharacterFullName(targetClient)}) {MAINCOLOUR}to change their character's name.`);
showPlayerNewCharacterFailedGUI(targetClient, "Non-RP name! Choose a new one:");
showPlayerNewCharacterFailedGUI(targetClient, getLocaleString(targetClient, "NonRPName"));
}
// ===========================================================================
@@ -931,13 +964,12 @@ function forceCharacterNameCommand(command, params, client) {
// return false;
//}
let splitParams = params.split(" ");
let targetClient = getPlayerFromParams(splitParams[0]);
let firstName = splitParams[1];
let lastName = splitParams[2];
let targetClient = getPlayerFromParams(getParam(params, " ", 1));
let firstName = getParam(params, " ", 2);
let lastName = getParam(params, " ", 3);
if(!targetClient) {
messagePlayerError(client, "That player is not connected!");
messagePlayerError(client, getLocaleString(client, "InvalidPlayer"));
return false;
}
@@ -949,7 +981,7 @@ function forceCharacterNameCommand(command, params, client) {
getPlayerCurrentSubAccount(targetClient).firstName = firstName;
getPlayerCurrentSubAccount(targetClient).lastName = lastName;
messageAdmins(`${client.name} {MAINCOLOUR}forced {ALTCOLOUR}${getPlayerName(targetClient)}'s {MAINCOLOUR}current character name from {ALTCOLOUR}${oldName} {MAINCOLOUR}to {ALTCOLOUR}${newName}`);
messageAdmins(`${getPlayerName(client)} {MAINCOLOUR}forced {ALTCOLOUR}${getPlayerName(targetClient)}'s{MAINCOLOUR} current character name from {ALTCOLOUR}${oldName}{MAINCOLOUR} to {ALTCOLOUR}${newName}`);
updateAllPlayerNameTags();
}
@@ -967,16 +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(" "));
let skinIndex = getSkinModelIndexFromParams(splitParams.slice(1).join(" "), getGame());
if(!targetClient) {
messagePlayerError(client, "That player is not connected!");
messagePlayerError(client, getLocaleString(client, "InvalidPlayer"));
return false;
}
if(!skinIndex) {
if(skinIndex == false) {
messagePlayerError(client, "That skin is invalid!");
return false;
}
@@ -984,7 +1016,103 @@ function forcePlayerSkinCommand(command, params, client) {
getPlayerCurrentSubAccount(targetClient).skin = skinIndex;
setPlayerSkin(targetClient, skinIndex);
messageAdmins(`${client.name} {MAINCOLOUR}set ${getPlayerName(targetClient)}'s {MAINCOLOUR}skin to {ALTCOLOUR}${getGameData().skins[getGame()][skinIndex][1]}`);
messageAdmins(`${getPlayerName(client)} {MAINCOLOUR}set ${getPlayerName(targetClient)}'s{MAINCOLOUR} skin to {ALTCOLOUR}${getGameData().skins[getGame()][skinIndex][1]}`);
}
// ===========================================================================
function setPlayerHealthCommand(command, params, client) {
if(areParamsEmpty(params)) {
messagePlayerSyntax(client, getCommandSyntaxText(command));
return false;
}
//if(areThereEnoughParams(params, 3, " ")) {
// messagePlayerSyntax(client, getCommandSyntaxText(command));
// return false;
//}
let splitParams = params.split("");
let targetClient = getParam(params, " ", 1);
let health = getParam(params, " ", 2);
if(!targetClient) {
messagePlayerError(client, getLocaleString(client, "InvalidPlayer"));
return false;
}
setPlayerHealth(targetClient, health);
messageAdmins(`${getPlayerName(client)}{MAINCOLOUR} set ${getPlayerName(targetClient)}'s{MAINCOLOUR} health to {ALTCOLOUR}${health}`);
}
// ===========================================================================
function setPlayerArmourCommand(command, params, client) {
if(areParamsEmpty(params)) {
messagePlayerSyntax(client, getCommandSyntaxText(command));
return false;
}
let targetClient = getParam(params, " ", 1);
let armour = getParam(params, " ", 2);
if(!targetClient) {
messagePlayerError(client, getLocaleString(client, "InvalidPlayer"));
return false;
}
setPlayerArmour(targetClient, armour);
messageAdmins(`${getPlayerName(client)}{MAINCOLOUR} set ${getPlayerName(targetClient)}'s{MAINCOLOUR} armour to {ALTCOLOUR}${armour}`);
}
// ===========================================================================
function setPlayerInfiniteRunCommand(command, params, client) {
if(areParamsEmpty(params)) {
messagePlayerSyntax(client, getCommandSyntaxText(command));
return false;
}
let targetClient = getParam(params, " ", 1);
let state = getParam(params, " ", 2) || 0;
if(!targetClient) {
messagePlayerError(client, getLocaleString(client, "InvalidPlayer"));
return false;
}
if(isNaN(state)) {
messagePlayerError(client, `The infinite run state must be a number!`);
return false;
}
state = toInteger(state);
setPlayerInfiniteRun(targetClient, intToBool(state));
messageAdmins(`${getPlayerName(client)}{MAINCOLOUR} ${getBoolRedGreenInlineColour(state)}${(state) ? "enabled" : "disabled"}{MAINCOLOUR} infinite run for {ALTCOLOUR}${getPlayerName(targetClient)}`);
}
// ===========================================================================
function forcePlayerWantedLevelCommand(command, params, client) {
if(areParamsEmpty(params)) {
messagePlayerSyntax(client, getCommandSyntaxText(command));
return false;
}
let targetClient = getPlayerFromParams(getParam(params, " ", 1));
let wantedLevel = getParam(params, " ", 2);
if(!targetClient) {
messagePlayerError(client, getLocaleString(client, "InvalidPlayer"));
return false;
}
forcePlayerWantedLevel(targetClient, wantedLevel);
//messageAdmins(`${getPlayerName(client)} {MAINCOLOUR}set ${getPlayerName(targetClient)}'s {MAINCOLOUR}skin to {ALTCOLOUR}${getGameData().skins[getGame()][skinIndex][1]}`);
}
// ===========================================================================
@@ -998,13 +1126,13 @@ function getAllVehiclesOwnedByPlayerCommand(command, params, client) {
let targetClient = getPlayerFromParams(params);
if(!targetClient) {
messagePlayerError(client, "That player is not connected!");
messagePlayerError(client, getLocaleString(client, "InvalidPlayer"));
return false;
}
let vehicles = getAllVehiclesOwnedByPlayer(targetClient);
messagePlayerInfo(client, `{clanOrange}== {jobYellow}Player Vehicles {clanOrange}==========================`);
messagePlayerInfo(client, makeChatBoxSectionHeader(getLocaleString(client, "HeaderPlayerVehiclesList", getCharacterFullName(targetClient))));
for(let i in vehicles) {
messagePlayerNormal(client, `🚗 {vehiclePurple}[Vehicle Info] {MAINCOLOUR}ID: {ALTCOLOUR}${vehicles[i].index}, {MAINCOLOUR}DatabaseID: {ALTCOLOUR}${vehicles[i].databaseId}, {MAINCOLOUR}Type: {ALTCOLOUR}${getVehicleName(vehicles[i].vehicle)}[${vehicles[i].model}], {MAINCOLOUR}BuyPrice: {ALTCOLOUR}${vehicles[i].buyPrice}, {MAINCOLOUR}RentPrice: {ALTCOLOUR}${vehicles[i].rentPrice}, {MAINCOLOUR}Locked: {ALTCOLOUR}${getYesNoFromBool(vehicles[i].locked)}, {MAINCOLOUR}Engine: {ALTCOLOUR}${getYesNoFromBool(vehicles[i].engine)}`);
}
@@ -1021,13 +1149,13 @@ function getAllBusinessesOwnedByPlayerCommand(command, params, client) {
let targetClient = getPlayerFromParams(params);
if(!targetClient) {
messagePlayerError(client, "That player is not connected!");
messagePlayerError(client, getLocaleString(client, "InvalidPlayer"));
return false;
}
let businesses = getAllBusinessesOwnedByPlayer(targetClient);
messagePlayerInfo(client, `{clanOrange}== {jobYellow}Player Businesses {clanOrange}========================`);
messagePlayerInfo(client, makeChatBoxSectionHeader(getLocaleString(client, "HeaderPlayerBusinessesList", getCharacterFullName(targetClient))));
for(let i in businesses) {
messagePlayerNormal(client, `🏢 {businessBlue}[Business Info] {MAINCOLOUR}Name: {ALTCOLOUR}${businesses[i].name}, {MAINCOLOUR}Locked: {ALTCOLOUR}${getYesNoFromBool(intToBool(businesses[i].locked))}, {MAINCOLOUR}ID: {ALTCOLOUR}${businesses[i].index}/${businesses[i].databaseId}`);
}
@@ -1044,13 +1172,13 @@ function getAllHousesOwnedByPlayerCommand(command, params, client) {
let targetClient = getPlayerFromParams(params);
if(!targetClient) {
messagePlayerError(client, "That player is not connected!");
messagePlayerError(client, getLocaleString(client, "InvalidPlayer"));
return false;
}
let houses = getAllHousesOwnedByPlayer(targetClient);
messagePlayerInfo(client, `{clanOrange}== {jobYellow}Player Houses {clanOrange}============================`);
messagePlayerInfo(client, makeChatBoxSectionHeader(getLocaleString(client, "HeaderPlayerHousesList", getCharacterFullName(targetClient))));
for(let i in houses) {
messagePlayerNormal(client, `🏠 {houseGreen}[House Info] {MAINCOLOUR}Description: {ALTCOLOUR}${houses[i].description}, {MAINCOLOUR}Locked: {ALTCOLOUR}${getYesNoFromBool(intToBool(houses[i].locked))}, {MAINCOLOUR}ID: {ALTCOLOUR}${houses[i].index}/${houses[i].databaseId}`);
}
@@ -1067,15 +1195,32 @@ function forceAccountPasswordResetCommand(command, params, client) {
let targetClient = getPlayerFromParams(params);
if(!targetClient) {
messagePlayerError(client, "That player is not connected!");
messagePlayerError(client, getLocaleString(client, "InvalidPlayer"));
return false;
}
}
// ===========================================================================
function toggleSyncForElementsSpawnedByPlayer(command, params, client) {
if(areParamsEmpty(params)) {
messagePlayerSyntax(client, getCommandSyntaxText(command));
return false;
}
let targetClient = getPlayerFromParams(params);
if(!targetClient) {
messagePlayerError(client, getLocaleString(client, "InvalidPlayer"));
return false;
}
let houses = getAllHousesOwnedByPlayer(targetClient);
messagePlayerInfo(client, `{clanOrange}== {jobYellow}Player Houses {clanOrange}============================`);
for(let i in houses) {
messagePlayerNormal(client, `🏠 {houseGreen}[House Info] {MAINCOLOUR}Description: {ALTCOLOUR}${houses[i].description}, {MAINCOLOUR}Locked: {ALTCOLOUR}${getYesNoFromBool(intToBool(houses[i].locked))}, {MAINCOLOUR}ID: {ALTCOLOUR}${houses[i].index}/${houses[i].databaseId}`);
if(!hasBitFlag(getPlayerData(client).accountData.flags.moderation, getModerationFlagValue("DontSyncClientElements"))) {
getPlayerData(client).accountData.flags.moderation = addBitFlag(getPlayerData(client).accountData.flags.moderation, getModerationFlagValue("DontSyncClientElements"));
messageAdmins(`${getPlayerName(client)} {MAINCOLOUR}turned {softGreen}ON client element sync for {ALTCOLOUR}${getPlayerName(targetClient)}`);
} else {
getPlayerData(client).accountData.flags.moderation = removeBitFlag(getPlayerData(client).accountData.flags.moderation, getModerationFlagValue("DontSyncClientElements"));
messageAdmins(`${getPlayerName(client)} {MAINCOLOUR}turned {softRed}OFF client element sync for {ALTCOLOUR}${getPlayerName(targetClient)}`);
}
}

View File

@@ -20,7 +20,7 @@ function initServerScripts() {
initClanScript();
initHouseScript();
initChatScript();
initModerationScript();
initStaffScript();
initAccountScript();
initSubAccountScript();
initChatScript();

View File

@@ -122,8 +122,6 @@ function saveSubAccountToDatabase(subAccountData) {
["sacct_rot_z", subAccountData.spawnHeading],
["sacct_int", subAccountData.interior],
["sacct_vw", subAccountData.dimension],
["sacct_inhouse", (subAccountData.inHouse != 0) ? getHouseData(subAccountData.inHouse).databaseId : 0],
["sacct_inbusiness", (subAccountData.inBusiness != 0) ? getBusinessData(subAccountData.inBusiness).databaseId : 0],
["sacct_health", subAccountData.health],
["sacct_armour", subAccountData.armour],
["sacct_accent", subAccountData.accent],
@@ -233,13 +231,13 @@ function showCharacterSelectToClient(client) {
}
}
if(getServerConfig().useGUI && doesPlayerHaveGUIEnabled(client)) {
if(doesServerHaveGUIEnabled() && doesPlayerHaveGUIEnabled(client)) {
getPlayerData(client).currentSubAccount = 0;
logToConsole(LOG_DEBUG, `[VRR.SubAccount] Setting ${getPlayerDisplayForConsole(client)}'s character to ID ${getPlayerData(client).currentSubAccount}`);
let tempSubAccount = getPlayerData(client).subAccounts[0];
let ClanName = (tempSubAccount.clan != 0) ? getClanData(getClanIdFromDatabaseId(tempSubAccount.clan)).name : "None";
let lastPlayedText = (tempSubAccount.lastLogin != 0) ? `${msToTime(getCurrentUnixTimestamp()-tempSubAccount.lastLogin)} ago` : "Never";
showPlayerCharacterSelectGUI(client, tempSubAccount.firstName, tempSubAccount.lastName, tempSubAccount.cash, ClanName, lastPlayedText, tempSubAccount.skin);
showPlayerCharacterSelectGUI(client, tempSubAccount.firstName, tempSubAccount.lastName, tempSubAccount.cash, ClanName, lastPlayedText, getGameData().skins[getGame()][tempSubAccount.skin][0]);
//spawnPlayer(client, getServerConfig().characterSelectPedPosition, getServerConfig().characterSelectPedHeading, getPlayerCurrentSubAccount(client).skin, getServerConfig().characterSelectInterior, getServerConfig().characterSelectDimension);
//setTimeout(function() {
@@ -292,10 +290,10 @@ function checkNewCharacter(client, firstName, lastName) {
let subAccountData = createSubAccount(getPlayerData(client).accountData.databaseId, firstName, lastName);
if(!subAccountData) {
if(getServerConfig().useGUI && doesPlayerHaveGUIEnabled(client)) {
if(doesServerHaveGUIEnabled() && doesPlayerHaveGUIEnabled(client)) {
showPlayerNewCharacterFailedGUI(client, "Your character could not be created!");
} else {
messagePlayerAlert(client, "Your character could not be created!");
messagePlayerError(client, "Your character could not be created!");
}
messagePlayerAlert(client, `${getServerName()} staff have been notified of the problem and will fix it soon.`);
return false;
@@ -323,7 +321,7 @@ function checkPreviousCharacter(client) {
let clanName = (tempSubAccount.clan != 0) ? getClanData(getClanIdFromDatabaseId(tempSubAccount.clan)).name : "None";
let lastPlayedText = (tempSubAccount.lastLogin != 0) ? `${msToTime(getCurrentUnixTimestamp()-tempSubAccount.lastLogin)} ago` : "Never";
showPlayerCharacterSelectGUI(client, tempSubAccount.firstName, tempSubAccount.lastName, tempSubAccount.cash, clanName, lastPlayedText, tempSubAccount.skin);
showPlayerCharacterSelectGUI(client, tempSubAccount.firstName, tempSubAccount.lastName, tempSubAccount.cash, clanName, lastPlayedText, getGameData().skins[getGame()][tempSubAccount.skin][0]);
logToConsole(LOG_DEBUG, `[VRR.SubAccount] Setting ${getPlayerDisplayForConsole(client)}'s character to ID ${getPlayerData(client).currentSubAccount}`);
}
@@ -344,7 +342,7 @@ function checkNextCharacter(client) {
let clanName = (tempSubAccount.clan != 0) ? getClanData(getClanIdFromDatabaseId(tempSubAccount.clan)).name : "None";
let lastPlayedText = (tempSubAccount.lastLogin != 0) ? `${msToTime(getCurrentUnixTimestamp()-tempSubAccount.lastLogin)} ago` : "Never";
showPlayerCharacterSelectGUI(client, tempSubAccount.firstName, tempSubAccount.lastName, tempSubAccount.cash, clanName, lastPlayedText, tempSubAccount.skin);
showPlayerCharacterSelectGUI(client, tempSubAccount.firstName, tempSubAccount.lastName, tempSubAccount.cash, clanName, lastPlayedText, getGameData().skins[getGame()][tempSubAccount.skin][0]);
logToConsole(LOG_DEBUG, `[VRR.SubAccount] Setting ${getPlayerDisplayForConsole(client)}'s character to ID ${getPlayerData(client).currentSubAccount}`);
}
@@ -373,9 +371,11 @@ function selectCharacter(client, characterId = -1) {
//setPlayerCameraLookAt(client, getPosBehindPos(spawnPosition, spawnHeading, 5), spawnPosition);
getPlayerData(client).pedState = VRR_PEDSTATE_SPAWNING;
if(getGame() < VRR_GAME_MAFIA_ONE) {
if(getGame() < VRR_GAME_GTA_IV) {
spawnPlayer(client, spawnPosition, spawnHeading, getGameData().skins[getGame()][skin][0], spawnInterior, spawnDimension);
} else {
} else if(getGame() == VRR_GAME_GTA_IV) {
spawnPlayer(client, spawnPosition, spawnHeading, getGameData().skins[getGame()][skin][0], spawnInterior, spawnDimension);
} else if(getGame() >= VRR_GAME_MAFIA_ONE) {
spawnPlayer(client, getGameData().skins[getGame()][skin][0], spawnPosition, spawnHeading);
}
@@ -418,9 +418,8 @@ function newCharacterCommand(command, params, client) {
return false;
}
let splitParams = params.split(" ");
let firstName = splitParams[0];
let lastName = splitParams[1];
let firstName = getParam(params, " ", 1);
let lastName = getParam(params, " ", 2);
checkNewCharacter(client, firstName, lastName);
}
@@ -543,9 +542,8 @@ function forceFightStyleCommand(command, params, client) {
return false;
}
let splitParams = params.split(" ");
let targetClient = getPlayerFromParams(splitParams[0]);
let fightStyleId = getFightStyleFromParams(splitParams[1]);
let targetClient = getPlayerFromParams(getParam(params, " ", 1));
let fightStyleId = getFightStyleFromParams(getParam(params, " ", 2));
//if(!targetClient) {
// messagePlayerError(client, `Player not found!`);
@@ -568,13 +566,6 @@ function forceFightStyleCommand(command, params, client) {
return false;
}
if(!isPlayerAtGym(client)) {
if(!doesPlayerHaveStaffPermission(client, getStaffFlagValue("BasicModeration"))) {
messagePlayerError(client, `You need to be at a gym!`);
return false
}
}
getPlayerCurrentSubAccount(client).fightStyle = fightStyleId;
setPlayerFightStyle(client, fightStyleId);
messagePlayerSuccess(client, `You set ${getCharacterFullName(targetClient)}'s fight style to ${getGameData().fightStyles[getServerGame()][fightStyleId][0]}`)
@@ -606,9 +597,6 @@ function forcePlayerIntoSwitchCharacterScreen(client) {
getPlayerCurrentSubAccount(client).health = getPlayerHealth(client);
getPlayerCurrentSubAccount(client).armour = getPlayerArmour(client);
getPlayerCurrentSubAccount(client).inHouse = (isPlayerInAnyHouse(client) ? getPlayerHouse(client) : 0);
getPlayerCurrentSubAccount(client).inBusiness = (isPlayerInAnyBusiness(client) ? getPlayerBusiness(client) : 0);
logToConsole(client, `Saving ${getPlayerDisplayForConsole(client)}'s subaccount (${getCharacterFullName(client)} [${getPlayerData(client).currentSubAccount}/${getPlayerCurrentSubAccount(client).databaseId}] to database`)
saveSubAccountToDatabase(getPlayerCurrentSubAccount(client));

View File

@@ -74,6 +74,12 @@ function saveAllServerDataToDatabase() {
logToConsole(LOG_ERROR, `Could not save items to database: ${error}`);
}
try {
saveAllJobsToDatabase();
} catch(error) {
logToConsole(LOG_ERROR, `Could not save jobs to database: ${error}`);
}
try {
saveServerConfigToDatabase();
} catch(error) {
@@ -97,8 +103,16 @@ function initTimers() {
// ===========================================================================
function oneMinuteTimerFunction() {
logToConsole(LOG_DEBUG, `[VRR.Event] Checking server game time`);
checkServerGameTime();
logToConsole(LOG_DEBUG, `[VRR.Event] Checking rentable vehicles`);
vehicleRentCheck();
logToConsole(LOG_DEBUG, `[VRR.Event] Updating all player name tags`);
updateAllPlayerNameTags();
logToConsole(LOG_DEBUG, `[VRR.Event] Collecting all garbage`);
collectAllGarbage();
}
@@ -237,9 +251,18 @@ function showRandomTipToAllPlayers() {
function checkInactiveVehicleRespawns() {
let vehicles = getElementsByType(ELEMENT_VEHICLE);
for(let i in vehicles) {
if(getCurrentUnixTimestamp() - getVehicleData(vehicles[i]).respawnTime >= getGlobalConfig().vehicleInactiveRespawnDelay) {
respawnVehicle(vehicles[i]);
}
if(getVehicleData(vehicles[i] != false)) {
if(isVehicleUnoccupied(vehicles[i])) {
if(getVehicleData(vehicles[i]).lastActiveTime != false) {
if(getCurrentUnixTimestamp() - getVehicleData(vehicles[i]).lastActiveTime >= getGlobalConfig().vehicleInactiveRespawnDelay) {
respawnVehicle(vehicles[i]);
getVehicleData(vehicles[i]).lastActiveTime = false;
}
}
} else {
getVehicleData(vehicles[i]).lastActiveTime = getCurrentUnixTimestamp();
}
}
}
}

View File

@@ -1,235 +0,0 @@
// ===========================================================================
// Vortrex's Roleplay Resource
// https://github.com/VortrexFTW/gtac_roleplay
// ===========================================================================
// FILE: translate.js
// DESC: Provides translation functions
// TYPE: Server (JavaScript)
// ===========================================================================
let translationBaseURL = `http://api.mymemory.translated.net/get?de=example@example.com&q={0}&langpair={1}|{2}`;
let translationLanguages = [
["Abkhazian", "AB"],
["Afar", "AA"],
["Afrikaans", "AF"],
["Albanian", "SQ"],
["Amharic", "AM"],
["Arabic", "AR"],
["Armenian", "HY"],
["Assamese", "AS"],
["Aymara", "AY"],
["Azerbaijani", "AZ"],
["Bashkir", "BA"],
["Basque", "EU"],
["Bengali, Bangla", "BN"],
["Bhutani", "DZ"],
["Bihari", "BH"],
["Bislama", "BI"],
["Breton", "BR"],
["Bulgarian", "BG"],
["Burmese", "MY"],
["Byelorussian", "BE"],
["Cambodian", "KM"],
["Catalan", "CA"],
["Chinese", "ZH"],
["Corsican", "CO"],
["Croatian", "HR"],
["Czech", "CS"],
["Danish", "DA"],
["Dutch", "NL"],
["English", "EN"],
["Esperanto", "EO"],
["Estonian", "ET"],
["Faeroese", "FO"],
["Fiji", "FJ"],
["Finnish", "FI"],
["French", "FR"],
["Frisian", "FY"],
["Gaelic (Scots Gaelic)", "GD"],
["Galician", "GL"],
["Georgian", "KA"],
["German", "DE"],
["Greek", "EL"],
["Greenlandic", "KL"],
["Guarani", "GN"],
["Gujarati", "GU"],
["Hausa", "HA"],
["Hebrew", "IW"],
["Hindi", "HI"],
["Hungarian", "HU"],
["Icelandic", "IS"],
["Indonesian", "IN"],
["Interlingua", "IA"],
["Interlingue", "IE"],
["Inupiak", "IK"],
["Irish", "GA"],
["Italian", "IT"],
["Japanese", "JA"],
["Javanese", "JW"],
["Kannada", "KN"],
["Kashmiri", "KS"],
["Kazakh", "KK"],
["Kinyarwanda", "RW"],
["Kirghiz", "KY"],
["Kirundi", "RN"],
["Korean", "KO"],
["Kurdish", "KU"],
["Laothian", "LO"],
["Latin", "LA"],
["Latvian, Lettish", "LV"],
["Lingala", "LN"],
["Lithuanian", "LT"],
["Macedonian", "MK"],
["Malagasy", "MG"],
["Malay", "MS"],
["Malayalam", "ML"],
["Maltese", "MT"],
["Maori", "MI"],
["Marathi", "MR"],
["Moldavian", "MO"],
["Mongolian", "MN"],
["Nauru", "NA"],
["Nepali", "NE"],
["Norwegian", "NO"],
["Occitan", "OC"],
["Oriya", "OR"],
["Oromo, Afan", "OM"],
["Pashto, Pushto", "PS"],
["Persian", "FA"],
["Polish", "PL"],
["Portuguese", "PT"],
["Punjabi", "PA"],
["Quechua", "QU"],
["Rhaeto-Romance", "RM"],
["Romanian", "RO"],
["Russian", "RU"],
["Samoan", "SM"],
["Sangro", "SG"],
["Sanskrit", "SA"],
["Serbian", "SR"],
["Serbo-Croatian", "SH"],
["Sesotho", "ST"],
["Setswana", "TN"],
["Shona", "SN"],
["Sindhi", "SD"],
["Singhalese", "SI"],
["Siswati", "SS"],
["Slovak", "SK"],
["Slovenian", "SL"],
["Somali", "SO"],
["Spanish", "ES"],
["Sudanese", "SU"],
["Swahili", "SW"],
["Swedish", "SV"],
["Tagalog", "TL"],
["Tajik", "TG"],
["Tamil", "TA"],
["Tatar", "TT"],
["Tegulu", "TE"],
["Thai", "TH"],
["Tibetan", "BO"],
["Tigrinya", "TI"],
["Tonga", "TO"],
["Tsonga", "TS"],
["Turkish", "TR"],
["Turkmen", "TK"],
["Twi", "TW"],
["Ukrainian", "UK"],
["Urdu", "UR"],
["Uzbek", "UZ"],
["Vietnamese", "VI"],
["Volapuk", "VO"],
["Welsh", "CY"],
["Wolof", "WO"],
["Xhosa", "XH"],
["Yiddish", "JI"],
["Yoruba", "YO"],
["Zulu", "ZU"]
],
// ===========================================================================
translationCache = [];
// ===========================================================================
async function translateMessage(messageText, translateFrom = defaultLanguageId, translateTo = defaultLanguageId) {
if(translateFrom == translateTo) {
return messageText;
}
return new Promise(resolve => {
for(let i in translationCache[translateFrom][translateTo]) {
if(translationCache[translateFrom][translateTo][0] == messageText) {
logToConsole(LOG_DEBUG, `[Translate]: Using existing translation for ${translationLanguages[translateFrom][0]} to ${translationLanguages[translateTo][0]} - (${messageText}), (${translationCache[translateFrom][translateTo][1]})`);
resolve(translationCache[translateFrom][translateTo][1]);
}
}
let thisTranslationURL = translateURL.format(encodeURI(messageText), translationLanguages[translateFrom][1], translationLanguages[translateTo][1], scriptConfig.translatorEmailAddress);
httpGet(
thisTranslationURL,
"",
function(data) {
data = String(data).substr(0, String(data).lastIndexOf("}")+1);
let translationData = JSON.parse(data);
translationCache[translateFrom][translateTo].push([messageText, translationData.responseData.translatedText]);
resolve(translationData.responseData.translatedText);
},
function(data) {
}
);
});
}
// ===========================================================================
function addTranslationToCache(originalText, translatedText, fromLanguageId, toLanguageId) {
translationCache[fromLanguageId][toLanguageId].push([originalText, translatedText]);
return true;
}
// ===========================================================================
function formatTranslationURL(originalText, fromLanguageId, toLanguageId) {
return getServerData().translation.translationBaseURL.format(encodeURI(originalText), getLanguageShortCode(fromLanguageId), getLanguageShortCode(toLanguageId));
}
// ===========================================================================
function getLanguageShortCode(languageId) {
return translationLanguages[languageId][1];
}
// ===========================================================================
function getLanguageFullName(languageId) {
return translationLanguages[languageId][0];
}
// ===========================================================================
function getLanguageIdFromFullName(languageName) {
let languages = translationLanguages;
for(let i in languages) {
if(languages[i][0] == languageName) {
return i;
}
}
return false;
}
// ===========================================================================
function getLanguageIdFromShortCode(languageShortCode) {
let languages = translationLanguages;
for(let i in languages) {
if(languages[i][1] == languageShortCode) {
return i;
}
}
return false;
}
// ===========================================================================

File diff suppressed because it is too large Load Diff

View File

@@ -90,48 +90,27 @@ function saveVehicleToDatabase(vehicleDataId) {
}
}
let colour1RGBA = rgbaArrayFromToColour(tempVehicleData.colour1RGBA);
let colour2RGBA = rgbaArrayFromToColour(tempVehicleData.colour2RGBA);
let colour3RGBA = rgbaArrayFromToColour(tempVehicleData.colour3RGBA);
let colour4RGBA = rgbaArrayFromToColour(tempVehicleData.colour4RGBA);
let data = [
["veh_server", getServerId()],
["veh_model", tempVehicleData.model],
["veh_owner_type", tempVehicleData.ownerType],
["veh_owner_id", tempVehicleData.ownerId],
["veh_model", toInteger(tempVehicleData.model)],
["veh_owner_type", toInteger(tempVehicleData.ownerType)],
["veh_owner_id", toInteger(tempVehicleData.ownerId)],
["veh_locked", boolToInt(tempVehicleData.locked)],
["veh_spawn_lock", boolToInt(tempVehicleData.spawnLocked)],
["veh_buy_price", tempVehicleData.buyPrice],
["veh_rent_price", tempVehicleData.rentPrice],
["veh_pos_x", tempVehicleData.spawnPosition.x],
["veh_pos_y", tempVehicleData.spawnPosition.y],
["veh_pos_z", tempVehicleData.spawnPosition.z],
["veh_rot_z", tempVehicleData.spawnRotation],
["veh_col1", tempVehicleData.colour1],
["veh_col2", tempVehicleData.colour2],
["veh_col3", tempVehicleData.colour3],
["veh_col4", tempVehicleData.colour4],
["veh_col1_isrgb", tempVehicleData.colour1IsRGBA],
["veh_col2_isrgb", tempVehicleData.colour2IsRGBA],
["veh_col3_isrgb", tempVehicleData.colour3IsRGBA],
["veh_col4_isrgb", tempVehicleData.colour4IsRGBA],
["veh_col1_r", colour1RGBA[0]],
["veh_col1_g", colour1RGBA[1]],
["veh_col1_b", colour1RGBA[2]],
["veh_col1_a", colour1RGBA[3]],
["veh_col2_r", colour2RGBA[0]],
["veh_col2_g", colour2RGBA[1]],
["veh_col2_b", colour2RGBA[2]],
["veh_col2_a", colour2RGBA[3]],
["veh_col3_r", colour3RGBA[0]],
["veh_col3_g", colour3RGBA[1]],
["veh_col3_b", colour3RGBA[2]],
["veh_col3_a", colour3RGBA[3]],
["veh_col4_r", colour4RGBA[0]],
["veh_col4_g", colour4RGBA[1]],
["veh_col4_b", colour4RGBA[2]],
["veh_col4_a", colour4RGBA[3]],
["veh_buy_price", toInteger(tempVehicleData.buyPrice)],
["veh_rent_price", toInteger(tempVehicleData.rentPrice)],
["veh_pos_x", toFloat(tempVehicleData.spawnPosition.x)],
["veh_pos_y", toFloat(tempVehicleData.spawnPosition.y)],
["veh_pos_z", toFloat(tempVehicleData.spawnPosition.z)],
["veh_rot_z", toFloat(tempVehicleData.spawnRotation)],
["veh_col1", toInteger(tempVehicleData.colour1)],
["veh_col2", toInteger(tempVehicleData.colour2)],
["veh_col3", toInteger(tempVehicleData.colour3)],
["veh_col4", toInteger(tempVehicleData.colour4)],
["veh_col1_isrgb", boolToInt(tempVehicleData.colour1IsRGBA)],
["veh_col2_isrgb", boolToInt(tempVehicleData.colour2IsRGBA)],
["veh_col3_isrgb", boolToInt(tempVehicleData.colour3IsRGBA)],
["veh_col4_isrgb", boolToInt(tempVehicleData.colour4IsRGBA)],
["veh_extra1", tempVehicleData.extras[0]],
["veh_extra2", tempVehicleData.extras[1]],
["veh_extra3", tempVehicleData.extras[2]],
@@ -151,8 +130,9 @@ function saveVehicleToDatabase(vehicleDataId) {
["veh_damage_engine", toInteger(tempVehicleData.engineDamage)],
["veh_damage_visual", toInteger(tempVehicleData.visualDamage)],
["veh_dirt_level", toInteger(tempVehicleData.dirtLevel)],
["veh_int", tempVehicleData.interior],
["veh_vw", tempVehicleData.dimension],
["veh_int", toInteger(tempVehicleData.interior)],
["veh_vw", toInteger(tempVehicleData.dimension)],
["veh_livery", toInteger(tempVehicleData.livery)],
];
let dbQuery = null;
@@ -189,6 +169,10 @@ function spawnAllVehicles() {
// ===========================================================================
/**
* @param {Vehicle} vehicle - The vehicle element
* @return {VehicleData} The vehicles's data (class instance)
*/
function getVehicleData(vehicle) {
if(isVehicleObject(vehicle)) {
let dataIndex = getEntityData(vehicle, "vrr.dataSlot");
@@ -251,28 +235,49 @@ function createTemporaryVehicleCommand(command, params, client) {
// ===========================================================================
function getNearbyVehiclesCommand(command, params, client) {
let distance = getParam(params, " ", 1) || 10.0;
let nearbyVehicles = getElementsByTypeInRange(ELEMENT_VEHICLE, getPlayerPosition, distance);
if(nearbyVehicles.length == 0) {
messagePlayerAlert(client, getLocaleString(client, "NoVehiclesWithinRange", distance));
return false;
}
let vehiclesList = getServerData().radioStations.map(function(x) { return `{ALTCOLOUR}${getVehicleData(x).index}: {MAINCOLOUR}${getVehicleName(x)} {darkGrey}(${getDistance(getPlayerPosition(client), getVehiclePosition(x))} ${getLocaleString(client, "Meters")} ${getGroupedLocaleString(client, "CardinalDirections")[getCardinalDirection(getPlayerPosition(client), getVehiclePosition(x))]}})`; });
let chunkedList = splitArrayIntoChunks(vehiclesList, 4);
messagePlayerNormal(client, makeChatBoxSectionHeader(getLocaleString(client, "HeaderVehiclesInRangeList")));
for(let i in chunkedList) {
messagePlayerInfo(client, chunkedList[i].join(", "));
}
}
// ===========================================================================
function vehicleLockCommand(command, params, client) {
let vehicle = getClosestVehicle(getPlayerPosition(client));
if(!getPlayerVehicle(client) && getDistance(getVehiclePosition(vehicle), getPlayerPosition(client)) > getGlobalConfig().vehicleLockDistance) {
messagePlayerError(client, "You need to be in or near a vehicle!");
messagePlayerError(client, getLocaleString(client, "MustBeInOrNearVehicle"));
return false;
}
if(!getVehicleData(vehicle)) {
messagePlayerError(client, "This is a random traffic vehicle and commands can't be used for it.");
messagePlayerError(client, getLocaleString(client, "RandomVehicleCommandsDisabled"));
return false;
}
if(isPlayerInAnyVehicle(client)) {
vehicle = getPlayerVehicle(client);
if(!isPlayerInFrontVehicleSeat(client)) {
messagePlayerError(client, "You need to be in the front seat!");
messagePlayerError(client, getLocaleString(client, "MustBeInVehicleFrontSeat"));
return false;
}
} else {
if(!doesPlayerHaveVehicleKeys(client, vehicle)) {
messagePlayerError(client, "You don't have keys to this vehicle!");
messagePlayerError(client, getLocaleString(client, "DontHaveVehicleKey"));
return false;
}
}
@@ -292,17 +297,17 @@ function vehicleTrunkCommand(command, params, client) {
let behindPosition = getPosBehindPos(getVehiclePosition(vehicle), getVehicleHeading(vehicle), getGlobalConfig().vehicleTrunkDistance);
if(!getPlayerVehicle(client) && getDistance(behindPosition, getPlayerPosition(client)) > getGlobalConfig().vehicleTrunkDistance) {
messagePlayerError(client, "You need to be in or near a vehicle!");
messagePlayerError(client, getLocaleString(client, "MustBeInOrNearVehicle"));
return false;
}
if(!getVehicleData(vehicle)) {
messagePlayerError(client, "This is a random traffic vehicle and commands can't be used for it.");
messagePlayerError(client, getLocaleString(client, "RandomVehicleCommandsDisabled"));
return false;
}
if(!doesPlayerHaveVehicleKeys(client, vehicle)) {
messagePlayerError(client, "You don't have keys to this vehicle!");
messagePlayerError(client, getLocaleString(client, "DontHaveVehicleKey"));
return false;
}
@@ -317,19 +322,19 @@ function vehicleTrunkCommand(command, params, client) {
function vehicleLightsCommand(command, params, client) {
if(!getPlayerVehicle(client)) {
messagePlayerError(client, "You need to be in a vehicle!");
messagePlayerError(client, getLocaleString(client, "MustBeInAVehicle"));
return false;
}
let vehicle = getPlayerVehicle(client);
if(!getVehicleData(vehicle)) {
messagePlayerError(client, "This is a random traffic vehicle and commands can't be used for it.");
messagePlayerError(client, getLocaleString(client, "RandomVehicleCommandsDisabled"));
return false;
}
if(getPlayerVehicleSeat(client) > 1) {
messagePlayerError(client, "You need to be in the front seat!");
messagePlayerError(client, getLocaleString(client, "MustBeInVehicleFrontSeat"));
return false;
}
@@ -344,14 +349,14 @@ function vehicleLightsCommand(command, params, client) {
function deleteVehicleCommand(command, params, client) {
if(!getPlayerVehicle(client)) {
messagePlayerError(client, "You need to be in a vehicle!");
messagePlayerError(client, getLocaleString(client, "MustBeInAVehicle"));
return false;
}
let vehicle = getPlayerVehicle(client);
if(!getVehicleData(vehicle)) {
messagePlayerError(client, "This is a random traffic vehicle and can't be deleted.");
messagePlayerError(client, getLocaleString(client, "RandomVehicleCommandsDisabled"));
return false;
}
@@ -370,29 +375,30 @@ function deleteVehicleCommand(command, params, client) {
function vehicleEngineCommand(command, params, client) {
if(!getPlayerVehicle(client)) {
messagePlayerError(client, "You need to be in a vehicle!");
messagePlayerError(client, getLocaleString(client, "MustBeInAVehicle"));
return false;
}
if(getPlayerVehicleSeat(client) > 0) {
messagePlayerError(client, "You need to be the driver!");
messagePlayerError(client, getLocaleString(client, "MustBeInVehicleDriverSeat"));
return false;
}
let vehicle = getPlayerVehicle(client);
if(!doesPlayerHaveVehicleKeys(client, vehicle)) {
messagePlayerError(client, "You don't have keys to this vehicle!");
messagePlayerError(client, getLocaleString(client, "DontHaveVehicleKey"));
return false;
}
if(!getVehicleData(vehicle)) {
messagePlayerError(client, "This is a random traffic vehicle and commands can't be used on it.");
messagePlayerError(client, getLocaleString(client, "RandomVehicleCommandsDisabled"));
return false;
}
getVehicleData(vehicle).engine = !getVehicleData(vehicle).engine;
vehicle.engine = getVehicleData(vehicle).engine;
setEntityData(vehicle, "vrr.engine", getVehicleData(vehicle).engine, true);
getVehicleData(vehicle).needsSaved = true;
@@ -403,24 +409,24 @@ function vehicleEngineCommand(command, params, client) {
function vehicleSirenCommand(command, params, client) {
if(!getPlayerVehicle(client)) {
messagePlayerError(client, "You need to be in a vehicle!");
messagePlayerError(client, getLocaleString(client, "MustBeInAVehicle"));
return false;
}
let vehicle = getPlayerVehicle(client);
if(!getVehicleData(vehicle)) {
messagePlayerError(client, "This is a random traffic vehicle and commands can't be used for it.");
messagePlayerError(client, getLocaleString(client, "RandomVehicleCommandsDisabled"));
return false;
}
if(getPlayerVehicleSeat(client) > 1) {
messagePlayerError(client, "You need to be in the front seat!");
messagePlayerError(client, getLocaleString(client, "MustBeInVehicleFrontSeat"));
return false;
}
if(!doesPlayerHaveVehicleKeys(client, vehicle)) {
messagePlayerError(client, "You don't have keys to this vehicle!");
messagePlayerError(client, getLocaleString(client, "DontHaveVehicleKey"));
return false;
}
@@ -441,32 +447,19 @@ function vehicleAdminColourCommand(command, params, client) {
}
if(!getPlayerVehicle(client)) {
messagePlayerError(client, "You need to be in a vehicle!");
messagePlayerError(client, getLocaleString(client, "MustBeInAVehicle"));
return false;
}
let vehicle = getPlayerVehicle(client);
if(!getVehicleData(vehicle)) {
messagePlayerError(client, "This is a random traffic vehicle and commands can't be used for it.");
messagePlayerError(client, getLocaleString(client, "RandomVehicleCommandsDisabled"));
return false;
}
if(!isAtPayAndSpray(getVehiclePosition(vehicle))) {
if(!doesPlayerHaveStaffPermission(client, getStaffFlagValue("ManageVehicles"))) {
messagePlayerError(client, "You need to be at a pay-n-spray!");
return false;
}
}
if(getPlayerCurrentSubAccount(client).cash < getGlobalConfig().resprayVehicleCost) {
messagePlayerError(client, `You don't have enough money to respray the vehicle (need $${makeLargeNumberReadable(getGlobalConfig().resprayVehicleCost-getPlayerCurrentSubAccount(client).cash)} more!)`);
return false;
}
let splitParams = params.split(" ");
let colour1 = toInteger(splitParams[0]) || 0;
let colour2 = toInteger(splitParams[1]) || 0;
let colour1 = toInteger(getParam(params, " ", 1)) || 0;
let colour2 = toInteger(getParam(params, " ", 2)) || 0;
takePlayerCash(client, getGlobalConfig().resprayVehicleCost);
updatePlayerCash(client);
@@ -484,34 +477,23 @@ function vehicleAdminColourCommand(command, params, client) {
function vehicleAdminRepairCommand(command, params, client) {
if(!isPlayerInAnyVehicle(client)) {
messagePlayerError(client, "You need to be in a vehicle!");
logToConsole(LOG_DEBUG, `${getPlayerDisplayForConsole(client)} could not repair their vehicle. Reason: Not in a vehicle.`);
messagePlayerError(client, getLocaleString(client, "MustBeInAVehicle"));
return false;
}
let vehicle = getPlayerVehicle(client);
if(!getVehicleData(vehicle)) {
messagePlayerError(client, "This is a random traffic vehicle and commands can't be used for it.");
return false;
}
if(!isAtPayAndSpray(getVehiclePosition(vehicle))) {
if(!doesPlayerHaveStaffPermission(client, getStaffFlagValue("ManageVehicles"))) {
messagePlayerError(client, "You need to be at a pay-n-spray!");
return false;
}
}
if(getPlayerCurrentSubAccount(client).cash < getGlobalConfig().repairVehicleCost) {
messagePlayerError(client, `You don't have enough money to repair the vehicle (need $${makeLargeNumberReadable(getGlobalConfig().resprayVehicleCost-getPlayerCurrentSubAccount(client).cash)} more!)`);
logToConsole(LOG_DEBUG, `${getPlayerDisplayForConsole(client)} could not repair their ${getVehicleName(vehicle)} vehicle. Not a server vehicle.`);
messagePlayerError(client, getLocaleString(client, "RandomVehicleCommandsDisabled"));
return false;
}
logToConsole(LOG_DEBUG, `${getPlayerDisplayForConsole(client)} repaired their ${getVehicleName(vehicle)} vehicle`);
takePlayerCash(client, getGlobalConfig().repairVehicleCost);
repairVehicle(vehicle);
getVehicleData(vehicle).needsSaved = true;
meActionToNearbyPlayers(client, `repairs the ${getVehicleName(vehicle)}`);
}
@@ -519,30 +501,22 @@ function vehicleAdminRepairCommand(command, params, client) {
function vehicleAdminLiveryCommand(command, params, client) {
if(!isPlayerInAnyVehicle(client)) {
messagePlayerError(client, "You need to be in a vehicle!");
messagePlayerError(client, getLocaleString(client, "MustBeInAVehicle"));
return false;
}
let vehicle = getPlayerVehicle(client);
if(!getVehicleData(vehicle)) {
messagePlayerError(client, "This is a random traffic vehicle and commands can't be used for it.");
messagePlayerError(client, getLocaleString(client, "RandomVehicleCommandsDisabled"));
return false;
}
if(!isAtPayAndSpray(getVehiclePosition(vehicle))) {
if(!doesPlayerHaveStaffPermission(client, getStaffFlagValue("ManageVehicles"))) {
messagePlayerError(client, "You need to be at a pay-n-spray!");
return false;
}
}
if(getPlayerCurrentSubAccount(client).cash < getGlobalConfig().repairVehicleCost) {
messagePlayerError(client, `You don't have enough money to change the vehicle's livery (need $${makeLargeNumberReadable(getGlobalConfig().resprayVehicleCost-getPlayerCurrentSubAccount(client).cash)} more!)`);
return false;
}
let splitParams = params.split(" ");
let livery = toInteger(params) || 3;
takePlayerCash(client, getGlobalConfig().resprayVehicleCost);
@@ -560,54 +534,55 @@ function vehicleAdminLiveryCommand(command, params, client) {
function buyVehicleCommand(command, params, client) {
if(!isPlayerInAnyVehicle(client)) {
messagePlayerError(client, "You need to be in a vehicle!");
messagePlayerError(client, getLocaleString(client, "MustBeInAVehicle"));
return false;
}
let vehicle = getPlayerVehicle(client);
if(!getVehicleData(vehicle)) {
messagePlayerError(client, "This is a random traffic vehicle and commands can't be used for it.");
messagePlayerError(client, getLocaleString(client, "RandomVehicleCommandsDisabled"));
return false;
}
if(getVehicleData(vehicle).buyPrice <= 0) {
messagePlayerError(client, `This ${getVehicleName(vehicle)} is not for sale!`);
messagePlayerError(client, getLocaleString(client, "VehicleNotForSale"));
return false;
}
if(getPlayerCurrentSubAccount(client).cash < getVehicleData(vehicle).buyPrice) {
messagePlayerError(client, `You don't have enough money to buy this vehicle (need $${makeLargeNumberReadable(getVehicleData(vehicle).buyPrice-getPlayerCurrentSubAccount(client).cash)} more!)`);
messagePlayerError(client, getLocaleString(client, "VehiclePurchaseNotEnoughMoney"));
return false;
}
getPlayerData(client).buyingVehicle = vehicle;
getVehicleData(vehicle).engine = true;
vehicle.engine = true;
setEntityData(vehicle, "vrr.engine", getVehicleData(vehicle).engine, true);
getVehicleData(vehicle).needsSaved = true;
setPlayerBuyingVehicleState(client, VRR_VEHBUYSTATE_TESTDRIVE, vehicle.id, getVehiclePosition(vehicle));
meActionToNearbyPlayers(client, `receives a set of keys to test drive the ${getVehicleName(vehicle)} and starts the engine`);
messagePlayerInfo(client, `Drive the vehicle away from the dealership to buy it, or get out to cancel.`);
messagePlayerInfo(client, getLocaleString(client, "DealershipPurchaseTestDrive"));
}
// ===========================================================================
function rentVehicleCommand(command, params, client) {
if(!isPlayerInAnyVehicle(client)) {
messagePlayerError(client, "You need to be in a vehicle!");
messagePlayerError(client, getLocaleString(client, "MustBeInAVehicle"));
return false;
}
let vehicle = getPlayerVehicle(client);
if(!getVehicleData(vehicle)) {
messagePlayerError(client, "This is a random traffic vehicle and commands can't be used for it.");
messagePlayerError(client, getLocaleString(client, "RandomVehicleCommandsDisabled"));
return false;
}
if(getVehicleData(vehicle).rentPrice <= 0) {
messagePlayerError(client, `This ${getVehicleName(vehicle)} is not for rent!`);
messagePlayerError(client, getLocaleString(client, "VehicleNotForRent"));
return false;
}
@@ -648,7 +623,7 @@ function rentVehicleCommand(command, params, client) {
// ===========================================================================
function enterVehicleAsPassengerCommand(command, params, client) {
triggerNetworkEvent("vrr.passenger", client);
sendNetworkEventToPlayer("vrr.passenger", client);
}
// ===========================================================================
@@ -791,7 +766,7 @@ function setVehicleRankCommand(command, params, client) {
if(getVehicleData(vehicle).ownerType == VRR_VEHOWNER_CLAN) {
rankId = getClanRankFromParams(getVehicleData(vehicle).ownerId, params);
if(!getClanRankData(getVehicleData(vehicle).ownerId, rankId)) {
messagePlayerError(client, "Clan rank not found!");
messagePlayerError(client, getLocaleString(client, "ClanRankInvalid"));
return false;
}
getVehicleData(vehicle).rank = getClanRankData(getVehicleData(vehicle).ownerId, rankId).databaseId;
@@ -1101,6 +1076,20 @@ function reloadAllVehiclesCommand(command, params, client) {
getVehicleData(vehicle).needsSaved = true;
}
// ===========================================================================
function respawnVehicleCommand(command, params, client) {
if(isPlayerInAnyVehicle(client)) {
removeAllOccupantsFromVehicle(getPlayerVehicle(client));
respawnVehicle(getPlayerVehicle(client));
}
setAllVehicleIndexes();
messagePlayerSuccess(client, `Your vehicle has been respawned`);
}
// ===========================================================================
function respawnAllVehiclesCommand(command, params, client) {
@@ -1139,12 +1128,71 @@ function respawnEmptyVehiclesCommand(command, params, client) {
// ===========================================================================
function respawnJobVehiclesCommand(command, params, client) {
for(let i in getServerData().vehicles) {
if(getServerData().vehicles[i].ownerType == VRR_VEHOWNER_JOB) {
respawnVehicle(getServerData().vehicles[i].vehicle);
}
}
messageAdminAction(`All job vehicles have been respawned by an admin!`);
}
// ===========================================================================
function respawnClanVehiclesCommand(command, params, client) {
for(let i in getServerData().vehicles) {
if(getServerData().vehicles[i].ownerType == VRR_VEHOWNER_CLAN) {
respawnVehicle(getServerData().vehicles[i].vehicle);
}
}
messageAdminAction(`All clan vehicles have been respawned by an admin!`);
}
// ===========================================================================
function respawnPlayerVehiclesCommand(command, params, client) {
for(let i in getServerData().vehicles) {
if(getServerData().vehicles[i].ownerType == VRR_VEHOWNER_PLAYER) {
respawnVehicle(getServerData().vehicles[i].vehicle);
}
}
messageAdminAction(`All player-owned vehicles have been respawned by an admin!`);
}
// ===========================================================================
function respawnPublicVehiclesCommand(command, params, client) {
for(let i in getServerData().vehicles) {
if(getServerData().vehicles[i].ownerType == VRR_VEHOWNER_PUBLIC) {
respawnVehicle(getServerData().vehicles[i].vehicle);
}
}
messageAdminAction(`All public vehicles have been respawned by an admin!`);
}
// ===========================================================================
function respawnBusinessVehiclesCommand(command, params, client) {
for(let i in getServerData().vehicles) {
if(getServerData().vehicles[i].ownerType == VRR_VEHOWNER_BIZ) {
respawnVehicle(getServerData().vehicles[i].vehicle);
}
}
messageAdminAction(`All business-owned vehicles have been respawned by an admin!`);
}
// ===========================================================================
function stopRentingVehicle(client) {
let vehicle = getPlayerData(client).rentingVehicle;
getPlayerData(client).rentingVehicle = false;
getVehicleData(vehicle).rentedBy = false;
respawnVehicle(vehicle);
getVehicleData(vehicle).needsSaved = true;
}
@@ -1164,6 +1212,7 @@ function respawnVehicle(vehicle) {
destroyElement(vehicle);
vehicles[i].vehicle = false;
let newVehicle = spawnVehicle(vehicles[i]);
vehicles[i].vehicle = newVehicle;
setEntityData(newVehicle, "vrr.dataSlot", i, false);
@@ -1186,6 +1235,10 @@ function spawnVehicle(vehicleData) {
return false;
}
setVehicleHeading(vehicle, vehicleData.spawnRotation)
addToWorld(vehicle);
vehicleData.vehicle = vehicle;
if(isGameFeatureSupported("vehicleColours")) {
if(vehicleData.colour1IsRGBA && vehicleData.colour2IsRGBA) {
vehicle.setRGBColours(vehicleData.colour1RGBA, vehicleData.colour2RGBA);
@@ -1203,8 +1256,7 @@ function spawnVehicle(vehicleData) {
setVehicleEngine(vehicle, false);
logToConsole(LOG_VERBOSE, `[VRR.Vehicle]: Setting vehicle ${vehicle.id}'s engine to OFF`);
} else {
setVehicleEngine(vehicle, intToBool(vehicleData.engine));
logToConsole(LOG_VERBOSE, `[VRR.Vehicle]: Setting vehicle ${vehicle.id}'s engine to ${toUpperCase(getOnOffFromBool(getVehicleEngineState(vehicle)))}`);
setVehicleEngine(vehicle, intToBool(vehicleData.engine));logToConsole(LOG_VERBOSE, `[VRR.Vehicle]: Setting vehicle ${vehicle.id}'s engine to ${toUpperCase(getOnOffFromBool(getVehicleEngine(vehicle)))}`);
}
if(typeof vehicle.locked != "undefined") {
@@ -1213,14 +1265,15 @@ function spawnVehicle(vehicleData) {
}
setElementDimension(vehicle.dimension, vehicleData.dimension);
vehicleData.vehicle = vehicle;
//setVehicleHealth(vehicle, 1000);
repairVehicle(vehicle);
setEntityData(vehicle, "vrr.livery", vehicleData.livery, true);
setEntityData(vehicle, "vrr.upgrades", vehicleData.extras, true);
setEntityData(vehicle, "vrr.interior", vehicleData.interior, true);
forcePlayerToSyncElementProperties(null, vehicle);
setEntityData(vehicle, "vrr.engine", vehicleData.engine, true);
forcePlayerToSyncElementProperties(null, vehicle);
return vehicle;
}
@@ -1358,62 +1411,77 @@ function createPermanentVehicle(modelIndex, position, heading, interior = 0, dim
// ===========================================================================
function checkVehicleBuying(client) {
if(!isPlayerLoggedIn(client)) {
return false;
}
function processVehiclePurchasing() {
if(!getGlobalConfig().useServerSideVehiclePurchaseCheck) {
return false;
}
if(!isPlayerSpawned(client)) {
return false;
}
getClients().forEach((client) => {
if(!isPlayerLoggedIn(client)) {
setPlayerBuyingVehicleState(client, VRR_VEHBUYSTATE_NONE, null, null);
return false;
}
if(!getPlayerData(client)) {
return false;
}
if(!isPlayerSpawned(client)) {
setPlayerBuyingVehicleState(client, VRR_VEHBUYSTATE_NONE, null, null);
return false;
}
if(!getPlayerData(client).buyingVehicle) {
return false;
}
if(!getPlayerData(client)) {
setPlayerBuyingVehicleState(client, VRR_VEHBUYSTATE_NONE, null, null);
return false;
}
if(!isPlayerInAnyVehicle(client)) {
if(getPlayerData(client).buyingVehicle != false) {
messagePlayerError(client, "You canceled the vehicle purchase by exiting the vehicle!");
respawnVehicle(getPlayerData(client).buyingVehicle);
getPlayerData(client).buyingVehicle = false;
}
return false;
}
if(!getPlayerData(client).buyingVehicle) {
setPlayerBuyingVehicleState(client, VRR_VEHBUYSTATE_NONE, null, null);
return false;
}
if(getDistance(getVehiclePosition(getPlayerData(client).buyingVehicle), getVehicleData(getPlayerData(client).buyingVehicle).spawnPosition) > getGlobalConfig().buyVehicleDriveAwayDistance) {
if(getPlayerCurrentSubAccount(client).cash < getVehicleData(getPlayerData(client).buyingVehicle).buyPrice) {
messagePlayerError(client, "You don't have enough money to buy this vehicle!");
respawnVehicle(getPlayerData(client).buyingVehicle);
getPlayerData(client).buyingVehicle = false;
return false;
}
if(!isPlayerInAnyVehicle(client)) {
if(getPlayerData(client).buyingVehicle != false) {
messagePlayerError(client, getLocaleString(client, "DealershipPurchaseExitedVehicle"));
respawnVehicle(getPlayerData(client).buyingVehicle);
getPlayerData(client).buyingVehicle = false;
setPlayerBuyingVehicleState(client, VRR_VEHBUYSTATE_NONE, null, null);
}
return false;
}
createNewDealershipVehicle(getVehicleData(getPlayerData(client).buyingVehicle).model, getVehicleData(getPlayerData(client).buyingVehicle).spawnPosition, getVehicleData(getPlayerData(client).buyingVehicle).spawnRotation, getVehicleData(getPlayerData(client).buyingVehicle).buyPrice, getVehicleData(getPlayerData(client).buyingVehicle).ownerId);
takePlayerCash(client, getVehicleData(getPlayerData(client).buyingVehicle).buyPrice);
updatePlayerCash(client);
getVehicleData(getPlayerData(client).buyingVehicle).ownerId = getPlayerCurrentSubAccount(client).databaseId;
getVehicleData(getPlayerData(client).buyingVehicle).ownerType = VRR_VEHOWNER_PLAYER;
getVehicleData(getPlayerData(client).buyingVehicle).buyPrice = 0;
getVehicleData(getPlayerData(client).buyingVehicle).rentPrice = 0;
getVehicleData(getPlayerData(client).buyingVehicle).spawnLocked = false;
getPlayerData(client).buyingVehicle = false;
messagePlayerSuccess(client, "This vehicle is now yours! It will save wherever you leave it.");
return true;
}
if(getDistance(getVehiclePosition(getPlayerData(client).buyingVehicle), getVehicleData(getPlayerData(client).buyingVehicle).spawnPosition) > getGlobalConfig().buyVehicleDriveAwayDistance) {
if(getPlayerCurrentSubAccount(client).cash < getVehicleData(getPlayerData(client).buyingVehicle).buyPrice) {
messagePlayerError(client, getLocaleString(client, "VehiclePurchaseNotEnoughMoney"));
respawnVehicle(getPlayerData(client).buyingVehicle);
getPlayerData(client).buyingVehicle = false;
setPlayerBuyingVehicleState(client, VRR_VEHBUYSTATE_NONE, null, null);
return false;
}
createNewDealershipVehicle(getVehicleData(getPlayerData(client).buyingVehicle).model, getVehicleData(getPlayerData(client).buyingVehicle).spawnPosition, getVehicleData(getPlayerData(client).buyingVehicle).spawnRotation, getVehicleData(getPlayerData(client).buyingVehicle).buyPrice, getVehicleData(getPlayerData(client).buyingVehicle).ownerId);
takePlayerCash(client, getVehicleData(getPlayerData(client).buyingVehicle).buyPrice);
updatePlayerCash(client);
getVehicleData(getPlayerData(client).buyingVehicle).ownerId = getPlayerCurrentSubAccount(client).databaseId;
getVehicleData(getPlayerData(client).buyingVehicle).ownerType = VRR_VEHOWNER_PLAYER;
getVehicleData(getPlayerData(client).buyingVehicle).buyPrice = 0;
getVehicleData(getPlayerData(client).buyingVehicle).rentPrice = 0;
getVehicleData(getPlayerData(client).buyingVehicle).spawnLocked = false;
getPlayerData(client).buyingVehicle = false;
messagePlayerSuccess(client, getLocaleString(client, "VehiclePurchaseComplete"));
setPlayerBuyingVehicleState(client, VRR_VEHBUYSTATE_NONE, null, null);
return true;
}
});
return false;
}
// ===========================================================================
function checkVehicleBurning() {
function processVehicleBurning() {
let vehicles = getElementsByType(ELEMENT_VEHICLE);
for(let i in vehicles) {
if(vehicles[i].health <= 250) {
return false;
}
}
}
@@ -1451,17 +1519,19 @@ function setAllVehicleIndexes() {
// ===========================================================================
function doesVehicleHaveMegaphone(vehicle) {
if(getJobType(getJobIdFromDatabaseId(getVehicleData(vehicle).job)) == VRR_JOB_POLICE) {
return true;
}
if(getVehicleData(vehicle).ownerType == VRR_VEHOWNER_JOB) {
if(getJobType(getJobIdFromDatabaseId(getVehicleData(vehicle).ownerId)) == VRR_JOB_POLICE) {
return true;
}
if(getJobType(getJobIdFromDatabaseId(getVehicleData(vehicle).job)) == VRR_JOB_FIRE) {
return true;
}
if(getJobType(getJobIdFromDatabaseId(getVehicleData(vehicle).ownerId)) == VRR_JOB_FIRE) {
return true;
}
if(getJobType(getJobIdFromDatabaseId(getVehicleData(vehicle).job)) == VRR_JOB_MEDICAL) {
return true;
}
if(getJobType(getJobIdFromDatabaseId(getVehicleData(vehicle).ownerId)) == VRR_JOB_MEDICAL) {
return true;
}
}
return false;
}
@@ -1497,4 +1567,20 @@ function getClosestTaxi(position) {
.reduce((i, j) => ((i.position.distance(position) <= j.position.distance(position)) ? i : j));
}
// ===========================================================================
function getVehicleTrunkPosition(vehicle) {
return getPosBehindPos(getVehiclePosition(vehicle), getVehicleHeading(vehicle), getGlobalConfig().vehicleTrunkRearDistance);
}
// ===========================================================================
function removeAllOccupantsFromVehicle(vehicle) {
for(let i = 0 ; i <= 16 ; i++) {
if(vehicle.getOccupant(i) != null) {
removePlayerFromVehicle(vehicle.getOccupant(i));
}
}
}
// ===========================================================================