Merge branch 'nightly' into 1.4.0-prep
This commit is contained in:
@@ -8,8 +8,9 @@
|
||||
// ===========================================================================
|
||||
|
||||
function makePedPlayAnimation(pedId, animGroup, animId, animType, animSpeed, loop, loopNoControl, freezeLastFrame, returnToOriginalPosition, freezePlayer) {
|
||||
logToConsole(LOG_DEBUG, `[VRR.Animation] Playing animation ${animGroup}/${animId} for ped ${pedId}`);
|
||||
if(getGame() < VRR_GAME_GTA_IV) {
|
||||
if(animType == VRR_ANIMTYPE_ADD) {
|
||||
if(animType == VRR_ANIMTYPE_NORMAL || animType == VRR_ANIMTYPE_SURRENDER) {
|
||||
if(getGame() == VRR_GAME_GTA_VC || getGame() == VRR_GAME_GTA_SA) {
|
||||
getElementFromId(pedId).clearAnimations();
|
||||
} else {
|
||||
@@ -17,7 +18,7 @@ function makePedPlayAnimation(pedId, animGroup, animId, animType, animSpeed, loo
|
||||
}
|
||||
getElementFromId(pedId).addAnimation(animGroup, animId);
|
||||
|
||||
if(getElementFromId(pedId) == localPlayer && !freezePlayer) {
|
||||
if(getElementFromId(pedId) == localPlayer && freezePlayer == true) {
|
||||
inAnimation = true;
|
||||
setLocalPlayerControlState(false, false);
|
||||
localPlayer.collisionsEnabled = false;
|
||||
@@ -25,9 +26,6 @@ function makePedPlayAnimation(pedId, animGroup, animId, animType, animSpeed, loo
|
||||
} else if(animType == VRR_ANIMTYPE_BLEND) {
|
||||
getElementFromId(pedId).position = getElementFromId(pedId).position;
|
||||
getElementFromId(pedId).blendAnimation(animGroup, animId, animSpeed);
|
||||
} else if(animType == VRR_ANIMTYPE_MOVEADD) {
|
||||
getElementFromId(pedId).position = getElementFromId(pedId).position;
|
||||
getElementFromId(pedId).blendAnimation(animGroup, animId, animSpeed);
|
||||
}
|
||||
} else {
|
||||
natives.requestAnims(animGroup);
|
||||
@@ -40,9 +38,37 @@ function makePedPlayAnimation(pedId, animGroup, animId, animType, animSpeed, loo
|
||||
function forcePedAnimation(pedId, animGroup, animId, animType, animSpeed, loop, loopNoControl, freezeLastFrame, returnToOriginalPosition) {
|
||||
if(getGame() < VRR_GAME_GTA_IV) {
|
||||
forcedAnimation = [animGroup, animId];
|
||||
setLocalPlayerControlState(false, false);
|
||||
getElementFromId(pedId).position = getElementFromId(pedId).position;
|
||||
getElementFromId(pedId).addAnimation(animGroup, animId);
|
||||
|
||||
if(getElementFromId(pedId) == localPlayer) {
|
||||
inAnimation = true;
|
||||
setLocalPlayerControlState(false, false);
|
||||
localPlayer.collisionsEnabled = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// ===========================================================================
|
||||
|
||||
function makePedStopAnimation(pedId) {
|
||||
if(getElementFromId(pedId) == null) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if(getGame() != VRR_GAME_GTA_IV) {
|
||||
if(getGame() == VRR_GAME_GTA_VC || getGame() == VRR_GAME_GTA_SA) {
|
||||
getElementFromId(pedId).clearAnimations();
|
||||
} else {
|
||||
getElementFromId(pedId).clearObjective();
|
||||
}
|
||||
}
|
||||
|
||||
if(getElementFromId(pedId) == localPlayer) {
|
||||
if(getGame() != VRR_GAME_GTA_IV) {
|
||||
localPlayer.collisionsEnabled = true;
|
||||
}
|
||||
setLocalPlayerControlState(true, false);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
65
scripts/client/content.js
Normal file
65
scripts/client/content.js
Normal file
@@ -0,0 +1,65 @@
|
||||
// ===========================================================================
|
||||
// Vortrex's Roleplay Resource
|
||||
// https://github.com/VortrexFTW/gtac_roleplay
|
||||
// ===========================================================================
|
||||
// FILE: content.js
|
||||
// DESC: Provides connection to extra content resources
|
||||
// TYPE: Client (JavaScript)
|
||||
// ===========================================================================
|
||||
|
||||
function getCustomImage(imageName) {
|
||||
let contentResource = findResourceByName(getGameData().extraContentResource[getGame()]);
|
||||
if(contentResource != null) {
|
||||
if(contentResource.isStarted) {
|
||||
let image = contentResource.exports.getCustomImage(imageName);
|
||||
if(image != null) {
|
||||
return image;
|
||||
}
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
// ===========================================================================
|
||||
|
||||
function getCustomFont(fontName) {
|
||||
let contentResource = findResourceByName(getGameData().extraContentResource[getGame()]);
|
||||
if(contentResource != null) {
|
||||
if(contentResource.isStarted) {
|
||||
let font = contentResource.exports.getCustomFont(fontName);
|
||||
if(font != null) {
|
||||
return font;
|
||||
}
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
// ===========================================================================
|
||||
|
||||
function getCustomAudio(audioName) {
|
||||
let contentResource = findResourceByName(getGameData().extraContentResource[getGame()]);
|
||||
if(contentResource != null) {
|
||||
if(contentResource.isStarted) {
|
||||
let audioFile = contentResource.exports.getCustomAudio(audioName);
|
||||
if(audioFile != null) {
|
||||
return audioFile;
|
||||
}
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
// ===========================================================================
|
||||
|
||||
function playCustomAudio(audioName, volume = 0.5, loop = false) {
|
||||
let contentResource = findResourceByName(getGameData().extraContentResource[getGame()]);
|
||||
if(contentResource != null) {
|
||||
if(contentResource.isStarted) {
|
||||
contentResource.exports.playCustomAudio(audioName, volume, loop);
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
// ===========================================================================
|
||||
@@ -102,6 +102,8 @@ function onProcess(event, deltaTime) {
|
||||
function onKeyUp(event, keyCode, scanCode, keyModifiers) {
|
||||
processSkinSelectKeyPress(keyCode);
|
||||
//processKeyDuringAnimation();
|
||||
processGUIKeyPress(keyCode);
|
||||
processToggleGUIKeyPress(keyCode);
|
||||
}
|
||||
|
||||
// ===========================================================================
|
||||
@@ -143,7 +145,7 @@ function onElementStreamIn(event, element) {
|
||||
function onLocalPlayerExitedVehicle(event, vehicle, seat) {
|
||||
logToConsole(LOG_DEBUG, `[VRR.Event] Local player exited vehicle`);
|
||||
if(areServerElementsSupported()) {
|
||||
triggerNetworkEvent("vrr.onPlayerExitVehicle", getVehicleForNetworkEvent(vehicle), seat);
|
||||
sendNetworkEventToServer("vrr.onPlayerExitVehicle", getVehicleForNetworkEvent(vehicle), seat);
|
||||
}
|
||||
|
||||
if(inVehicleSeat) {
|
||||
@@ -158,7 +160,7 @@ function onLocalPlayerEnteredVehicle(event, vehicle, seat) {
|
||||
logToConsole(LOG_DEBUG, `[VRR.Event] Local player entered vehicle`);
|
||||
|
||||
if(areServerElementsSupported()) {
|
||||
triggerNetworkEvent("vrr.onPlayerEnterVehicle", getVehicleForNetworkEvent(vehicle), seat);
|
||||
sendNetworkEventToServer("vrr.onPlayerEnterVehicle", getVehicleForNetworkEvent(vehicle), seat);
|
||||
|
||||
if(inVehicleSeat == 0) {
|
||||
if(inVehicle.owner != -1) {
|
||||
@@ -183,7 +185,7 @@ function onPedInflictDamage(event, damagedEntity, damagerEntity, weaponId, healt
|
||||
if(damagedEntity == localPlayer) {
|
||||
//if(!weaponDamageEnabled[damagerEntity.name]) {
|
||||
event.preventDefault();
|
||||
triggerNetworkEvent("vrr.weaponDamage", damagerEntity.name, weaponId, pedPiece, healthLoss);
|
||||
sendNetworkEventToServer("vrr.weaponDamage", damagerEntity.name, weaponId, pedPiece, healthLoss);
|
||||
//}
|
||||
}
|
||||
}
|
||||
@@ -194,7 +196,7 @@ function onPedInflictDamage(event, damagedEntity, damagerEntity, weaponId, healt
|
||||
|
||||
function onLocalPlayerEnterSphere(event, sphere) {
|
||||
logToConsole(LOG_DEBUG, `[VRR.Event] Local player entered sphere`);
|
||||
if(sphere == jobRouteStopSphere) {
|
||||
if(sphere == jobRouteLocationSphere) {
|
||||
enteredJobRouteSphere();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -9,9 +9,10 @@
|
||||
|
||||
var app = {};
|
||||
|
||||
let robotoFont = "Roboto";
|
||||
let mainFont = "Roboto"; // "Arial"
|
||||
|
||||
let mainLogoPath = (typeof gta == "undefined") ? "files/images/mafiac-logo.png" : "files/images/gtac-logo.png";
|
||||
//let mainLogoPath = (typeof gta == "undefined") ? "files/images/mafiac-logo.png" : "files/images/gtac-logo.png";
|
||||
let mainLogoPath = "files/images/server-logo.png";
|
||||
|
||||
let primaryColour = [200, 200, 200];
|
||||
let secondaryColour = [16, 16, 16];
|
||||
@@ -28,6 +29,12 @@ let textInputAlpha = 180;
|
||||
|
||||
let guiReady = false;
|
||||
|
||||
let guiSubmitKey = false;
|
||||
let guiLeftKey = false;
|
||||
let guiRightKey = false;
|
||||
let guiUpKey = false;
|
||||
let guiDownKey = false;
|
||||
|
||||
// ===========================================================================
|
||||
|
||||
let placesOfOrigin = [
|
||||
@@ -70,21 +77,21 @@ function initGUI() {
|
||||
initInfoDialogGUI();
|
||||
initErrorDialogGUI();
|
||||
initYesNoDialogGUI();
|
||||
initResetPasswordGUI();
|
||||
initChangePasswordGUI();
|
||||
initTwoFactorAuthenticationGUI();
|
||||
initListGUI();
|
||||
initResetPasswordGUI();
|
||||
initChangePasswordGUI();
|
||||
|
||||
closeAllWindows();
|
||||
guiReady = true;
|
||||
|
||||
logToConsole(LOG_DEBUG, `[VRR.GUI] All GUI created successfully!`);
|
||||
triggerNetworkEvent("vrr.guiReady", true);
|
||||
sendNetworkEventToServer("vrr.guiReady", true);
|
||||
};
|
||||
|
||||
// ===========================================================================
|
||||
|
||||
let closeAllWindows = function() {
|
||||
function closeAllWindows() {
|
||||
logToConsole(LOG_DEBUG, `[VRR.GUI] Closing all GUI windows`);
|
||||
infoDialog.window.shown = false;
|
||||
yesNoDialog.window.shown = false;
|
||||
@@ -98,47 +105,64 @@ let closeAllWindows = function() {
|
||||
resetPassword.window.shown = false;
|
||||
passwordChange.window.shown = false;
|
||||
mexui.setInput(false);
|
||||
mexui.focusedControl = false;
|
||||
|
||||
guiSubmitKey = false;
|
||||
guiLeftKey = false;
|
||||
guiRightKey = false;
|
||||
guiUpKey = false;
|
||||
guiDownKey = false;
|
||||
}
|
||||
|
||||
// ===========================================================================
|
||||
|
||||
let isAnyGUIActive = function() {
|
||||
function isAnyGUIActive() {
|
||||
if(!guiReady) {
|
||||
if(infoDialog.window.shown) {
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
if(yesNoDialog.window.shown) {
|
||||
return true;
|
||||
}
|
||||
if(infoDialog.window.shown == true) {
|
||||
return true;
|
||||
}
|
||||
|
||||
if(errorDialog.window.shown) {
|
||||
return true;
|
||||
}
|
||||
if(yesNoDialog.window.shown == true) {
|
||||
return true;
|
||||
}
|
||||
|
||||
if(register.window.shown) {
|
||||
return true;
|
||||
}
|
||||
if(errorDialog.window.shown == true) {
|
||||
return true;
|
||||
}
|
||||
|
||||
if(login.window.shown) {
|
||||
return true;
|
||||
}
|
||||
if(register.window.shown == true) {
|
||||
return true;
|
||||
}
|
||||
|
||||
if(newCharacter.window.shown) {
|
||||
return true;
|
||||
}
|
||||
if(login.window.shown == true) {
|
||||
return true;
|
||||
}
|
||||
|
||||
if(characterSelect.window.shown) {
|
||||
return true;
|
||||
}
|
||||
if(newCharacter.window.shown == true) {
|
||||
return true;
|
||||
}
|
||||
|
||||
if(twoFactorAuth.window.shown) {
|
||||
return true;
|
||||
}
|
||||
if(characterSelect.window.shown == true) {
|
||||
return true;
|
||||
}
|
||||
|
||||
if(listDialog.window.shown) {
|
||||
return true;
|
||||
}
|
||||
if(twoFactorAuth.window.shown == true) {
|
||||
return true;
|
||||
}
|
||||
|
||||
if(listDialog.window.shown == true) {
|
||||
return true;
|
||||
}
|
||||
|
||||
if(resetPassword.window.shown == true) {
|
||||
return true;
|
||||
}
|
||||
|
||||
if(passwordChange.window.shown == true) {
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
@@ -146,49 +170,49 @@ let isAnyGUIActive = function() {
|
||||
|
||||
// ===========================================================================
|
||||
|
||||
addNetworkHandler("vrr.showCharacterSelect", function(firstName, lastName, cash, clan, lastPlayed, skinId) {
|
||||
addNetworkEventHandler("vrr.showCharacterSelect", function(firstName, lastName, cash, clan, lastPlayed, skinId) {
|
||||
logToConsole(LOG_DEBUG, `[VRR.GUI] Received request from server to show character selection window`);
|
||||
showCharacterSelectGUI(firstName, lastName, cash, clan, lastPlayed, skinId);
|
||||
});
|
||||
|
||||
// ===========================================================================
|
||||
|
||||
addNetworkHandler("vrr.switchCharacterSelect", function(firstName, lastName, cash, clan, lastPlayed, skinId) {
|
||||
addNetworkEventHandler("vrr.switchCharacterSelect", function(firstName, lastName, cash, clan, lastPlayed, skinId) {
|
||||
logToConsole(LOG_DEBUG, `[VRR.GUI] Received request from server to update character selection window with new info`);
|
||||
switchCharacterSelectGUI(firstName, lastName, cash, clan, lastPlayed, skinId);
|
||||
});
|
||||
|
||||
// ===========================================================================
|
||||
|
||||
addNetworkHandler("vrr.showError", function(errorMessage, errorTitle) {
|
||||
addNetworkEventHandler("vrr.showError", function(errorMessage, errorTitle) {
|
||||
logToConsole(LOG_DEBUG, `[VRR.GUI] Received request from server to show error window`);
|
||||
showError(errorMessage, errorTitle);
|
||||
});
|
||||
|
||||
// ===========================================================================
|
||||
|
||||
addNetworkHandler("vrr.showPrompt", function(promptMessage, promptTitle) {
|
||||
addNetworkEventHandler("vrr.showPrompt", function(promptMessage, promptTitle) {
|
||||
logToConsole(LOG_DEBUG, `[VRR.GUI] Received request from server to show prompt window`);
|
||||
showYesNoPromptGUI(promptMessage, promptTitle);
|
||||
});
|
||||
|
||||
// ===========================================================================
|
||||
|
||||
addNetworkHandler("vrr.showInfo", function(infoMessage) {
|
||||
addNetworkEventHandler("vrr.showInfo", function(infoMessage) {
|
||||
logToConsole(LOG_DEBUG, `[VRR.GUI] Received request from server to show info dialog`);
|
||||
showInfo(infoMessage);
|
||||
});
|
||||
|
||||
// ===========================================================================
|
||||
|
||||
addNetworkHandler("vrr.loginSuccess", function() {
|
||||
addNetworkEventHandler("vrr.loginSuccess", function() {
|
||||
logToConsole(LOG_DEBUG, `[VRR.GUI] Received signal of successful login from server`);
|
||||
loginSuccess();
|
||||
});
|
||||
|
||||
// ===========================================================================
|
||||
|
||||
addNetworkHandler("vrr.characterSelectSuccess", function() {
|
||||
addNetworkEventHandler("vrr.characterSelectSuccess", function() {
|
||||
logToConsole(LOG_DEBUG, `[VRR.GUI] Received signal of successful character selection from server`);
|
||||
characterSelectSuccess();
|
||||
setChatWindowEnabled(true);
|
||||
@@ -196,35 +220,49 @@ addNetworkHandler("vrr.characterSelectSuccess", function() {
|
||||
|
||||
// ===========================================================================
|
||||
|
||||
addNetworkHandler("vrr.loginFailed", function(remainingAttempts) {
|
||||
addNetworkEventHandler("vrr.loginFailed", function(remainingAttempts) {
|
||||
logToConsole(LOG_DEBUG, `[VRR.GUI] Received signal of failed login from server`);
|
||||
loginFailed(remainingAttempts);
|
||||
});
|
||||
|
||||
// ===========================================================================
|
||||
|
||||
addNetworkHandler("vrr.registrationSuccess", function() {
|
||||
addNetworkEventHandler("vrr.registrationSuccess", function() {
|
||||
logToConsole(LOG_DEBUG, `[VRR.GUI] Received signal of successful registration from server`);
|
||||
registrationSuccess();
|
||||
});
|
||||
|
||||
// ===========================================================================
|
||||
|
||||
addNetworkHandler("vrr.registrationFailed", function(errorMessage) {
|
||||
addNetworkEventHandler("vrr.registrationFailed", function(errorMessage) {
|
||||
logToConsole(LOG_DEBUG, `[VRR.GUI] Received signal of failed registration from server`);
|
||||
registrationFailed(errorMessage);
|
||||
});
|
||||
|
||||
// ===========================================================================
|
||||
|
||||
addNetworkHandler("vrr.newCharacterFailed", function(errorMessage) {
|
||||
addNetworkEventHandler("vrr.newCharacterFailed", function(errorMessage) {
|
||||
logToConsole(LOG_DEBUG, `[VRR.GUI] Received signal of failed registration from server`);
|
||||
newCharacterFailed(errorMessage);
|
||||
});
|
||||
|
||||
// ===========================================================================
|
||||
|
||||
addNetworkHandler("vrr.guiColour", function(red1, green1, blue1, red2, green2, blue2, red3, green3, blue3) {
|
||||
addNetworkEventHandler("vrr.changePassword", function() {
|
||||
logToConsole(LOG_DEBUG, `[VRR.GUI] Received signal to change password from server`);
|
||||
showChangePasswordGUI();
|
||||
});
|
||||
|
||||
// ===========================================================================
|
||||
|
||||
addNetworkEventHandler("vrr.showResetPasswordCodeInput", function() {
|
||||
logToConsole(LOG_DEBUG, `[VRR.GUI] Received signal to input reset password code from server`);
|
||||
resetPasswordCodeInputGUI();
|
||||
});
|
||||
|
||||
// ===========================================================================
|
||||
|
||||
addNetworkEventHandler("vrr.guiColour", function(red1, green1, blue1, red2, green2, blue2, red3, green3, blue3) {
|
||||
logToConsole(LOG_DEBUG, `[VRR.GUI] Received new GUI colours from server: ${red1}, ${green1}, ${blue1} / ${red2}, ${green2}, ${blue2} / ${red3}, ${green3}, ${blue3}`);
|
||||
primaryColour = [red1, green1, blue1];
|
||||
secondaryColour = [red2, green2, blue2];
|
||||
@@ -236,10 +274,10 @@ addNetworkHandler("vrr.guiColour", function(red1, green1, blue1, red2, green2, b
|
||||
|
||||
// ===========================================================================
|
||||
|
||||
addNetworkHandler("vrr.guiInit", function() {
|
||||
addNetworkEventHandler("vrr.guiInit", function() {
|
||||
logToConsole(LOG_DEBUG, `[VRR.GUI] Initializing MexUI app`);
|
||||
//initGUI();
|
||||
triggerNetworkEvent("vrr.guiReady", true);
|
||||
sendNetworkEventToServer("vrr.guiReady", true);
|
||||
});
|
||||
|
||||
// ===========================================================================
|
||||
@@ -247,6 +285,37 @@ addNetworkHandler("vrr.guiInit", function() {
|
||||
function hideAllGUI() {
|
||||
closeAllWindows();
|
||||
setChatWindowEnabled(true);
|
||||
guiSubmitKey = false;
|
||||
}
|
||||
|
||||
// ===========================================================================
|
||||
// ===========================================================================
|
||||
|
||||
function processGUIKeyPress(keyCode) {
|
||||
if(!isAnyGUIActive()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if(keyCode == SDLK_RETURN || keyCode == SDLK_RETURN2) {
|
||||
if(guiSubmitKey != false) {
|
||||
guiSubmitKey();
|
||||
}
|
||||
} else if(keyCode == SDLK_LEFT) {
|
||||
if(guiLeftKey != false) {
|
||||
guiLeftKey();
|
||||
}
|
||||
} else if(keyCode == SDLK_RIGHT) {
|
||||
if(guiRightKey != false) {
|
||||
guiRightKey();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// ===========================================================================
|
||||
|
||||
function processToggleGUIKeyPress(keyCode) {
|
||||
if(keyCode == disableGUIKey) {
|
||||
sendNetworkEventToServer("vrr.toggleGUI");
|
||||
}
|
||||
}
|
||||
|
||||
// ===========================================================================
|
||||
|
||||
@@ -47,12 +47,12 @@ function initTwoFactorAuthenticationGUI() {
|
||||
},
|
||||
});
|
||||
|
||||
twoFactorAuth.codeLabel = twoFactorAuth.window.text(20, 135, 260, 20, 'Please enter the code from your authenticator app!', {
|
||||
twoFactorAuth.codeLabel = twoFactorAuth.window.text(20, 135, 260, 20, 'Please enter the code sent to your email!', {
|
||||
main: {
|
||||
textSize: 10.0,
|
||||
textAlign: 0.5,
|
||||
textColour: toColour(200, 200, 200, 255),
|
||||
textFont: robotoFont,
|
||||
textFont: mainFont,
|
||||
},
|
||||
focused: {
|
||||
borderColour: toColour(0, 0, 0, 0),
|
||||
@@ -65,7 +65,7 @@ function initTwoFactorAuthenticationGUI() {
|
||||
borderColour: toColour(primaryColour[0], primaryColour[1], primaryColour[2], textInputAlpha),
|
||||
textColour: toColour(200, 200, 200, 255),
|
||||
textSize: 10.0,
|
||||
textFont: robotoFont,
|
||||
textFont: mainFont,
|
||||
},
|
||||
caret: {
|
||||
lineColour: toColour(255, 255, 255, 255),
|
||||
@@ -73,7 +73,7 @@ function initTwoFactorAuthenticationGUI() {
|
||||
placeholder: {
|
||||
textColour: toColour(200, 200, 200, 150),
|
||||
textSize: 10.0,
|
||||
textFont: robotoFont,
|
||||
textFont: mainFont,
|
||||
},
|
||||
focused: {
|
||||
borderColour: toColour(primaryColour[0], primaryColour[1], primaryColour[2], 255),
|
||||
@@ -86,7 +86,7 @@ function initTwoFactorAuthenticationGUI() {
|
||||
backgroundColour: toColour(primaryColour[0], primaryColour[1], primaryColour[2], buttonAlpha),
|
||||
textColour: toColour(0, 0, 0, 255),
|
||||
textSize: 10.0,
|
||||
textFont: robotoFont,
|
||||
textFont: mainFont,
|
||||
textAlign: 0.5,
|
||||
},
|
||||
focused: {
|
||||
@@ -105,6 +105,8 @@ function showTwoFactorAuthGUI() {
|
||||
setChatWindowEnabled(false);
|
||||
mexui.setInput(true);
|
||||
twoFactorAuth.window.shown = true;
|
||||
mexui.focusedControl = twoFactorAuth.codeInput;
|
||||
guiSubmitKey = checkTwoFactorAuth;
|
||||
}
|
||||
|
||||
// ===========================================================================
|
||||
@@ -127,7 +129,7 @@ function twoFactorAuthSuccess() {
|
||||
|
||||
function checkTwoFactorAuth() {
|
||||
logToConsole(LOG_DEBUG, `[VRR.GUI] Checking two-factor authentication with server ...`);
|
||||
triggerNetworkEvent("vrr.checkTwoFactorAuth", twoFactorAuth.codeInput.lines[0]);
|
||||
sendNetworkEventToServer("vrr.2fa", twoFactorAuth.codeInput.lines[0]);
|
||||
}
|
||||
|
||||
// ===========================================================================
|
||||
@@ -13,7 +13,6 @@ let passwordChange = {
|
||||
messageLabel: null,
|
||||
passwordInput: null,
|
||||
confirmPasswordInput: null,
|
||||
verificationCodeInput: null,
|
||||
submitButton: null,
|
||||
};
|
||||
|
||||
@@ -40,30 +39,30 @@ function initChangePasswordGUI() {
|
||||
passwordChange.window.titleBarIconSize = toVector2(0,0);
|
||||
passwordChange.window.titleBarHeight = 0;
|
||||
|
||||
passwordChange.window.image(115, 10, 65, 65, mainLogoPath, {
|
||||
passwordChange.window.image(85, -10, 140, 140, mainLogoPath, {
|
||||
focused: {
|
||||
borderColour: toColour(0, 0, 0, 0),
|
||||
},
|
||||
});
|
||||
|
||||
passwordChange.messageLabel = passwordChange.window.text(20, 75, 260, 20, 'Check your email for a verification code!', {
|
||||
passwordChange.messageLabel = passwordChange.window.text(20, 75, 260, 20, 'Enter a new password', {
|
||||
main: {
|
||||
textSize: 10.0,
|
||||
textAlign: 0.5,
|
||||
textColour: toColour(200, 200, 200, 255),
|
||||
textFont: robotoFont,
|
||||
textFont: mainFont,
|
||||
},
|
||||
focused: {
|
||||
borderColour: toColour(0, 0, 0, 0),
|
||||
},
|
||||
});
|
||||
|
||||
passwordChange.passwordInput = passwordChange.window.textInput(20, 100, 260, 25, '', {
|
||||
passwordChange.passwordInput = passwordChange.window.textInput(20, 130, 260, 25, '', {
|
||||
main: {
|
||||
backgroundColour: toColour(0, 0, 0, 120),
|
||||
textColour: toColour(200, 200, 200, 255),
|
||||
textSize: 10.0,
|
||||
textFont: robotoFont,
|
||||
textFont: mainFont,
|
||||
},
|
||||
caret: {
|
||||
lineColour: toColour(255, 255, 255, 255),
|
||||
@@ -72,18 +71,18 @@ function initChangePasswordGUI() {
|
||||
backgroundColour: toColour(0, 0, 0, 120),
|
||||
textColour: toColour(200, 200, 200, 200),
|
||||
textSize: 10.0,
|
||||
textFont: robotoFont,
|
||||
textFont: mainFont,
|
||||
}
|
||||
});
|
||||
passwordChange.passwordInput.masked = true;
|
||||
passwordChange.passwordInput.placeholder = "Password";
|
||||
|
||||
passwordChange.confirmPasswordInput = passwordChange.window.textInput(20, 130, 260, 25, '', {
|
||||
passwordChange.confirmPasswordInput = passwordChange.window.textInput(20, 160, 260, 25, '', {
|
||||
main: {
|
||||
backgroundColour: toColour(0, 0, 0, 120),
|
||||
textColour: toColour(200, 200, 200, 255),
|
||||
textSize: 10.0,
|
||||
textFont: robotoFont,
|
||||
textFont: mainFont,
|
||||
},
|
||||
caret: {
|
||||
lineColour: toColour(255, 255, 255, 255),
|
||||
@@ -92,37 +91,18 @@ function initChangePasswordGUI() {
|
||||
backgroundColour: toColour(0, 0, 0, 120),
|
||||
textColour: toColour(200, 200, 200, 200),
|
||||
textSize: 10.0,
|
||||
textFont: robotoFont,
|
||||
textFont: mainFont,
|
||||
}
|
||||
});
|
||||
passwordChange.confirmPasswordInput.masked = true;
|
||||
passwordChange.confirmPasswordInput.placeholder = "Confirm password";
|
||||
|
||||
passwordChange.verificationCodeInput = passwordChange.window.textInput(20, 160, 260, 25, '', {
|
||||
main: {
|
||||
backgroundColour: toColour(0, 0, 0, 120),
|
||||
textColour: toColour(200, 200, 200, 255),
|
||||
textSize: 10.0,
|
||||
textFont: robotoFont,
|
||||
},
|
||||
caret: {
|
||||
lineColour: toColour(255, 255, 255, 255),
|
||||
},
|
||||
placeholder: {
|
||||
backgroundColour: toColour(0, 0, 0, 120),
|
||||
textColour: toColour(200, 200, 200, 200),
|
||||
textSize: 10.0,
|
||||
textFont: robotoFont,
|
||||
}
|
||||
});
|
||||
passwordChange.verificationCodeInput.placeholder = "Verification Code (From Email)";
|
||||
|
||||
passwordChange.submitButton = passwordChange.window.button(20, 195, 260, 30, 'CHANGE PASSWORD', {
|
||||
main: {
|
||||
backgroundColour: toColour(primaryColour[0], primaryColour[1], primaryColour[2], buttonAlpha),
|
||||
textColour: toColour(255, 255, 255, 255),
|
||||
textSize: 12.0,
|
||||
textFont: robotoFont,
|
||||
textFont: mainFont,
|
||||
textAlign: 0.5,
|
||||
},
|
||||
focused: {
|
||||
@@ -147,7 +127,7 @@ function passwordChangeFailed(errorMessage) {
|
||||
|
||||
function checkChangePassword() {
|
||||
logToConsole(LOG_DEBUG, `[VRR.GUI] Checking password change with server ...`);
|
||||
triggerNetworkEvent("vrr.checkChangePassword", passwordChange.passwordInput.lines[0], passwordChange.confirmPasswordInput.lines[0], passwordChange.verificationCodeInput.lines[0]);
|
||||
sendNetworkEventToServer("vrr.checkChangePassword", passwordChange.passwordInput.lines[0], passwordChange.confirmPasswordInput.lines[0]);
|
||||
}
|
||||
|
||||
// ===========================================================================
|
||||
@@ -158,12 +138,15 @@ function showChangePasswordGUI() {
|
||||
setChatWindowEnabled(false);
|
||||
mexui.setInput(true);
|
||||
passwordChange.window.shown = true;
|
||||
mexui.focusedControl = passwordChange.passwordInput;
|
||||
guiSubmitKey = checkChangePassword;
|
||||
}
|
||||
|
||||
// ===========================================================================
|
||||
|
||||
function passwordChangeSuccess() {
|
||||
logToConsole(LOG_DEBUG, `[VRR.GUI] Server reports password change was successful`);
|
||||
guiSubmitKey = false;
|
||||
closeAllWindows();
|
||||
}
|
||||
|
||||
|
||||
@@ -28,24 +28,26 @@ function initCharacterSelectGUI() {
|
||||
main: {
|
||||
backgroundColour: toColour(secondaryColour[0], secondaryColour[1], secondaryColour[2], windowAlpha),
|
||||
},
|
||||
title: {
|
||||
textSize: 11.0,
|
||||
textColour: toColour(primaryTextColour[0], primaryTextColour[1], primaryTextColour[2], 255),
|
||||
backgroundColour: toColour(primaryColour[0], primaryColour[1], primaryColour[2], windowTitleAlpha),
|
||||
},
|
||||
icon: {
|
||||
textSize: 0.0,
|
||||
textColour: toColour(0, 0, 0, 0),
|
||||
backgroundColour: toColour(0, 0, 0, 0),
|
||||
}
|
||||
title: {
|
||||
textSize: 12.0,
|
||||
textColour: toColour(0, 0, 0, 0),
|
||||
backgroundColour: toColour(primaryColour[0], primaryColour[1], primaryColour[2], windowTitleAlpha),
|
||||
},
|
||||
icon: {
|
||||
textSize: 12.0,
|
||||
textColour: toColour(0, 0, 0, 0),
|
||||
backgroundColour: toColour(primaryColour[0], primaryColour[1], primaryColour[2], windowTitleAlpha),
|
||||
}
|
||||
});
|
||||
characterSelect.window.titleBarIconSize = toVector2(0,0);
|
||||
characterSelect.window.titleBarHeight = 0;
|
||||
|
||||
characterSelect.nameText = characterSelect.window.text(5, 40, 200, 25, 'Lastname, Firstname', {
|
||||
main: {
|
||||
textSize: 14.0,
|
||||
textAlign: 0.0,
|
||||
textColour: toColour(255, 255, 255, 220),
|
||||
textFont: robotoFont,
|
||||
textFont: mainFont,
|
||||
},
|
||||
focused: {
|
||||
borderColour: toColour(0, 0, 0, 0),
|
||||
@@ -57,7 +59,7 @@ function initCharacterSelectGUI() {
|
||||
textSize: 9.0,
|
||||
textAlign: 0.0,
|
||||
textColour: toColour(255, 255, 255, 220),
|
||||
textFont: robotoFont,
|
||||
textFont: mainFont,
|
||||
},
|
||||
focused: {
|
||||
borderColour: toColour(0, 0, 0, 0),
|
||||
@@ -69,7 +71,7 @@ function initCharacterSelectGUI() {
|
||||
textSize: 9.0,
|
||||
textAlign: 0.0,
|
||||
textColour: toColour(255, 255, 255, 220),
|
||||
textFont: robotoFont,
|
||||
textFont: mainFont,
|
||||
},
|
||||
focused: {
|
||||
borderColour: toColour(0, 0, 0, 0),
|
||||
@@ -81,19 +83,19 @@ function initCharacterSelectGUI() {
|
||||
textSize: 9.0,
|
||||
textAlign: 0.0,
|
||||
textColour: toColour(255, 255, 255, 220),
|
||||
textFont: robotoFont,
|
||||
textFont: mainFont,
|
||||
},
|
||||
focused: {
|
||||
borderColour: toColour(0, 0, 0, 0),
|
||||
}
|
||||
});
|
||||
|
||||
characterSelect.selectCharacterButton = characterSelect.window.button(85, 130, 260, 25, 'SELECT', {
|
||||
characterSelect.selectCharacterButton = characterSelect.window.button(85, 130, 260, 25, 'PLAY', {
|
||||
main: {
|
||||
backgroundColour: toColour(primaryColour[0], primaryColour[1], primaryColour[2], buttonAlpha),
|
||||
textColour: toColour(primaryTextColour[0], primaryTextColour[1], primaryTextColour[2], 255),
|
||||
textSize: 12.0,
|
||||
textFont: robotoFont,
|
||||
textSize: 10.0,
|
||||
textFont: mainFont,
|
||||
textAlign: 0.5,
|
||||
},
|
||||
focused: {
|
||||
@@ -105,8 +107,8 @@ function initCharacterSelectGUI() {
|
||||
main: {
|
||||
backgroundColour: toColour(primaryColour[0], primaryColour[1], primaryColour[2], buttonAlpha),
|
||||
textColour: toColour(primaryTextColour[0], primaryTextColour[1], primaryTextColour[2], 255),
|
||||
textSize: 12.0,
|
||||
textFont: robotoFont,
|
||||
textSize: 10.0,
|
||||
textFont: mainFont,
|
||||
textAlign: 0.5,
|
||||
},
|
||||
focused: {
|
||||
@@ -114,12 +116,12 @@ function initCharacterSelectGUI() {
|
||||
}
|
||||
}, showNewCharacter);
|
||||
|
||||
characterSelect.previousCharacterButton = characterSelect.window.button(5, 130, 75, 25, '< PREV', {
|
||||
characterSelect.previousCharacterButton = characterSelect.window.button(5, 130, 75, 25, 'PREV', {
|
||||
main: {
|
||||
backgroundColour: toColour(primaryColour[0], primaryColour[1], primaryColour[2], buttonAlpha),
|
||||
textColour: toColour(primaryTextColour[0], primaryTextColour[1], primaryTextColour[2], 255),
|
||||
textSize: 10.0,
|
||||
textFont: robotoFont,
|
||||
textFont: mainFont,
|
||||
textAlign: 0.5,
|
||||
},
|
||||
focused: {
|
||||
@@ -127,12 +129,12 @@ function initCharacterSelectGUI() {
|
||||
}
|
||||
}, selectPreviousCharacter);
|
||||
|
||||
characterSelect.nextCharacterButton = characterSelect.window.button(350, 130, 75, 25, 'NEXT >', {
|
||||
characterSelect.nextCharacterButton = characterSelect.window.button(350, 130, 75, 25, 'NEXT', {
|
||||
main: {
|
||||
backgroundColour: toColour(primaryColour[0], primaryColour[1], primaryColour[2], buttonAlpha),
|
||||
textColour: toColour(primaryTextColour[0], primaryTextColour[1], primaryTextColour[2], 255),
|
||||
textSize: 10.0,
|
||||
textFont: robotoFont,
|
||||
textFont: mainFont,
|
||||
textAlign: 0.5,
|
||||
},
|
||||
focused: {
|
||||
@@ -168,33 +170,28 @@ function showCharacterSelectGUI(firstName, lastName, cash, clan, lastPlayed, ski
|
||||
function showNewCharacter() {
|
||||
closeAllWindows();
|
||||
logToConsole(LOG_DEBUG, `[VRR.GUI] Showing new character dialog window`);
|
||||
setChatWindowEnabled(false);
|
||||
mexui.setInput(true);
|
||||
setHUDEnabled(false);
|
||||
newCharacter.window.shown = true;
|
||||
|
||||
showSmallGameMessage(`If you don't have a mouse cursor, press ${toUpperCase(getKeyNameFromId(disableGUIKey))} to disable GUI`, COLOUR_WHITE, 7500);
|
||||
showNewCharacterGUI();
|
||||
}
|
||||
|
||||
// ===========================================================================
|
||||
|
||||
function selectNextCharacter() {
|
||||
logToConsole(LOG_DEBUG, `[VRR.GUI] Requesting next character info from server for character select window`);
|
||||
triggerNetworkEvent("vrr.nextCharacter");
|
||||
sendNetworkEventToServer("vrr.nextCharacter");
|
||||
}
|
||||
|
||||
// ===========================================================================
|
||||
|
||||
function selectPreviousCharacter() {
|
||||
logToConsole(LOG_DEBUG, `[VRR.GUI] Requesting previous character info from server for character select window`);
|
||||
triggerNetworkEvent("vrr.previousCharacter");
|
||||
sendNetworkEventToServer("vrr.previousCharacter");
|
||||
}
|
||||
|
||||
// ===========================================================================
|
||||
|
||||
function selectThisCharacter() {
|
||||
logToConsole(LOG_DEBUG, `[VRR.GUI] Tell server the current shown character was selected in character select window`);
|
||||
triggerNetworkEvent("vrr.selectCharacter");
|
||||
sendNetworkEventToServer("vrr.selectCharacter");
|
||||
}
|
||||
|
||||
// ===========================================================================
|
||||
@@ -207,8 +204,16 @@ function switchCharacterSelectGUI(firstName, lastName, cash, clan, lastPlayed, s
|
||||
characterSelect.cashText.text = `Money: $${cash}`;
|
||||
characterSelect.clanText.text = `Clan: ${clan}`;
|
||||
characterSelect.lastPlayedText.text = `Last Played: ${lastPlayed}`;
|
||||
characterSelect.skinImage = characterSelect.window.image(310, 32, 100, 90, "files/images/skins/none.png");
|
||||
|
||||
if(characterSelect.skinImage != null) {
|
||||
characterSelect.skinImage.remove();
|
||||
}
|
||||
characterSelect.skinImage = (getGame() == VRR_GAME_GTA_III) ? characterSelect.window.image(310, 32, 100, 90, `files/images/skins/gta3/${getSkinImage(skinId)}.png`) : characterSelect.window.image(310, 32, 100, 90, "files/images/skins/none.png");
|
||||
|
||||
characterSelect.window.shown = true;
|
||||
guiSubmitKey = selectThisCharacter;
|
||||
guiLeftKey = selectPreviousCharacter;
|
||||
guiRightKey = selectNextCharacter;
|
||||
}
|
||||
|
||||
// ===========================================================================
|
||||
@@ -218,4 +223,16 @@ function characterSelectSuccess() {
|
||||
closeAllWindows();
|
||||
}
|
||||
|
||||
// ===========================================================================
|
||||
|
||||
function getSkinImage(skinId, gameId = getGame()) {
|
||||
if(skinId < 10) {
|
||||
return `Skin_00${skinId}.png`;
|
||||
} else if(skinId > 10 && skinId < 100) {
|
||||
return `Skin_0${skinId}.png`;
|
||||
} else if(skinId > 100) {
|
||||
return `Skin_${skinId}.png`;
|
||||
}
|
||||
}
|
||||
|
||||
// ===========================================================================
|
||||
@@ -5,4 +5,14 @@
|
||||
// FILE: clanmgr.js
|
||||
// DESC: Provides clan manager GUI
|
||||
// TYPE: Client (JavaScript)
|
||||
// ===========================================================================
|
||||
// ===========================================================================
|
||||
|
||||
let clanManager = {
|
||||
window: null,
|
||||
generalTab: null,
|
||||
ranksTab: null,
|
||||
membersTab: null,
|
||||
vehiclesTab: null,
|
||||
businessesTab: null,
|
||||
housesTab: null,
|
||||
};
|
||||
@@ -39,19 +39,19 @@ function initErrorDialogGUI() {
|
||||
textSize: 10.0,
|
||||
textAlign: 0.5,
|
||||
textColour: toColour(255, 255, 255, 255),
|
||||
textFont: robotoFont,
|
||||
textFont: mainFont,
|
||||
},
|
||||
focused: {
|
||||
borderColour: toColour(0, 0, 0, 0),
|
||||
},
|
||||
});
|
||||
|
||||
errorDialog.okayButton = errorDialog.window.button(20, 95, 360, 30, 'OK', {
|
||||
errorDialog.okayButton = errorDialog.window.button(5, 105, 390, 30, 'OK', {
|
||||
main: {
|
||||
backgroundColour: toColour(primaryColour[0], primaryColour[1], primaryColour[2], buttonAlpha),
|
||||
textColour: toColour(primaryTextColour[0], primaryTextColour[1], primaryTextColour[2], 255),
|
||||
textSize: 10.0,
|
||||
textFont: robotoFont,
|
||||
textFont: mainFont,
|
||||
textAlign: 0.5,
|
||||
},
|
||||
focused: {
|
||||
|
||||
18
scripts/client/gui/html/login.js
Normal file
18
scripts/client/gui/html/login.js
Normal file
@@ -0,0 +1,18 @@
|
||||
<html>
|
||||
<head>
|
||||
<title>Connected RP: Login</title>
|
||||
<style type="text/css" rel="stylesheet">
|
||||
.input-box
|
||||
{
|
||||
font-family: "Roboto";
|
||||
font-size: 14px;
|
||||
border-style: solid;
|
||||
border-colour: #0066AA;
|
||||
border-radius: 2px;
|
||||
color: #0066AA;
|
||||
};
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
</body>
|
||||
</html>
|
||||
@@ -38,19 +38,19 @@ function initInfoDialogGUI() {
|
||||
textSize: 10.0,
|
||||
textAlign: 0.5,
|
||||
textColour: toColour(255, 255, 255, 220),
|
||||
textFont: robotoFont,
|
||||
textFont: mainFont,
|
||||
},
|
||||
focused: {
|
||||
borderColour: toColour(0, 0, 0, 0),
|
||||
},
|
||||
});
|
||||
|
||||
infoDialog.okayButton = infoDialog.window.button(20, 95, 360, 30, 'OK', {
|
||||
infoDialog.okayButton = infoDialog.window.button(5, 105, 390, 30, 'OK', {
|
||||
main: {
|
||||
backgroundColour: toColour(primaryColour[0], primaryColour[1], primaryColour[2], buttonAlpha),
|
||||
textColour: toColour(primaryTextColour[0], primaryTextColour[1], primaryTextColour[2], 255),
|
||||
textSize: 10.0,
|
||||
textFont: robotoFont,
|
||||
textFont: mainFont,
|
||||
textAlign: 0.5,
|
||||
},
|
||||
focused: {
|
||||
|
||||
@@ -41,7 +41,7 @@ function initListGUI() {
|
||||
textSize: 10.0,
|
||||
textAlign: 0.5,
|
||||
textColour: toColour(255, 255, 255, 220),
|
||||
textFont: robotoFont,
|
||||
textFont: mainFont,
|
||||
},
|
||||
focused: {
|
||||
borderColour: toColour(0, 0, 0, 0),
|
||||
@@ -73,4 +73,35 @@ function initListGUI() {
|
||||
logToConsole(LOG_DEBUG, `[VRR.GUI] Created list dialog GUI`);
|
||||
}
|
||||
|
||||
// ===========================================================================
|
||||
|
||||
function showListGUI() {
|
||||
closeAllWindows();
|
||||
logToConsole(LOG_DEBUG, `[VRR.GUI] Showing login window`);
|
||||
setChatWindowEnabled(false);
|
||||
mexui.setInput(true);
|
||||
listDialog.window.shown = true;
|
||||
guiSubmitKey = checkListDialogSelection;
|
||||
guiUpKey = selectPreviousListItem;
|
||||
guiDownKey = selectNextListItem;
|
||||
}
|
||||
|
||||
// ===========================================================================
|
||||
|
||||
function checkListDialogSelection() {
|
||||
|
||||
}
|
||||
|
||||
// ===========================================================================
|
||||
|
||||
function selectPreviousListItem() {
|
||||
|
||||
}
|
||||
|
||||
// ===========================================================================
|
||||
|
||||
function selectNextListItem() {
|
||||
|
||||
}
|
||||
|
||||
// ===========================================================================
|
||||
@@ -22,7 +22,7 @@ let login = {
|
||||
|
||||
function initLoginGUI() {
|
||||
logToConsole(LOG_DEBUG, `[VRR.GUI] Creating login GUI ...`);
|
||||
login.window = mexui.window(game.width/2-150, game.height/2-129, 300, 258, 'LOGIN', {
|
||||
login.window = mexui.window(game.width/2-150, game.height/2-130, 300, 260, 'LOGIN', {
|
||||
main: {
|
||||
backgroundColour: toColour(secondaryColour[0], secondaryColour[1], secondaryColour[2], windowAlpha),
|
||||
transitionTime: 500,
|
||||
@@ -42,7 +42,7 @@ function initLoginGUI() {
|
||||
login.window.titleBarIconSize = toVector2(0,0);
|
||||
login.window.titleBarHeight = 0;
|
||||
|
||||
login.logoImage = login.window.image(100, 20, 100, 100, mainLogoPath, {
|
||||
login.logoImage = login.window.image(5, 20, 290, 80, mainLogoPath, {
|
||||
focused: {
|
||||
borderColour: toColour(0, 0, 0, 0),
|
||||
},
|
||||
@@ -53,7 +53,7 @@ function initLoginGUI() {
|
||||
textSize: 10.0,
|
||||
textAlign: 0.5,
|
||||
textColour: toColour(200, 200, 200, 255),
|
||||
textFont: robotoFont,
|
||||
textFont: mainFont,
|
||||
},
|
||||
focused: {
|
||||
borderColour: toColour(0, 0, 0, 0),
|
||||
@@ -66,7 +66,7 @@ function initLoginGUI() {
|
||||
borderColour: toColour(primaryColour[0], primaryColour[1], primaryColour[2], textInputAlpha),
|
||||
textColour: toColour(200, 200, 200, 255),
|
||||
textSize: 10.0,
|
||||
textFont: robotoFont,
|
||||
textFont: mainFont,
|
||||
},
|
||||
caret: {
|
||||
lineColour: toColour(255, 255, 255, 255),
|
||||
@@ -74,7 +74,7 @@ function initLoginGUI() {
|
||||
placeholder: {
|
||||
textColour: toColour(200, 200, 200, 150),
|
||||
textSize: 10.0,
|
||||
textFont: robotoFont,
|
||||
textFont: mainFont,
|
||||
},
|
||||
focused: {
|
||||
borderColour: toColour(primaryColour[0], primaryColour[1], primaryColour[2], 255),
|
||||
@@ -88,7 +88,7 @@ function initLoginGUI() {
|
||||
backgroundColour: toColour(primaryColour[0], primaryColour[1], primaryColour[2], buttonAlpha),
|
||||
textColour: toColour(0, 0, 0, 255),
|
||||
textSize: 12.0,
|
||||
textFont: robotoFont,
|
||||
textFont: mainFont,
|
||||
textAlign: 0.5,
|
||||
},
|
||||
focused: {
|
||||
@@ -96,13 +96,12 @@ function initLoginGUI() {
|
||||
},
|
||||
}, checkLogin);
|
||||
|
||||
/*
|
||||
login.forgotPasswordButton = login.window.button(200, 240, 60, 15, 'FORGOT PASSWORD', {
|
||||
login.forgotPasswordButton = login.window.button(200, 240, 80, 15, 'RESET PASS', {
|
||||
main: {
|
||||
backgroundColour: toColour(primaryColour[0], primaryColour[1], primaryColour[2], buttonAlpha),
|
||||
textColour: toColour(0, 0, 0, 255),
|
||||
textSize: 8.0,
|
||||
textFont: robotoFont,
|
||||
textFont: mainFont,
|
||||
textAlign: 0.5,
|
||||
},
|
||||
focused: {
|
||||
@@ -110,18 +109,17 @@ function initLoginGUI() {
|
||||
},
|
||||
}, switchToPasswordResetGUI);
|
||||
|
||||
login.resetPasswordLabel = login.window.text(20, 140, 60, 15, 'Need to reset your password? Click here >', {
|
||||
login.resetPasswordLabel = login.window.text(125, 240, 60, 15, 'Forgot your password?', {
|
||||
main: {
|
||||
textSize: 8.0,
|
||||
textAlign: 1.0,
|
||||
textColour: toColour(200, 200, 200, 255),
|
||||
textFont: robotoFont,
|
||||
textColour: toColour(180, 180, 180, 255),
|
||||
textFont: mainFont,
|
||||
},
|
||||
focused: {
|
||||
borderColour: toColour(0, 0, 0, 0),
|
||||
},
|
||||
});
|
||||
*/
|
||||
|
||||
logToConsole(LOG_DEBUG, `[VRR.GUI] Created login GUI`);
|
||||
}
|
||||
@@ -134,15 +132,16 @@ function showLoginGUI() {
|
||||
setChatWindowEnabled(false);
|
||||
mexui.setInput(true);
|
||||
login.window.shown = true;
|
||||
|
||||
showSmallGameMessage(`If you don't have a mouse cursor, press ${toUpperCase(getKeyNameFromId(disableGUIKey))} to disable GUI`, COLOUR_WHITE, 7500);
|
||||
mexui.focusedControl = login.passwordInput;
|
||||
guiSubmitKey = checkLogin;
|
||||
//showSmallGameMessage(`If you don't have a mouse cursor, press ${toUpperCase(getKeyNameFromId(disableGUIKey))} to disable GUI`, COLOUR_WHITE, 7500);
|
||||
}
|
||||
|
||||
// ===========================================================================
|
||||
|
||||
function checkLogin() {
|
||||
logToConsole(LOG_DEBUG, `[VRR.GUI] Checking login with server ...`);
|
||||
triggerNetworkEvent("vrr.checkLogin", login.passwordInput.lines[0]);
|
||||
sendNetworkEventToServer("vrr.checkLogin", login.passwordInput.lines[0]);
|
||||
}
|
||||
|
||||
// ===========================================================================
|
||||
@@ -158,7 +157,15 @@ function loginFailed(errorMessage) {
|
||||
|
||||
function loginSuccess() {
|
||||
logToConsole(LOG_DEBUG, `[VRR.GUI] Server reports login was successful`);
|
||||
guiSubmitKey = false;
|
||||
closeAllWindows();
|
||||
}
|
||||
|
||||
// ===========================================================================
|
||||
// ===========================================================================
|
||||
|
||||
function switchToPasswordResetGUI() {
|
||||
closeAllWindows();
|
||||
logToConsole(LOG_DEBUG, `[VRR.GUI] Showing password reset dialog window`);
|
||||
showResetPasswordGUI();
|
||||
return false;
|
||||
}
|
||||
@@ -21,7 +21,7 @@ let newCharacter = {
|
||||
|
||||
function initNewCharacterGUI() {
|
||||
logToConsole(LOG_DEBUG, `[VRR.GUI] Creating new character GUI ...`);
|
||||
newCharacter.window = mexui.window(game.width/2-130, game.height/2-100, 300, 200, 'Character Name', {
|
||||
newCharacter.window = mexui.window(game.width/2-130, game.height/2-100, 300, 200, 'New Character', {
|
||||
main: {
|
||||
backgroundColour: toColour(secondaryColour[0], secondaryColour[1], secondaryColour[2], windowAlpha),
|
||||
transitionTime: 500,
|
||||
@@ -40,7 +40,7 @@ function initNewCharacterGUI() {
|
||||
newCharacter.window.titleBarIconSize = toVector2(0,0);
|
||||
newCharacter.window.titleBarHeight = 0;
|
||||
|
||||
newCharacter.mainLogoImage = newCharacter.window.image(115, 10, 65, 65, mainLogoPath, {
|
||||
newCharacter.mainLogoImage = newCharacter.window.image(5, 20, 290, 80, mainLogoPath, {
|
||||
focused: {
|
||||
borderColour: toColour(0, 0, 0, 0),
|
||||
},
|
||||
@@ -51,7 +51,7 @@ function initNewCharacterGUI() {
|
||||
textSize: 10.0,
|
||||
textAlign: 0.5,
|
||||
textColour: toColour(200, 200, 200, 255),
|
||||
textFont: robotoFont,
|
||||
textFont: mainFont,
|
||||
},
|
||||
focused: {
|
||||
borderColour: toColour(0, 0, 0, 0),
|
||||
@@ -63,7 +63,7 @@ function initNewCharacterGUI() {
|
||||
backgroundColour: toColour(0, 0, 0, 120),
|
||||
textColour: toColour(200, 200, 200, 255),
|
||||
textSize: 10.0,
|
||||
textFont: robotoFont,
|
||||
textFont: mainFont,
|
||||
},
|
||||
caret: {
|
||||
lineColour: toColour(255, 255, 255, 255),
|
||||
@@ -72,7 +72,7 @@ function initNewCharacterGUI() {
|
||||
backgroundColour: toColour(0, 0, 0, 120),
|
||||
textColour: toColour(200, 200, 200, 200),
|
||||
textSize: 10.0,
|
||||
textFont: robotoFont,
|
||||
textFont: mainFont,
|
||||
}
|
||||
});
|
||||
newCharacter.firstNameInput.placeholder = "First Name";
|
||||
@@ -82,7 +82,7 @@ function initNewCharacterGUI() {
|
||||
backgroundColour: toColour(0, 0, 0, 120),
|
||||
textColour: toColour(200, 200, 200, 255),
|
||||
textSize: 10.0,
|
||||
textFont: robotoFont,
|
||||
textFont: mainFont,
|
||||
},
|
||||
caret: {
|
||||
lineColour: toColour(255, 255, 255, 255),
|
||||
@@ -91,7 +91,7 @@ function initNewCharacterGUI() {
|
||||
backgroundColour: toColour(0, 0, 0, 120),
|
||||
textColour: toColour(150, 150, 150, 200),
|
||||
textSize: 10.0,
|
||||
textFont: robotoFont,
|
||||
textFont: mainFont,
|
||||
}
|
||||
});
|
||||
newCharacter.lastNameInput.placeholder = "Last Name";
|
||||
@@ -100,8 +100,8 @@ function initNewCharacterGUI() {
|
||||
main: {
|
||||
backgroundColour: toColour(primaryColour[0], primaryColour[1], primaryColour[2], buttonAlpha),
|
||||
textColour: toColour(255, 255, 255, 255),
|
||||
textSize: 12.0,
|
||||
textFont: robotoFont,
|
||||
textSize: 10.0,
|
||||
textFont: mainFont,
|
||||
textAlign: 0.5,
|
||||
},
|
||||
focused: {
|
||||
@@ -143,7 +143,7 @@ function checkNewCharacter() {
|
||||
return false;
|
||||
}
|
||||
|
||||
triggerNetworkEvent("vrr.checkNewCharacter",
|
||||
sendNetworkEventToServer("vrr.checkNewCharacter",
|
||||
newCharacter.firstNameInput.lines[0],
|
||||
newCharacter.lastNameInput.lines[0],
|
||||
);
|
||||
@@ -157,6 +157,8 @@ function showNewCharacterGUI() {
|
||||
setChatWindowEnabled(false);
|
||||
mexui.setInput(true);
|
||||
newCharacter.window.shown = true;
|
||||
mexui.focusedInput = newCharacter.firstNameInput;
|
||||
guiSubmitButton = checkNewCharacter;
|
||||
}
|
||||
|
||||
// ===========================================================================
|
||||
@@ -21,7 +21,7 @@ let register = {
|
||||
|
||||
function initRegisterGUI() {
|
||||
logToConsole(LOG_DEBUG, `[VRR.GUI] Creating register GUI ...`);
|
||||
register.window = mexui.window(game.width/2-130, game.height/2-125, 300, 250, 'Register', {
|
||||
register.window = mexui.window(game.width/2-150, game.height/2-150, 300, 300, 'Register', {
|
||||
main: {
|
||||
backgroundColour: toColour(secondaryColour[0], secondaryColour[1], secondaryColour[2], windowAlpha),
|
||||
transitionTime: 500,
|
||||
@@ -40,30 +40,30 @@ function initRegisterGUI() {
|
||||
register.window.titleBarIconSize = toVector2(0,0);
|
||||
register.window.titleBarHeight = 0;
|
||||
|
||||
register.window.image(115, 10, 65, 65, mainLogoPath, {
|
||||
register.window.image(5, 20, 290, 80, mainLogoPath, {
|
||||
focused: {
|
||||
borderColour: toColour(0, 0, 0, 0),
|
||||
},
|
||||
});
|
||||
|
||||
register.messageLabel = register.window.text(20, 75, 260, 20, 'Create an account', {
|
||||
register.messageLabel = register.window.text(20, 125, 260, 20, 'Create an account', {
|
||||
main: {
|
||||
textSize: 10.0,
|
||||
textAlign: 0.5,
|
||||
textColour: toColour(200, 200, 200, 255),
|
||||
textFont: robotoFont,
|
||||
textFont: mainFont,
|
||||
},
|
||||
focused: {
|
||||
borderColour: toColour(0, 0, 0, 0),
|
||||
},
|
||||
});
|
||||
|
||||
register.passwordInput = register.window.textInput(20, 100, 260, 25, '', {
|
||||
register.passwordInput = register.window.textInput(20, 150, 260, 25, '', {
|
||||
main: {
|
||||
backgroundColour: toColour(0, 0, 0, 120),
|
||||
textColour: toColour(200, 200, 200, 255),
|
||||
textSize: 10.0,
|
||||
textFont: robotoFont,
|
||||
textFont: mainFont,
|
||||
},
|
||||
caret: {
|
||||
lineColour: toColour(255, 255, 255, 255),
|
||||
@@ -72,18 +72,18 @@ function initRegisterGUI() {
|
||||
backgroundColour: toColour(0, 0, 0, 120),
|
||||
textColour: toColour(200, 200, 200, 200),
|
||||
textSize: 10.0,
|
||||
textFont: robotoFont,
|
||||
textFont: mainFont,
|
||||
}
|
||||
});
|
||||
register.passwordInput.masked = true;
|
||||
register.passwordInput.placeholder = "Password";
|
||||
|
||||
register.confirmPasswordInput = register.window.textInput(20, 130, 260, 25, '', {
|
||||
register.confirmPasswordInput = register.window.textInput(20, 180, 260, 25, '', {
|
||||
main: {
|
||||
backgroundColour: toColour(0, 0, 0, 120),
|
||||
textColour: toColour(200, 200, 200, 255),
|
||||
textSize: 10.0,
|
||||
textFont: robotoFont,
|
||||
textFont: mainFont,
|
||||
},
|
||||
caret: {
|
||||
lineColour: toColour(255, 255, 255, 255),
|
||||
@@ -92,18 +92,18 @@ function initRegisterGUI() {
|
||||
backgroundColour: toColour(0, 0, 0, 120),
|
||||
textColour: toColour(200, 200, 200, 200),
|
||||
textSize: 10.0,
|
||||
textFont: robotoFont,
|
||||
textFont: mainFont,
|
||||
}
|
||||
});
|
||||
register.confirmPasswordInput.masked = true;
|
||||
register.confirmPasswordInput.placeholder = "Confirm password";
|
||||
|
||||
register.emailInput = register.window.textInput(20, 160, 260, 25, '', {
|
||||
register.emailInput = register.window.textInput(20, 210, 260, 25, '', {
|
||||
main: {
|
||||
backgroundColour: toColour(0, 0, 0, 120),
|
||||
textColour: toColour(200, 200, 200, 255),
|
||||
textSize: 10.0,
|
||||
textFont: robotoFont,
|
||||
textFont: mainFont,
|
||||
},
|
||||
caret: {
|
||||
lineColour: toColour(255, 255, 255, 255),
|
||||
@@ -112,17 +112,17 @@ function initRegisterGUI() {
|
||||
backgroundColour: toColour(0, 0, 0, 120),
|
||||
textColour: toColour(200, 200, 200, 200),
|
||||
textSize: 10.0,
|
||||
textFont: robotoFont,
|
||||
textFont: mainFont,
|
||||
}
|
||||
});
|
||||
register.emailInput.placeholder = "Email";
|
||||
|
||||
register.registerButton = register.window.button(20, 195, 260, 30, 'CREATE ACCOUNT', {
|
||||
register.registerButton = register.window.button(20, 245, 260, 30, 'CREATE ACCOUNT', {
|
||||
main: {
|
||||
backgroundColour: toColour(primaryColour[0], primaryColour[1], primaryColour[2], buttonAlpha),
|
||||
textColour: toColour(255, 255, 255, 255),
|
||||
textSize: 12.0,
|
||||
textFont: robotoFont,
|
||||
textFont: mainFont,
|
||||
textAlign: 0.5,
|
||||
},
|
||||
focused: {
|
||||
@@ -147,7 +147,7 @@ function registrationFailed(errorMessage) {
|
||||
|
||||
function checkRegistration() {
|
||||
logToConsole(LOG_DEBUG, `[VRR.GUI] Checking registration with server ...`);
|
||||
triggerNetworkEvent("vrr.checkRegistration", register.passwordInput.lines[0], register.confirmPasswordInput.lines[0], register.emailInput.lines[0]);
|
||||
sendNetworkEventToServer("vrr.checkRegistration", register.passwordInput.lines[0], register.confirmPasswordInput.lines[0], register.emailInput.lines[0]);
|
||||
}
|
||||
|
||||
// ===========================================================================
|
||||
@@ -158,14 +158,16 @@ function showRegistrationGUI() {
|
||||
setChatWindowEnabled(false);
|
||||
mexui.setInput(true);
|
||||
register.window.shown = true;
|
||||
|
||||
showSmallGameMessage(`If you don't have a mouse cursor, press ${toUpperCase(getKeyNameFromId(disableGUIKey))} to disable GUI`, COLOUR_WHITE, 7500);
|
||||
mexui.focusedControl = register.passwordInput;
|
||||
guiSubmitKey = checkRegistration;
|
||||
//showSmallGameMessage(`If you don't have a mouse cursor, press ${toUpperCase(getKeyNameFromId(disableGUIKey))} to disable GUI`, COLOUR_WHITE, 7500);
|
||||
}
|
||||
|
||||
// ===========================================================================
|
||||
|
||||
function registrationSuccess() {
|
||||
logToConsole(LOG_DEBUG, `[VRR.GUI] Server reports registration was successful`);
|
||||
guiSubmitKey = false;
|
||||
closeAllWindows();
|
||||
}
|
||||
|
||||
|
||||
@@ -22,7 +22,7 @@ let resetPassword = {
|
||||
|
||||
function initResetPasswordGUI() {
|
||||
logToConsole(LOG_DEBUG, `[VRR.GUI] Creating password reset GUI ...`);
|
||||
resetPassword.window = mexui.window(game.width/2-150, game.height/2-129, 300, 258, 'RESET PASSWORD', {
|
||||
resetPassword.window = mexui.window(game.width/2-150, game.height/2-130, 300, 260, 'RESET PASSWORD', {
|
||||
main: {
|
||||
backgroundColour: toColour(secondaryColour[0], secondaryColour[1], secondaryColour[2], windowAlpha),
|
||||
transitionTime: 500,
|
||||
@@ -42,7 +42,7 @@ function initResetPasswordGUI() {
|
||||
resetPassword.window.titleBarIconSize = toVector2(0,0);
|
||||
resetPassword.window.titleBarHeight = 0;
|
||||
|
||||
resetPassword.logoImage = resetPassword.window.image(100, 20, 100, 100, mainLogoPath, {
|
||||
resetPassword.logoImage = resetPassword.window.image(5, 20, 290, 80, mainLogoPath, {
|
||||
focused: {
|
||||
borderColour: toColour(0, 0, 0, 0),
|
||||
},
|
||||
@@ -53,7 +53,7 @@ function initResetPasswordGUI() {
|
||||
textSize: 10.0,
|
||||
textAlign: 0.5,
|
||||
textColour: toColour(200, 200, 200, 255),
|
||||
textFont: robotoFont,
|
||||
textFont: mainFont,
|
||||
},
|
||||
focused: {
|
||||
borderColour: toColour(0, 0, 0, 0),
|
||||
@@ -66,7 +66,7 @@ function initResetPasswordGUI() {
|
||||
borderColour: toColour(primaryColour[0], primaryColour[1], primaryColour[2], textInputAlpha),
|
||||
textColour: toColour(200, 200, 200, 255),
|
||||
textSize: 10.0,
|
||||
textFont: robotoFont,
|
||||
textFont: mainFont,
|
||||
},
|
||||
caret: {
|
||||
lineColour: toColour(255, 255, 255, 255),
|
||||
@@ -74,7 +74,7 @@ function initResetPasswordGUI() {
|
||||
placeholder: {
|
||||
textColour: toColour(200, 200, 200, 150),
|
||||
textSize: 10.0,
|
||||
textFont: robotoFont,
|
||||
textFont: mainFont,
|
||||
},
|
||||
focused: {
|
||||
borderColour: toColour(primaryColour[0], primaryColour[1], primaryColour[2], 255),
|
||||
@@ -87,7 +87,7 @@ function initResetPasswordGUI() {
|
||||
backgroundColour: toColour(primaryColour[0], primaryColour[1], primaryColour[2], buttonAlpha),
|
||||
textColour: toColour(primaryTextColour[0], primaryTextColour[1], primaryTextColour[2], 255),
|
||||
textSize: 12.0,
|
||||
textFont: robotoFont,
|
||||
textFont: mainFont,
|
||||
textAlign: 0.5,
|
||||
},
|
||||
focused: {
|
||||
@@ -95,12 +95,12 @@ function initResetPasswordGUI() {
|
||||
},
|
||||
}, checkResetPassword);
|
||||
|
||||
resetPassword.backToLoginButton = resetPassword.window.button(200, 240, 60, 15, 'CANCEL', {
|
||||
resetPassword.backToLoginButton = resetPassword.window.button(200, 240, 80, 15, 'LOGIN', {
|
||||
main: {
|
||||
backgroundColour: toColour(primaryColour[0], primaryColour[1], primaryColour[2], buttonAlpha),
|
||||
textColour: toColour(primaryTextColour[0], primaryTextColour[1], primaryTextColour[2], 255),
|
||||
textSize: 8.0,
|
||||
textFont: robotoFont,
|
||||
textFont: mainFont,
|
||||
textAlign: 0.5,
|
||||
},
|
||||
focused: {
|
||||
@@ -108,12 +108,12 @@ function initResetPasswordGUI() {
|
||||
},
|
||||
}, switchToLoginGUI);
|
||||
|
||||
resetPassword.backToLoginLabel = resetPassword.window.text(20, 140, 60, 15, 'Remembered your password? Click here >', {
|
||||
resetPassword.backToLoginLabel = resetPassword.window.text(125, 240, 60, 15, 'Remember your password?', {
|
||||
main: {
|
||||
textSize: 8.0,
|
||||
textAlign: 1.0,
|
||||
textColour: toColour(200, 200, 200, 255),
|
||||
textFont: robotoFont,
|
||||
textFont: mainFont,
|
||||
},
|
||||
focused: {
|
||||
borderColour: toColour(0, 0, 0, 0),
|
||||
@@ -131,15 +131,16 @@ function showResetPasswordGUI() {
|
||||
setChatWindowEnabled(false);
|
||||
mexui.setInput(true);
|
||||
resetPassword.window.shown = true;
|
||||
|
||||
showSmallGameMessage(`If you don't have a mouse cursor, press ${toUpperCase(getKeyNameFromId(disableGUIKey))} to disable GUI`, COLOUR_WHITE, 7500);
|
||||
mexui.focusedControl = resetPassword.emailInput;
|
||||
guiSubmitButton = checkResetPassword;
|
||||
//showSmallGameMessage(`If you don't have a mouse cursor, press ${toUpperCase(getKeyNameFromId(disableGUIKey))} to disable GUI`, COLOUR_WHITE, 7500);
|
||||
}
|
||||
|
||||
// ===========================================================================
|
||||
|
||||
function checkResetPassword() {
|
||||
logToConsole(LOG_DEBUG, `[VRR.GUI] Checking password reset with server ...`);
|
||||
triggerNetworkEvent("vrr.checkResetPassword", resetPassword.emailInput.lines[0]);
|
||||
sendNetworkEventToServer("vrr.checkResetPassword", resetPassword.emailInput.lines[0]);
|
||||
}
|
||||
|
||||
// ===========================================================================
|
||||
@@ -153,14 +154,22 @@ function resetPasswordFailed(errorMessage) {
|
||||
|
||||
// ===========================================================================
|
||||
|
||||
function resetPasswordSuccess() {
|
||||
function resetPasswordCodeInputGUI() {
|
||||
logToConsole(LOG_DEBUG, `[VRR.GUI] Server reports password reset was successful`);
|
||||
|
||||
resetPassword.messageLabel.text = "Check your email for a verification code";
|
||||
resetPassword.messageLabel.styles.main.textColour = toColour(180, 32, 32, 255);
|
||||
resetPassword.emailInput.text = "";
|
||||
resetPassword.emailInput.placeholder = "Verification Code";
|
||||
|
||||
guiSubmitButton = checkResetPassword;
|
||||
closeAllWindows();
|
||||
}
|
||||
|
||||
// ===========================================================================
|
||||
|
||||
function switchToLoginGUI() {
|
||||
guiSubmitKey = false;
|
||||
closeAllWindows();
|
||||
showLoginGUI();
|
||||
}
|
||||
|
||||
@@ -41,19 +41,19 @@ function initYesNoDialogGUI() {
|
||||
textSize: 10.0,
|
||||
textAlign: 0.5,
|
||||
textColour: toColour(255, 255, 255, 255),
|
||||
textFont: robotoFont,
|
||||
textFont: mainFont,
|
||||
},
|
||||
focused: {
|
||||
borderColour: toColour(0, 0, 0, 0),
|
||||
},
|
||||
});
|
||||
|
||||
yesNoDialog.yesButton = yesNoDialog.window.button(20, 95, 175, 30, 'YES', {
|
||||
yesNoDialog.yesButton = yesNoDialog.window.button(5, 100, 197, 25, 'YES', {
|
||||
main: {
|
||||
backgroundColour: toColour(primaryColour[0], primaryColour[1], primaryColour[2], buttonAlpha),
|
||||
textColour: toColour(primaryTextColour[0], primaryTextColour[1], primaryTextColour[2], 255),
|
||||
textSize: 10.0,
|
||||
textFont: robotoFont,
|
||||
textFont: mainFont,
|
||||
textAlign: 0.5,
|
||||
},
|
||||
focused: {
|
||||
@@ -61,12 +61,12 @@ function initYesNoDialogGUI() {
|
||||
},
|
||||
}, yesNoDialogAnswerYes);
|
||||
|
||||
yesNoDialog.noButton = yesNoDialog.window.button(205, 95, 175, 30, 'NO', {
|
||||
yesNoDialog.noButton = yesNoDialog.window.button(202, 105, 197, 25, 'NO', {
|
||||
main: {
|
||||
backgroundColour: toColour(primaryColour[0], primaryColour[1], primaryColour[2], buttonAlpha),
|
||||
textColour: toColour(primaryTextColour[0], primaryTextColour[1], primaryTextColour[2], 255),
|
||||
textSize: 10.0,
|
||||
textFont: robotoFont,
|
||||
textFont: mainFont,
|
||||
textAlign: 0.5,
|
||||
},
|
||||
focused: {
|
||||
@@ -90,7 +90,7 @@ function showYesNoPromptGUI(promptMessage, promptTitle) {
|
||||
|
||||
function yesNoDialogAnswerNo() {
|
||||
logToConsole(LOG_DEBUG, `[VRR.GUI] Responding with answer NO to server prompt`);
|
||||
triggerNetworkEvent("vrr.promptAnswerNo");
|
||||
sendNetworkEventToServer("vrr.promptAnswerNo");
|
||||
closeAllWindows();
|
||||
}
|
||||
|
||||
@@ -98,7 +98,7 @@ function yesNoDialogAnswerNo() {
|
||||
|
||||
function yesNoDialogAnswerYes() {
|
||||
logToConsole(LOG_DEBUG, `[VRR.GUI] Responding with answer YES to server prompt`);
|
||||
triggerNetworkEvent("vrr.promptAnswerYes");
|
||||
sendNetworkEventToServer("vrr.promptAnswerYes");
|
||||
closeAllWindows();
|
||||
}
|
||||
|
||||
|
||||
34
scripts/client/index.js
Normal file
34
scripts/client/index.js
Normal file
@@ -0,0 +1,34 @@
|
||||
// For RAGEMP only
|
||||
|
||||
// Shared Scripts
|
||||
require("../scripts/shared/const.js");
|
||||
require("../scripts/shared/utilities.js");
|
||||
require("../scripts/shared/gamedata.js");
|
||||
|
||||
// Multiplayer Mod (Wrapped Natives)
|
||||
require("scripts/client/native/ragemp.js");
|
||||
|
||||
// Client Scripts
|
||||
require("scripts/client/gui.js");
|
||||
require("scripts/client/main.js");
|
||||
require("scripts/client/nametag.js");
|
||||
require("scripts/client/sync.js");
|
||||
require("scripts/client/scoreboard.js");
|
||||
require("scripts/client/keybind.js");
|
||||
require("scripts/client/chatbox.js");
|
||||
require("scripts/client/label.js");
|
||||
require("scripts/client/skin-select.js");
|
||||
require("scripts/client/server.js");
|
||||
require("scripts/client/job.js");
|
||||
require("scripts/client/event.js");
|
||||
require("scripts/client/item.js");
|
||||
require("scripts/client/utilities.js");
|
||||
require("scripts/client/messaging.js");
|
||||
require("scripts/client/logo.js");
|
||||
require("scripts/client/afk.js");
|
||||
require("scripts/client/mousecam.js");
|
||||
require("scripts/client/radio.js");
|
||||
require("scripts/client/animation.js");
|
||||
|
||||
// Startup
|
||||
require("scripts/client/startup.js");
|
||||
@@ -9,8 +9,8 @@
|
||||
|
||||
let localPlayerJobType = 0;
|
||||
let localPlayerWorking = false;
|
||||
let jobRouteStopBlip = null;
|
||||
let jobRouteStopSphere = null;
|
||||
let jobRouteLocationBlip = null;
|
||||
let jobRouteLocationSphere = null;
|
||||
|
||||
// ===========================================================================
|
||||
|
||||
@@ -35,21 +35,21 @@ function setLocalPlayerWorkingState(tempWorking) {
|
||||
|
||||
// ===========================================================================
|
||||
|
||||
function showJobRouteStop(position, colour) {
|
||||
logToConsole(LOG_DEBUG, `[VRR.Job] Showing route stop`);
|
||||
function showJobRouteLocation(position, colour) {
|
||||
logToConsole(LOG_DEBUG, `[VRR.Job] Showing job route location`);
|
||||
if(getMultiplayerMod() == VRR_MPMOD_GTAC) {
|
||||
if(game.game == VRR_GAME_GTA_SA) {
|
||||
jobRouteStopSphere = game.createPickup(1318, position, 1);
|
||||
jobRouteLocationSphere = game.createPickup(1318, position, 1);
|
||||
} else {
|
||||
jobRouteStopSphere = game.createSphere(position, 3);
|
||||
jobRouteStopSphere.colour = colour;
|
||||
jobRouteLocationSphere = game.createSphere(position, 3);
|
||||
jobRouteLocationSphere.colour = colour;
|
||||
}
|
||||
|
||||
if(jobRouteStopBlip != null) {
|
||||
destroyElement(jobRouteStopBlip);
|
||||
if(jobRouteLocationBlip != null) {
|
||||
destroyElement(jobRouteLocationBlip);
|
||||
}
|
||||
|
||||
blinkJobRouteStopBlip(10, position, colour);
|
||||
blinkJobRouteLocationBlip(10, position, colour);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -57,30 +57,39 @@ function showJobRouteStop(position, colour) {
|
||||
|
||||
function enteredJobRouteSphere() {
|
||||
logToConsole(LOG_DEBUG, `[VRR.Job] Entered job route sphere`);
|
||||
tellServerPlayerArrivedAtJobRouteStop();
|
||||
destroyElement(jobRouteStopSphere);
|
||||
destroyElement(jobRouteStopBlip);
|
||||
jobRouteStopSphere = null;
|
||||
jobRouteStopBlip = null;
|
||||
tellServerPlayerArrivedAtJobRouteLocation();
|
||||
destroyElement(jobRouteLocationSphere);
|
||||
destroyElement(jobRouteLocationBlip);
|
||||
jobRouteLocationSphere = null;
|
||||
jobRouteLocationBlip = null;
|
||||
}
|
||||
|
||||
// ===========================================================================
|
||||
|
||||
function blinkJobRouteStopBlip(times, position, colour) {
|
||||
function blinkJobRouteLocationBlip(times, position, colour) {
|
||||
for(let i = 1 ; i <= times ; i++) {
|
||||
setTimeout(function() {
|
||||
if(jobRouteStopBlip != null) {
|
||||
destroyElement(jobRouteStopBlip);
|
||||
jobRouteStopBlip = null;
|
||||
if(jobRouteLocationBlip != null) {
|
||||
destroyElement(jobRouteLocationBlip);
|
||||
jobRouteLocationBlip = null;
|
||||
} else {
|
||||
jobRouteStopBlip = game.createBlip(position, 0, 2, colour);
|
||||
jobRouteLocationBlip = game.createBlip(position, 0, 2, colour);
|
||||
}
|
||||
}, 500*i);
|
||||
}
|
||||
|
||||
setTimeout(function() {
|
||||
jobRouteStopBlip = game.createBlip(position, 0, 2, colour);
|
||||
jobRouteLocationBlip = game.createBlip(position, 0, 2, colour);
|
||||
}, 500*times+1);
|
||||
}
|
||||
|
||||
// ===========================================================================
|
||||
|
||||
function hideJobRouteLocation() {
|
||||
destroyElement(jobRouteLocationSphere);
|
||||
destroyElement(jobRouteLocationBlip);
|
||||
jobRouteLocationSphere = null;
|
||||
jobRouteLocationBlip = null;
|
||||
}
|
||||
|
||||
// ===========================================================================
|
||||
@@ -1,11 +1,14 @@
|
||||
{
|
||||
"compilerOptions": {
|
||||
"module": "commonjs",
|
||||
"target": "ES6",
|
||||
"target": "es6",
|
||||
"moduleResolution": "classic"
|
||||
},
|
||||
"include": [
|
||||
"./*.js",
|
||||
"../shared/*.js"
|
||||
"*.js",
|
||||
"gui/*.js",
|
||||
"native/*.js",
|
||||
"../shared/*.js",
|
||||
"../third-party/mexui/*"
|
||||
]
|
||||
}
|
||||
@@ -26,16 +26,20 @@ function bindAccountKey(key, keyState) {
|
||||
logToConsole(LOG_DEBUG, `[VRR.KeyBind]: Binded key ${toUpperCase(getKeyNameFromId(key))} (${key})`);
|
||||
keyBinds.push(toInteger(key));
|
||||
bindKey(toInteger(key), keyState, function(event) {
|
||||
if(isAnyGUIActive()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if(hasKeyBindDelayElapsed()) {
|
||||
if(canLocalPlayerUseKeyBinds()) {
|
||||
logToConsole(LOG_DEBUG, `[VRR.KeyBind]: Using keybind for key ${toUpperCase(getKeyNameFromId(key))} (${key})`);
|
||||
lastKeyBindUse = sdl.ticks;
|
||||
tellServerPlayerUsedKeyBind(key);
|
||||
} else {
|
||||
logToConsole(LOG_ERROR, `[VRR.KeyBind]: Failed to use keybind for key ${toUpperCase(getKeyNameFromId(key))} (${key}) - Not allowed to use keybinds!`);
|
||||
logToConsole(LOG_DEBUG, `[VRR.KeyBind]: Failed to use keybind for key ${toUpperCase(getKeyNameFromId(key))} (${key}) - Not allowed to use keybinds!`);
|
||||
}
|
||||
} else {
|
||||
logToConsole(LOG_ERROR, `[VRR.KeyBind]: Failed to use keybind for key ${toUpperCase(getKeyNameFromId(key))} (${key}) - Not enough time has passed since last keybind use!`);
|
||||
logToConsole(LOG_DEBUG, `[VRR.KeyBind]: Failed to use keybind for key ${toUpperCase(getKeyNameFromId(key))} (${key}) - Not enough time has passed since last keybind use!`);
|
||||
}
|
||||
});
|
||||
}
|
||||
@@ -62,7 +66,19 @@ function hasKeyBindDelayElapsed() {
|
||||
// ===========================================================================
|
||||
|
||||
function canLocalPlayerUseKeyBinds() {
|
||||
return true; //(!usingSkinSelector && isSpawned && !itemActionDelayEnabled);
|
||||
if(isAnyGUIActive()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if(!isSpawned) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if(itemActionDelayEnabled) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
// ===========================================================================
|
||||
|
||||
@@ -127,7 +127,7 @@ function renderPropertyEntranceLabel(name, position, locked, isBusiness, price,
|
||||
break;
|
||||
|
||||
case VRR_PROPLABEL_INFO_BUYBIZ:
|
||||
infoText = `Use /bizbuy to buy this business`;
|
||||
infoText = `Use /buy to purchase items`;
|
||||
break;
|
||||
|
||||
//case VRR_PROPLABEL_INFO_RENTBIZ:
|
||||
@@ -253,37 +253,39 @@ function processLabelRendering() {
|
||||
for(let i in pickups) {
|
||||
if(pickups[i].getData("vrr.label.type") != null) {
|
||||
if(getDistance(localPlayer.position, pickups[i].position) <= renderLabelDistance) {
|
||||
let price = "0";
|
||||
let rentPrice = "0";
|
||||
let labelInfoType = VRR_PROPLABEL_INFO_NONE;
|
||||
if(pickups[i].getData("vrr.label.price") != null) {
|
||||
price = makeLargeNumberReadable(pickups[i].getData("vrr.label.price"));
|
||||
}
|
||||
if(!pickups[i].isOnScreen) {
|
||||
let price = "0";
|
||||
let rentPrice = "0";
|
||||
let labelInfoType = VRR_PROPLABEL_INFO_NONE;
|
||||
if(pickups[i].getData("vrr.label.price") != null) {
|
||||
price = makeLargeNumberReadable(pickups[i].getData("vrr.label.price"));
|
||||
}
|
||||
|
||||
if(pickups[i].getData("vrr.label.rentprice") != null) {
|
||||
rentPrice = makeLargeNumberReadable(pickups[i].getData("vrr.label.rentprice"));
|
||||
}
|
||||
if(pickups[i].getData("vrr.label.rentprice") != null) {
|
||||
rentPrice = makeLargeNumberReadable(pickups[i].getData("vrr.label.rentprice"));
|
||||
}
|
||||
|
||||
if(pickups[i].getData("vrr.label.help") != null) {
|
||||
labelInfoType = pickups[i].getData("vrr.label.help");
|
||||
}
|
||||
if(pickups[i].getData("vrr.label.help") != null) {
|
||||
labelInfoType = pickups[i].getData("vrr.label.help");
|
||||
}
|
||||
|
||||
switch(pickups[i].getData("vrr.label.type")) {
|
||||
case VRR_LABEL_BUSINESS:
|
||||
renderPropertyEntranceLabel(pickups[i].getData("vrr.label.name"), pickups[i].position, pickups[i].getData("vrr.label.locked"), true, price, rentPrice, labelInfoType);
|
||||
break;
|
||||
switch(pickups[i].getData("vrr.label.type")) {
|
||||
case VRR_LABEL_BUSINESS:
|
||||
renderPropertyEntranceLabel(pickups[i].getData("vrr.label.name"), pickups[i].position, pickups[i].getData("vrr.label.locked"), true, price, rentPrice, labelInfoType);
|
||||
break;
|
||||
|
||||
case VRR_LABEL_HOUSE:
|
||||
renderPropertyEntranceLabel(pickups[i].getData("vrr.label.name"), pickups[i].position, pickups[i].getData("vrr.label.locked"), false, price, rentPrice, labelInfoType);
|
||||
break;
|
||||
case VRR_LABEL_HOUSE:
|
||||
renderPropertyEntranceLabel("House", pickups[i].position, pickups[i].getData("vrr.label.locked"), false, price, rentPrice, labelInfoType);
|
||||
break;
|
||||
|
||||
case VRR_LABEL_JOB:
|
||||
renderJobLabel(pickups[i].getData("vrr.label.name"), pickups[i].position, pickups[i].getData("vrr.label.jobType"));
|
||||
break;
|
||||
case VRR_LABEL_JOB:
|
||||
renderJobLabel(pickups[i].getData("vrr.label.name"), pickups[i].position, pickups[i].getData("vrr.label.jobType"));
|
||||
break;
|
||||
|
||||
case VRR_LABEL_EXIT:
|
||||
renderPropertyExitLabel(pickups[i].position);
|
||||
break;
|
||||
case VRR_LABEL_EXIT:
|
||||
renderPropertyExitLabel(pickups[i].position);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -64,6 +64,8 @@ let vehiclePurchaseState = VRR_VEHBUYSTATE_NONE;
|
||||
let vehiclePurchasing = null;
|
||||
let vehiclePurchasePosition = null;
|
||||
|
||||
let forceWantedLevel = 0;
|
||||
|
||||
// Pre-cache all allowed skins
|
||||
let allowedSkins = getAllowedSkins(getGame());
|
||||
|
||||
|
||||
@@ -165,6 +165,13 @@ function updateNametags(element) {
|
||||
|
||||
let distance = playerPos.distance(elementPos);
|
||||
if(distance <= nametagDistance) {
|
||||
if(typeof game.processLineOfSight != "undefined") {
|
||||
let losCheck = game.processLineOfSight(playerPos, elementPos, true, false, false, true, true, false, true, true);
|
||||
if(losCheck != null) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
if(element.type == ELEMENT_PLAYER) {
|
||||
let name = element.name;
|
||||
let colour = COLOUR_WHITE;
|
||||
|
||||
@@ -0,0 +1,144 @@
|
||||
// ===========================================================================
|
||||
// Vortrex's Roleplay Resource
|
||||
// https://github.com/VortrexFTW/gtac_roleplay
|
||||
// ===========================================================================
|
||||
// FILE: connected.js
|
||||
// DESC: Provides wrapped natives for GTA Connected and Mafia Connected mods
|
||||
// TYPE: Server (JavaScript)
|
||||
// ===========================================================================
|
||||
|
||||
function sendNetworkEventToPlayer(networkEvent, client, ...args) {
|
||||
triggerNetworkEvent.apply(null, networkEvent, client, args);
|
||||
}
|
||||
|
||||
// ===========================================================================
|
||||
|
||||
function getPlayerPosition() {
|
||||
return localPlayer.position;
|
||||
}
|
||||
|
||||
// ===========================================================================
|
||||
|
||||
function setPlayerPosition(position) {
|
||||
localPlayer.position = position;
|
||||
}
|
||||
|
||||
// ===========================================================================
|
||||
|
||||
function getElementPosition(element) {
|
||||
return element.position;
|
||||
}
|
||||
|
||||
// ===========================================================================
|
||||
|
||||
function setElementPosition(element, position) {
|
||||
if(!element.isSyncer) {
|
||||
return false;
|
||||
}
|
||||
|
||||
element.position = position;
|
||||
}
|
||||
|
||||
// ===========================================================================
|
||||
|
||||
function deleteGameElement(element, position) {
|
||||
if(!element.isOwner) {
|
||||
return false;
|
||||
}
|
||||
|
||||
destroyGameElement(element);
|
||||
}
|
||||
|
||||
// ===========================================================================
|
||||
|
||||
function createGameVehicle(modelIndex, position, heading) {
|
||||
return game.createVehicle(getGameData().vehicles[getGame()][modelIndex][0], position, heading);
|
||||
}
|
||||
|
||||
// ===========================================================================
|
||||
|
||||
function addNetworkEventHandler(eventName, handlerFunction) {
|
||||
addNetworkHandler(eventName, handlerFunction);
|
||||
}
|
||||
|
||||
// ===========================================================================
|
||||
|
||||
function sendNetworkEventToServer(eventName, ...args) {
|
||||
let argsArray = [eventName];
|
||||
argsArray = argsArray.concat(args);
|
||||
triggerNetworkEvent.apply(null, argsArray);
|
||||
}
|
||||
|
||||
// ===========================================================================
|
||||
|
||||
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 getVehiclesInRange(position, distance) {
|
||||
return getElementsByType(ELEMENT_VEHICLE).filter(x => x.player && x.position.distance(position) <= distance);
|
||||
}
|
||||
|
||||
// ===========================================================================
|
||||
|
||||
function getClientsInRange(position, distance) {
|
||||
return getPlayersInRange(position, distance);
|
||||
}
|
||||
|
||||
// ===========================================================================
|
||||
|
||||
function getCiviliansInRange(position, distance) {
|
||||
return getElementsByType(ELEMENT_PED).filter(x => !x.isType(ELEMENT_PLAYER) && getElementPosition(x).position.distance(position) <= distance);
|
||||
}
|
||||
|
||||
// ===========================================================================
|
||||
|
||||
function getPlayersInRange(position, distance) {
|
||||
return getClients().filter(x => getPlayerPosition(x).distance(position) <= distance);
|
||||
}
|
||||
|
||||
// ===========================================================================
|
||||
|
||||
function getElementsByTypeInRange(elementType, position, distance) {
|
||||
return getElementsByType(elementType).filter(x => getElementPosition(x).position.distance(position) <= distance);
|
||||
}
|
||||
|
||||
// ===========================================================================
|
||||
|
||||
function getClosestCivilian(position) {
|
||||
return getElementsByType(ELEMENT_PED).reduce((i, j) => ((i.position.distance(position) <= j.position.distance(position)) ? i : j));
|
||||
}
|
||||
|
||||
// ===========================================================================
|
||||
|
||||
function is2dPositionOnScreen(pos2d) {
|
||||
return pos2d.x >= 0 && pos2d.y >= 0 && pos2d.x <= game.width && pos2d.y <= game.height;
|
||||
}
|
||||
|
||||
// ===========================================================================
|
||||
|
||||
function getVehiclesInRange(position, range) {
|
||||
let vehicles = getElementsByType(ELEMENT_VEHICLE);
|
||||
let inRangeVehicles = [];
|
||||
for(let i in vehicles) {
|
||||
if(getDistance(position, vehicles[i].position) <= range) {
|
||||
inRangeVehicles.push(vehicles[i]);
|
||||
}
|
||||
}
|
||||
return inRangeVehicles;
|
||||
}
|
||||
|
||||
// ===========================================================================
|
||||
@@ -22,7 +22,9 @@ function playStreamingRadio(url, loop, volume, element = false) {
|
||||
// ===========================================================================
|
||||
|
||||
function stopStreamingRadio() {
|
||||
streamingRadio.stop();
|
||||
if(streamingRadio != null) {
|
||||
streamingRadio.stop();
|
||||
}
|
||||
streamingRadio = null;
|
||||
}
|
||||
|
||||
@@ -38,12 +40,7 @@ function setStreamingRadioVolume(volume) {
|
||||
// ===========================================================================
|
||||
|
||||
function playAudioFile(audioName, loop, volume) {
|
||||
let resource = findResourceByName("connectedrp-extra");
|
||||
if(resource == null) {
|
||||
return false;
|
||||
}
|
||||
|
||||
resource.exports.playCustomAudio(audioName, volume/100);
|
||||
playCustomAudio(audioName, volume/100, loop);
|
||||
}
|
||||
|
||||
// ===========================================================================
|
||||
@@ -18,101 +18,108 @@ function initServerScript() {
|
||||
function addAllNetworkHandlers() {
|
||||
logToConsole(LOG_DEBUG, "[VRR.Server]: Adding network handlers ...");
|
||||
|
||||
addNetworkHandler("vrr.smallGameMessage", showSmallGameMessage);
|
||||
addNetworkHandler("vrr.working", setLocalPlayerWorkingState);
|
||||
addNetworkHandler("vrr.jobType", setLocalPlayerJobType);
|
||||
addNetworkHandler("vrr.passenger", enterVehicleAsPassenger);
|
||||
addNetworkEventHandler("vrr.smallGameMessage", showSmallGameMessage);
|
||||
addNetworkEventHandler("vrr.working", setLocalPlayerWorkingState);
|
||||
addNetworkEventHandler("vrr.jobType", setLocalPlayerJobType);
|
||||
addNetworkEventHandler("vrr.passenger", enterVehicleAsPassenger);
|
||||
|
||||
addNetworkHandler("vrr.freeze", setLocalPlayerFrozenState);
|
||||
addNetworkHandler("vrr.control", setLocalPlayerControlState);
|
||||
addNetworkHandler("vrr.fadeCamera", fadeLocalCamera);
|
||||
addNetworkHandler("vrr.removeFromVehicle", removeLocalPlayerFromVehicle);
|
||||
addNetworkHandler("vrr.clearPeds", clearLocalPlayerOwnedPeds);
|
||||
addNetworkHandler("vrr.restoreCamera", restoreLocalCamera);
|
||||
addNetworkHandler("vrr.cameraLookAt", setLocalCameraLookAt);
|
||||
addNetworkHandler("vrr.logo", setServerLogoRenderState);
|
||||
addNetworkHandler("vrr.ambience", setCityAmbienceState);
|
||||
addNetworkHandler("vrr.runCode", runClientCode);
|
||||
addNetworkHandler("vrr.clearWeapons", clearLocalPlayerWeapons);
|
||||
addNetworkHandler("vrr.giveWeapon", giveLocalPlayerWeapon);
|
||||
addNetworkHandler("vrr.position", setLocalPlayerPosition);
|
||||
addNetworkHandler("vrr.heading", setLocalPlayerHeading);
|
||||
addNetworkHandler("vrr.interior", setLocalPlayerInterior);
|
||||
addNetworkHandler("vrr.minuteDuration", setMinuteDuration);
|
||||
addNetworkHandler("vrr.showJobRouteStop", showJobRouteStop);
|
||||
addNetworkHandler("vrr.snow", setSnowState);
|
||||
addNetworkHandler("vrr.health", setLocalPlayerHealth);
|
||||
addNetworkHandler("vrr.enterPropertyKey", setEnterPropertyKey);
|
||||
addNetworkHandler("vrr.skinSelect", toggleSkinSelect);
|
||||
addNetworkHandler("vrr.hotbar", updatePlayerHotBar);
|
||||
addNetworkHandler("vrr.pedSpeech", playPedSpeech);
|
||||
addNetworkHandler("vrr.clearPedState", clearLocalPedState);
|
||||
addNetworkHandler("vrr.drunkEffect", setLocalPlayerDrunkEffect);
|
||||
addNetworkHandler("vrr.showItemActionDelay", showItemActionDelay);
|
||||
addNetworkHandler("vrr.set2DRendering", setPlayer2DRendering);
|
||||
addNetworkHandler("vrr.mouseCursor", toggleMouseCursor);
|
||||
addNetworkHandler("vrr.mouseCamera", toggleMouseCamera);
|
||||
addNetworkHandler("vrr.mouseCameraForce", setMouseCameraState);
|
||||
addNetworkHandler("vrr.weaponDamageEnabled", setPlayerWeaponDamageEnabled);
|
||||
addNetworkHandler("vrr.weaponDamageEvent", setPlayerWeaponDamageEvent);
|
||||
addNetworkHandler("vrr.spawned", onServerSpawnedPlayer);
|
||||
addNetworkHandler("vrr.money", setLocalPlayerCash);
|
||||
addNetworkHandler("vrr.armour", setLocalPlayerArmour);
|
||||
addNetworkEventHandler("vrr.freeze", setLocalPlayerFrozenState);
|
||||
addNetworkEventHandler("vrr.control", setLocalPlayerControlState);
|
||||
addNetworkEventHandler("vrr.fadeCamera", fadeLocalCamera);
|
||||
addNetworkEventHandler("vrr.removeFromVehicle", removeLocalPlayerFromVehicle);
|
||||
addNetworkEventHandler("vrr.clearPeds", clearLocalPlayerOwnedPeds);
|
||||
addNetworkEventHandler("vrr.restoreCamera", restoreLocalCamera);
|
||||
addNetworkEventHandler("vrr.cameraLookAt", setLocalCameraLookAt);
|
||||
addNetworkEventHandler("vrr.logo", setServerLogoRenderState);
|
||||
addNetworkEventHandler("vrr.ambience", setCityAmbienceState);
|
||||
addNetworkEventHandler("vrr.runCode", runClientCode);
|
||||
addNetworkEventHandler("vrr.clearWeapons", clearLocalPlayerWeapons);
|
||||
addNetworkEventHandler("vrr.giveWeapon", giveLocalPlayerWeapon);
|
||||
addNetworkEventHandler("vrr.position", setLocalPlayerPosition);
|
||||
addNetworkEventHandler("vrr.heading", setLocalPlayerHeading);
|
||||
addNetworkEventHandler("vrr.interior", setLocalPlayerInterior);
|
||||
addNetworkEventHandler("vrr.minuteDuration", setMinuteDuration);
|
||||
addNetworkEventHandler("vrr.showJobRouteLocation", showJobRouteLocation);
|
||||
addNetworkEventHandler("vrr.hideJobRouteLocation", hideJobRouteLocation);
|
||||
addNetworkEventHandler("vrr.snow", setSnowState);
|
||||
addNetworkEventHandler("vrr.health", setLocalPlayerHealth);
|
||||
addNetworkEventHandler("vrr.enterPropertyKey", setEnterPropertyKey);
|
||||
addNetworkEventHandler("vrr.skinSelect", toggleSkinSelect);
|
||||
addNetworkEventHandler("vrr.hotbar", updatePlayerHotBar);
|
||||
addNetworkEventHandler("vrr.pedSpeech", playPedSpeech);
|
||||
addNetworkEventHandler("vrr.clearPedState", clearLocalPedState);
|
||||
addNetworkEventHandler("vrr.drunkEffect", setLocalPlayerDrunkEffect);
|
||||
addNetworkEventHandler("vrr.showItemActionDelay", showItemActionDelay);
|
||||
addNetworkEventHandler("vrr.set2DRendering", setPlayer2DRendering);
|
||||
addNetworkEventHandler("vrr.mouseCursor", toggleMouseCursor);
|
||||
addNetworkEventHandler("vrr.mouseCamera", toggleMouseCamera);
|
||||
addNetworkEventHandler("vrr.mouseCameraForce", setMouseCameraState);
|
||||
addNetworkEventHandler("vrr.weaponDamageEnabled", setPlayerWeaponDamageEnabled);
|
||||
addNetworkEventHandler("vrr.weaponDamageEvent", setPlayerWeaponDamageEvent);
|
||||
addNetworkEventHandler("vrr.spawned", onServerSpawnedPlayer);
|
||||
addNetworkEventHandler("vrr.money", setLocalPlayerCash);
|
||||
addNetworkEventHandler("vrr.armour", setLocalPlayerArmour);
|
||||
addNetworkEventHandler("vrr.wantedLevel", forceLocalPlayerWantedLevel);
|
||||
|
||||
addNetworkHandler("vrr.delKeyBind", unBindAccountKey);
|
||||
addNetworkHandler("vrr.addKeyBind", bindAccountKey);
|
||||
addNetworkHandler("vrr.clearKeyBinds", clearKeyBinds);
|
||||
addNetworkEventHandler("vrr.delKeyBind", unBindAccountKey);
|
||||
addNetworkEventHandler("vrr.addKeyBind", bindAccountKey);
|
||||
addNetworkEventHandler("vrr.clearKeyBinds", clearKeyBinds);
|
||||
|
||||
addNetworkHandler("vrr.nametag", updatePlayerNameTag);
|
||||
addNetworkHandler("vrr.ping", updatePlayerPing);
|
||||
addNetworkEventHandler("vrr.nametag", updatePlayerNameTag);
|
||||
addNetworkEventHandler("vrr.ping", updatePlayerPing);
|
||||
|
||||
addNetworkHandler("vrr.m", receiveChatBoxMessageFromServer);
|
||||
addNetworkHandler("vrr.chatScrollLines", setChatScrollLines);
|
||||
addNetworkEventHandler("vrr.m", receiveChatBoxMessageFromServer);
|
||||
addNetworkEventHandler("vrr.chatScrollLines", setChatScrollLines);
|
||||
|
||||
addNetworkHandler("vrr.radioStream", playStreamingRadio);
|
||||
addNetworkHandler("vrr.audioFileStream", playAudioFile);
|
||||
addNetworkHandler("vrr.stopRadioStream", stopStreamingRadio);
|
||||
addNetworkHandler("vrr.radioVolume", setStreamingRadioVolume);
|
||||
addNetworkEventHandler("vrr.radioStream", playStreamingRadio);
|
||||
addNetworkEventHandler("vrr.audioFileStream", playAudioFile);
|
||||
addNetworkEventHandler("vrr.stopRadioStream", stopStreamingRadio);
|
||||
addNetworkEventHandler("vrr.radioVolume", setStreamingRadioVolume);
|
||||
|
||||
addNetworkHandler("vrr.veh.lights", setVehicleLights);
|
||||
addNetworkHandler("vrr.veh.engine", setVehicleEngine);
|
||||
addNetworkHandler("vrr.veh.repair", repairVehicle);
|
||||
addNetworkEventHandler("vrr.veh.lights", setVehicleLights);
|
||||
addNetworkEventHandler("vrr.veh.engine", setVehicleEngine);
|
||||
addNetworkEventHandler("vrr.veh.repair", repairVehicle);
|
||||
|
||||
addNetworkHandler("vrr.pedAnim", makePedPlayAnimation);
|
||||
addNetworkHandler("vrr.pedStopAnim", makePedStopAnimation);
|
||||
addNetworkHandler("vrr.hideAllGUI", hideAllGUI);
|
||||
addNetworkHandler("vrr.gameScript", setGameScriptState);
|
||||
addNetworkHandler("vrr.clientInfo", serverRequestedClientInfo);
|
||||
addNetworkHandler("vrr.interiorLights", updateInteriorLightsState);
|
||||
addNetworkEventHandler("vrr.pedAnim", makePedPlayAnimation);
|
||||
addNetworkEventHandler("vrr.pedStopAnim", makePedStopAnimation);
|
||||
addNetworkEventHandler("vrr.localPlayerSkin", setLocalPlayerSkin);
|
||||
addNetworkEventHandler("vrr.forcePedAnim", forcePedAnimation);
|
||||
addNetworkEventHandler("vrr.hideAllGUI", hideAllGUI);
|
||||
addNetworkEventHandler("vrr.gameScript", setGameScriptState);
|
||||
addNetworkEventHandler("vrr.clientInfo", serverRequestedClientInfo);
|
||||
addNetworkEventHandler("vrr.interiorLights", updateInteriorLightsState);
|
||||
|
||||
addNetworkHandler("vrr.syncElement", forceSyncElementProperties);
|
||||
addNetworkHandler("vrr.elementPosition", setElementPosition);
|
||||
addNetworkHandler("vrr.elementCollisions", setElementCollisionsEnabled);
|
||||
addNetworkEventHandler("vrr.syncElement", forceSyncElementProperties);
|
||||
addNetworkEventHandler("vrr.elementPosition", setElementPosition);
|
||||
addNetworkEventHandler("vrr.elementCollisions", setElementCollisionsEnabled);
|
||||
|
||||
addNetworkHandler("vrr.vehBuyState", setVehiclePurchaseState);
|
||||
addNetworkEventHandler("vrr.vehBuyState", setVehiclePurchaseState);
|
||||
|
||||
addNetworkHandler("vrr.showRegistration", showRegistrationGUI);
|
||||
addNetworkHandler("vrr.showNewCharacter", showNewCharacterGUI);
|
||||
addNetworkHandler("vrr.showLogin", showLoginGUI);
|
||||
addNetworkEventHandler("vrr.showRegistration", showRegistrationGUI);
|
||||
addNetworkEventHandler("vrr.showNewCharacter", showNewCharacterGUI);
|
||||
addNetworkEventHandler("vrr.showLogin", showLoginGUI);
|
||||
|
||||
addNetworkEventHandler("vrr.logLevel", setLogLevel);
|
||||
addNetworkEventHandler("vrr.infiniteRun", setLocalPlayerInfiniteRun);
|
||||
}
|
||||
|
||||
// ===========================================================================
|
||||
|
||||
function sendResourceReadySignalToServer() {
|
||||
triggerNetworkEvent("vrr.clientReady");
|
||||
sendNetworkEventToServer("vrr.clientReady");
|
||||
}
|
||||
|
||||
// ===========================================================================
|
||||
|
||||
function sendResourceStartedSignalToServer() {
|
||||
triggerNetworkEvent("vrr.clientStarted");
|
||||
sendNetworkEventToServer("vrr.clientStarted");
|
||||
}
|
||||
|
||||
// ===========================================================================
|
||||
|
||||
function sendResourceStoppedSignalToServer() {
|
||||
if(isConnected) {
|
||||
triggerNetworkEvent("vrr.clientStopped");
|
||||
sendNetworkEventToServer("vrr.clientStopped");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -122,10 +129,12 @@ function setPlayer2DRendering(hudState, labelState, smallGameMessageState, score
|
||||
logToConsole(LOG_DEBUG, `[VRR.Main] Updating render states (HUD: ${hudState}, Labels: ${labelState}, Bottom Text: ${smallGameMessageState}, Scoreboard: ${scoreboardState}, HotBar: ${hotBarState}, Item Action Delay: ${itemActionDelayState})`);
|
||||
renderHUD = hudState;
|
||||
|
||||
if(typeof setHUDEnabled != "undefined") {
|
||||
if(getGame() == VRR_GAME_GTA_IV) {
|
||||
natives.displayHud(false);
|
||||
} else {
|
||||
if(getGame() == VRR_GAME_GTA_IV) {
|
||||
natives.displayCash(hudState);
|
||||
natives.displayAmmo(hudState);
|
||||
natives.displayHud(hudState);
|
||||
} else {
|
||||
if(typeof setHUDEnabled != "undefined") {
|
||||
setHUDEnabled(hudState);
|
||||
}
|
||||
}
|
||||
@@ -151,19 +160,19 @@ function onServerSpawnedPlayer(state) {
|
||||
// ===========================================================================
|
||||
|
||||
function tellServerPlayerUsedKeyBind(key) {
|
||||
triggerNetworkEvent("vrr.useKeyBind", key);
|
||||
sendNetworkEventToServer("vrr.useKeyBind", key);
|
||||
}
|
||||
|
||||
// ===========================================================================
|
||||
|
||||
function tellServerPlayerArrivedAtJobRouteStop() {
|
||||
triggerNetworkEvent("vrr.arrivedAtJobRouteStop");
|
||||
function tellServerPlayerArrivedAtJobRouteLocation() {
|
||||
sendNetworkEventToServer("vrr.arrivedAtJobRouteLocation");
|
||||
}
|
||||
|
||||
// ===========================================================================
|
||||
|
||||
function tellServerItemActionDelayComplete() {
|
||||
triggerNetworkEvent("vrr.itemActionDelayComplete");
|
||||
sendNetworkEventToServer("vrr.itemActionDelayComplete");
|
||||
}
|
||||
|
||||
// ===========================================================================
|
||||
@@ -173,13 +182,13 @@ function sendServerClientInfo() {
|
||||
if(typeof CLIENT_VERSION_MAJOR != "undefined") {
|
||||
clientVersion = `${CLIENT_VERSION_MAJOR}.${CLIENT_VERSION_MINOR}.${CLIENT_VERSION_PATCH}.${CLIENT_VERSION_BUILD}`;
|
||||
}
|
||||
triggerNetworkEvent("vrr.clientInfo", clientVersion, game.width, game.height);
|
||||
sendNetworkEventToServer("vrr.clientInfo", clientVersion, game.width, game.height);
|
||||
}
|
||||
|
||||
// ===========================================================================
|
||||
|
||||
function sendServerNewAFKStatus(state) {
|
||||
triggerNetworkEvent("vrr.afk", state);
|
||||
sendNetworkEventToServer("vrr.afk", state);
|
||||
}
|
||||
|
||||
// ===========================================================================
|
||||
@@ -235,6 +244,10 @@ function setElementPosition(elementId, position) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if(!getElementFromId(elementId).isSyncer) {
|
||||
return false;
|
||||
}
|
||||
|
||||
getElementFromId(elementId).position = position;
|
||||
}
|
||||
|
||||
@@ -250,25 +263,6 @@ function setElementCollisionsEnabled(elementId, state) {
|
||||
|
||||
// ===========================================================================
|
||||
|
||||
function makePedStopAnimation(pedId) {
|
||||
if(getElementFromId(pedId) == null) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if(getGame() == VRR_GAME_GTA_VC || getGame() == VRR_GAME_GTA_SA) {
|
||||
getElementFromId(pedId).clearAnimations();
|
||||
} else {
|
||||
getElementFromId(pedId).clearObjective();
|
||||
}
|
||||
|
||||
if(getElementFromId(pedId) == localPlayer) {
|
||||
localPlayer.collisionsEnabled = true;
|
||||
setLocalPlayerControlState(true, false);
|
||||
}
|
||||
}
|
||||
|
||||
// ===========================================================================
|
||||
|
||||
function setLocalPlayerPedPartsAndProps(parts, props) {
|
||||
for(let i in parts) {
|
||||
localPlayer.changeBodyPart(parts[0], parts[1], parts[2]);
|
||||
@@ -284,4 +278,37 @@ function setLocalPlayerArmour(armour) {
|
||||
}
|
||||
}
|
||||
|
||||
// ===========================================================================
|
||||
|
||||
function forceLocalPlayerWantedLevel(wantedLevel) {
|
||||
forceWantedLevel = toInteger(wantedLevel);
|
||||
}
|
||||
|
||||
// ===========================================================================
|
||||
|
||||
function setLogLevel(level) {
|
||||
logLevel = level;
|
||||
}
|
||||
|
||||
// ===========================================================================
|
||||
|
||||
function setLocalPlayerInfiniteRun(state) {
|
||||
if(localPlayer != null) {
|
||||
if(getGame() == VRR_GAME_GTA_III || getGame() == VRR_GAME_GTA_VC) {
|
||||
game.SET_PLAYER_NEVER_GETS_TIRED(game.GET_PLAYER_ID(), boolToInt(state));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// ===========================================================================
|
||||
|
||||
function setLocalPlayerSkin(skinId) {
|
||||
if(getGame() == VRR_GAME_GTA_IV) {
|
||||
//natives.changePlayerModel(natives.getPlayerId(), skinId);
|
||||
localPlayer.skin = allowedSkins[skinSelectorIndex][0];
|
||||
} else {
|
||||
localPlayer.skin = skinId;
|
||||
}
|
||||
}
|
||||
|
||||
// ===========================================================================
|
||||
@@ -53,7 +53,12 @@ function processSkinSelectKeyPress(keyCode) {
|
||||
}
|
||||
logToConsole(LOG_DEBUG, `Switching to skin ${allowedSkins[skinSelectorIndex][1]} (Index: ${skinSelectorIndex}, Skin: ${allowedSkins[skinSelectorIndex][0]})`);
|
||||
skinSelectMessageTextTop = allowedSkins[skinSelectorIndex][1];
|
||||
localPlayer.skin = allowedSkins[skinSelectorIndex][0];
|
||||
if(getGame() == VRR_GAME_GTA_IV) {
|
||||
//natives.changePlayerModel(natives.getPlayerId(), allowedSkins[skinSelectorIndex][0]);
|
||||
localPlayer.skin = allowedSkins[skinSelectorIndex][0];
|
||||
} else {
|
||||
localPlayer.skin = allowedSkins[skinSelectorIndex][0];
|
||||
}
|
||||
} else if(keyCode == SDLK_PAGEDOWN) {
|
||||
if(skinSelectorIndex <= 0) {
|
||||
skinSelectorIndex = allowedSkins.length-1;
|
||||
@@ -62,13 +67,18 @@ function processSkinSelectKeyPress(keyCode) {
|
||||
}
|
||||
logToConsole(LOG_DEBUG, `Switching to skin ${allowedSkins[skinSelectorIndex][1]} (Index: ${skinSelectorIndex}, Skin: ${allowedSkins[skinSelectorIndex][0]})`);
|
||||
skinSelectMessageTextTop = allowedSkins[skinSelectorIndex][1];
|
||||
localPlayer.skin = allowedSkins[skinSelectorIndex][0];
|
||||
if(getGame() == VRR_GAME_GTA_IV) {
|
||||
//natives.changePlayerModel(natives.getPlayerId(), allowedSkins[skinSelectorIndex][0]);
|
||||
localPlayer.skin = allowedSkins[skinSelectorIndex][0];
|
||||
} else {
|
||||
localPlayer.skin = allowedSkins[skinSelectorIndex][0];
|
||||
}
|
||||
} else if(keyCode == SDLK_RETURN) {
|
||||
triggerNetworkEvent("vrr.skinSelected", skinSelectorIndex);
|
||||
sendNetworkEventToServer("vrr.skinSelected", skinSelectorIndex);
|
||||
toggleSkinSelect(false);
|
||||
return true;
|
||||
} else if(keyCode == SDLK_BACKSPACE) {
|
||||
triggerNetworkEvent("vrr.skinSelected", -1);
|
||||
sendNetworkEventToServer("vrr.skinSelected", -1);
|
||||
toggleSkinSelect(false);
|
||||
return true;
|
||||
}
|
||||
@@ -109,22 +119,18 @@ function toggleSkinSelect(state) {
|
||||
game.setCameraLookAt(frontCameraPosition, localPlayer.position, true);
|
||||
}
|
||||
|
||||
localPlayer.skin = allowedSkins[skinSelectorIndex][0];
|
||||
if(getGame() == VRR_GAME_GTA_IV) {
|
||||
//natives.changePlayerModel(natives.getPlayerId(), allowedSkins[skinSelectorIndex][0]);
|
||||
localPlayer.skin = allowedSkins[skinSelectorIndex][0];
|
||||
} else {
|
||||
localPlayer.skin = allowedSkins[skinSelectorIndex][0];
|
||||
}
|
||||
|
||||
skinSelectMessageTextTop = allowedSkins[skinSelectorIndex][1];
|
||||
gui.showCursor(true, false);
|
||||
//localPlayer.invincible = true;
|
||||
//localPlayer.setProofs(true, true, true, true, true);
|
||||
localPlayer.collisionsEnabled = false;
|
||||
|
||||
setLocalPlayerControlState(false, false);
|
||||
} else {
|
||||
usingSkinSelector = false;
|
||||
//game.restoreCamera(true);
|
||||
gui.showCursor(false, true);
|
||||
if(localPlayer) {
|
||||
//localPlayer.invincible = false;
|
||||
//localPlayer.setProofs(false, false, false, false, false);
|
||||
localPlayer.collisionsEnabled = true;
|
||||
}
|
||||
setLocalPlayerControlState(false, false);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -10,13 +10,13 @@
|
||||
function processSync(event, deltaTime) {
|
||||
if(localPlayer != null) {
|
||||
if(!areServerElementsSupported()) {
|
||||
triggerNetworkEvent("vrr.player.position", localPlayer.position);
|
||||
triggerNetworkEvent("vrr.player.heading", localPlayer.heading);
|
||||
sendNetworkEventToServer("vrr.player.position", localPlayer.position);
|
||||
sendNetworkEventToServer("vrr.player.heading", localPlayer.heading);
|
||||
}
|
||||
|
||||
//if(game.game == VRR_GAME_GTA_SA) {
|
||||
// let lookAtPos = getLocalPlayerLookAtPosition();
|
||||
// triggerNetworkEvent("vrr.player.lookat", lookAtPos);
|
||||
// sendNetworkEventToServer("vrr.player.lookat", lookAtPos);
|
||||
// setEntityData(localPlayer, "vrr.headLook", lookAtPos);
|
||||
// let peds = getPeds();
|
||||
// for(let i in peds) {
|
||||
@@ -31,7 +31,7 @@ function processSync(event, deltaTime) {
|
||||
logToConsole(LOG_DEBUG, `Local player died`);
|
||||
localPlayer.clearWeapons();
|
||||
calledDeathEvent = true;
|
||||
triggerNetworkEvent("vrr.playerDeath");
|
||||
sendNetworkEventToServer("vrr.playerDeath");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -84,33 +84,43 @@ function syncVehicleProperties(vehicle) {
|
||||
}
|
||||
}
|
||||
|
||||
//if(doesEntityDataExist(vehicle, "vrr.panelStatus")) {
|
||||
// let panelsStatus = getEntityData(vehicle, "vrr.panelStatus");
|
||||
// for(let i in panelsStatus) {
|
||||
// vehicle.setPanelStatus(i, panelsStatus[i]);
|
||||
// }
|
||||
//}
|
||||
if(doesEntityDataExist(vehicle, "vrr.invincible")) {
|
||||
let invincible = getEntityData(vehicle, "vrr.invincible");
|
||||
element.setProofs(invincible, invincible, invincible, invincible, invincible);
|
||||
}
|
||||
|
||||
//if(doesEntityDataExist(vehicle, "vrr.wheelStatus")) {
|
||||
// let wheelsStatus = getEntityData(vehicle, "vrr.wheelStatus");
|
||||
// for(let i in wheelsStatus) {
|
||||
// vehicle.setWheelStatus(i, wheelsStatus[i]);
|
||||
// }
|
||||
//}
|
||||
if(doesEntityDataExist(vehicle, "vrr.panelStatus")) {
|
||||
let panelsStatus = getEntityData(vehicle, "vrr.panelStatus");
|
||||
for(let i in panelsStatus) {
|
||||
vehicle.setPanelStatus(i, panelsStatus[i]);
|
||||
}
|
||||
}
|
||||
|
||||
//if(doesEntityDataExist(vehicle, "vrr.lightStatus")) {
|
||||
// let lightStatus = getEntityData(vehicle, "vrr.lightStatus");
|
||||
// for(let i in lightStatus) {
|
||||
// vehicle.setLightStatus(i, lightStatus[i]);
|
||||
// }
|
||||
//}
|
||||
if(doesEntityDataExist(vehicle, "vrr.wheelStatus")) {
|
||||
let wheelsStatus = getEntityData(vehicle, "vrr.wheelStatus");
|
||||
for(let i in wheelsStatus) {
|
||||
vehicle.setWheelStatus(i, wheelsStatus[i]);
|
||||
}
|
||||
}
|
||||
|
||||
//if(doesEntityDataExist(vehicle, "vrr.suspensionHeight")) {
|
||||
// let suspensionHeight = getEntityData(vehicle, "vrr.suspensionHeight");
|
||||
// vehicle.setSuspensionHeight(suspensionHeight);
|
||||
//}
|
||||
if(doesEntityDataExist(vehicle, "vrr.lightStatus")) {
|
||||
let lightStatus = getEntityData(vehicle, "vrr.lightStatus");
|
||||
for(let i in lightStatus) {
|
||||
vehicle.setLightStatus(i, lightStatus[i]);
|
||||
}
|
||||
}
|
||||
|
||||
if(doesEntityDataExist(vehicle, "vrr.suspensionHeight")) {
|
||||
let suspensionHeight = getEntityData(vehicle, "vrr.suspensionHeight");
|
||||
vehicle.setSuspensionHeight(suspensionHeight);
|
||||
}
|
||||
|
||||
if(getGame() == VRR_GAME_GTA_SA) {
|
||||
let allUpgrades = getGameData().vehicleUpgrades[getGame()];
|
||||
for(let i in allUpgrades) {
|
||||
vehicle.removeUpgrade(i);
|
||||
}
|
||||
|
||||
if(doesEntityDataExist(vehicle, "vrr.upgrades")) {
|
||||
let upgrades = getEntityData(vehicle, "vrr.upgrades");
|
||||
for(let i in upgrades) {
|
||||
@@ -131,18 +141,6 @@ function syncVehicleProperties(vehicle) {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if(getGame() == VRR_GAME_GTA_III) {
|
||||
if(vehicle.isOwner && vehicle.modelIndex == 116) {
|
||||
vehicle.colour1 = 0;
|
||||
vehicle.colour2 = 1;
|
||||
}
|
||||
} else if(getGame() == VRR_GAME_GTA_VC) {
|
||||
if(vehicle.isOwner && vehicle.modelIndex == 156) {
|
||||
vehicle.colour1 = 0;
|
||||
vehicle.colour2 = 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// ===========================================================================
|
||||
|
||||
@@ -184,11 +184,14 @@ function setLocalPlayerFrozenState(state) {
|
||||
function setLocalPlayerControlState(controlState, cursorState = false) {
|
||||
logToConsole(LOG_DEBUG, `[VRR.Utilities] Setting control state to ${controlState} (Cursor: ${cursorState})`);
|
||||
controlsEnabled = controlState;
|
||||
//localPlayer.invincible = true;
|
||||
//if(getGame() != VRR_GAME_GTA_IV) {
|
||||
// localPlayer.collisionsEnabled = controlState;
|
||||
// localPlayer.invincible = false;
|
||||
//}
|
||||
if(getGame() == VRR_GAME_GTA_III || getGame() == VRR_GAME_GTA_VC) {
|
||||
game.SET_PLAYER_CONTROL(localClient.index, boolToInt(controlState));
|
||||
}
|
||||
|
||||
if(getGame() != VRR_GAME_GTA_IV) {
|
||||
localPlayer.collisionsEnabled = controlState;
|
||||
localPlayer.invincible = true;
|
||||
}
|
||||
}
|
||||
|
||||
// ===========================================================================
|
||||
@@ -261,10 +264,10 @@ function runClientCode(code, returnTo) {
|
||||
try {
|
||||
returnValue = eval("(" + code + ")");
|
||||
} catch(error) {
|
||||
triggerNetworkEvent("vrr.runCodeFail", returnTo, code);
|
||||
sendNetworkEventToServer("vrr.runCodeFail", returnTo, code);
|
||||
return false;
|
||||
}
|
||||
triggerNetworkEvent("vrr.runCodeSuccess", returnTo, code, returnValue);
|
||||
sendNetworkEventToServer("vrr.runCodeSuccess", returnTo, code, returnValue);
|
||||
}
|
||||
|
||||
// ===========================================================================
|
||||
@@ -282,26 +285,21 @@ function enterVehicleAsPassenger() {
|
||||
|
||||
function giveLocalPlayerWeapon(weaponId, ammo, active) {
|
||||
logToConsole(LOG_DEBUG, `[VRR.Utilities] Giving weapon ${weaponId} with ${ammo} ammo`);
|
||||
localPlayer.giveWeapon(weaponId, ammo, active);
|
||||
forceWeaponAmmo = localPlayer.getWeaponAmmunition(getWeaponSlot(weaponId));
|
||||
forceWeaponClipAmmo = localPlayer.getWeaponClipAmmunition(getWeaponSlot(weaponId));
|
||||
forceWeapon = weaponId;
|
||||
}
|
||||
|
||||
// ===========================================================================
|
||||
|
||||
function giveLocalPlayerWeapon(weaponId, ammo, active) {
|
||||
logToConsole(LOG_DEBUG, `[VRR.Utilities] Giving weapon ${weaponId} with ${ammo} ammo`);
|
||||
if(getGame() == VRR_GAME_MAFIA_ONE) {
|
||||
localPlayer.giveWeapon(weaponId, 0, ammo);
|
||||
forceWeaponAmmo = 0;
|
||||
forceWeaponClipAmmo = ammo;
|
||||
} else {
|
||||
localPlayer.giveWeapon(weaponId, ammo, active);
|
||||
forceWeaponAmmo = localPlayer.getWeaponAmmunition(getWeaponSlot(weaponId));
|
||||
forceWeaponClipAmmo = localPlayer.getWeaponClipAmmunition(getWeaponSlot(weaponId));
|
||||
if(getGame() < VRR_GAME_GTA_IV) {
|
||||
forceWeaponAmmo = localPlayer.getWeaponAmmunition(getWeaponSlot(weaponId));
|
||||
forceWeaponClipAmmo = localPlayer.getWeaponClipAmmunition(getWeaponSlot(weaponId));
|
||||
} else {
|
||||
forceWeaponAmmo = ammo;
|
||||
forceWeaponClipAmmo = ammo;
|
||||
}
|
||||
}
|
||||
forceWeapon = weaponId;
|
||||
}
|
||||
|
||||
// ===========================================================================
|
||||
@@ -542,17 +540,19 @@ function processWantedLevelReset() {
|
||||
}
|
||||
|
||||
if(typeof localPlayer.wantedLevel != "undefined") {
|
||||
localPlayer.wantedLevel = 0;
|
||||
localPlayer.wantedLevel = forceWantedLevel;
|
||||
}
|
||||
}
|
||||
|
||||
// ===========================================================================
|
||||
|
||||
function processLocalPlayerVehicleControlState() {
|
||||
let position = getLocalPlayerPosition();
|
||||
|
||||
if(areServerElementsSupported()) {
|
||||
if(inVehicle && localPlayer.vehicle != null) {
|
||||
if(getEntityData(localPlayer.vehicle, "vrr.engine") == false) {
|
||||
localPlayer.vehicle.engine = false;
|
||||
}
|
||||
|
||||
if(!localPlayer.vehicle.engine) {
|
||||
if(typeof localPlayer.vehicle.velocity != "undefined") {
|
||||
localPlayer.vehicle.velocity = toVector3(0.0, 0.0, 0.0);
|
||||
@@ -600,8 +600,8 @@ function processLocalPlayerSphereEntryExitHandling() {
|
||||
function processJobRouteSphere() {
|
||||
if(game.game == VRR_GAME_GTA_SA) {
|
||||
let position = getLocalPlayerPosition();
|
||||
if(jobRouteStopSphere != null) {
|
||||
if(getDistance(position, jobRouteStopSphere.position) <= 2.0) {
|
||||
if(jobRouteLocationSphere != null) {
|
||||
if(getDistance(position, jobRouteLocationSphere.position) <= 2.0) {
|
||||
enteredJobRouteSphere();
|
||||
}
|
||||
}
|
||||
@@ -615,11 +615,15 @@ function forceLocalPlayerEquippedWeaponItem() {
|
||||
if(forceWeapon != 0) {
|
||||
if(localPlayer.weapon != forceWeapon) {
|
||||
localPlayer.weapon = forceWeapon;
|
||||
localPlayer.setWeaponClipAmmunition(getWeaponSlot(forceWeapon), forceWeaponClipAmmo);
|
||||
localPlayer.setWeaponAmmunition(getWeaponSlot(forceWeapon), forceWeaponAmmo);
|
||||
if(getGame() <= VRR_GAME_GTA_IV) {
|
||||
localPlayer.setWeaponClipAmmunition(getWeaponSlot(forceWeapon), forceWeaponClipAmmo);
|
||||
localPlayer.setWeaponAmmunition(getWeaponSlot(forceWeapon), forceWeaponAmmo);
|
||||
}
|
||||
} else {
|
||||
forceWeaponClipAmmo = localPlayer.getWeaponClipAmmunition(getWeaponSlot(forceWeapon));
|
||||
forceWeaponAmmo = localPlayer.getWeaponAmmunition(getWeaponSlot(forceWeapon));
|
||||
if(getGame() <= VRR_GAME_GTA_IV) {
|
||||
forceWeaponClipAmmo = localPlayer.getWeaponClipAmmunition(getWeaponSlot(forceWeapon));
|
||||
forceWeaponAmmo = localPlayer.getWeaponAmmunition(getWeaponSlot(forceWeapon));
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if(localPlayer.weapon > 0) {
|
||||
@@ -731,7 +735,7 @@ function processNearbyPickups() {
|
||||
//if(pickups[i].interior == localPlayer.interior && pickups[i].dimension == localPlayer.dimension) {
|
||||
if(currentPickup != pickups[i]) {
|
||||
currentPickup = pickups[i];
|
||||
triggerNetworkEvent("vrr.pickup", pickups[i].id);
|
||||
sendNetworkEventToServer("vrr.pickup", pickups[i].id);
|
||||
}
|
||||
//}
|
||||
}
|
||||
@@ -746,14 +750,19 @@ function setUpInitialGame() {
|
||||
game.SET_PLAYER_NEVER_GETS_TIRED(game.GET_PLAYER_ID(), 0);
|
||||
game.setGameStat(STAT_PROGRESSMADE, 9999);
|
||||
game.setGameStat(STAT_TOTALPROGRESSINGAME, 9999);
|
||||
game.SET_CAR_DENSITY_MULTIPLIER(3.0);
|
||||
game.SET_PED_DENSITY_MULTIPLIER(3.0);
|
||||
game.onMission = true;
|
||||
SetStandardControlsEnabled(true);
|
||||
return true;
|
||||
}
|
||||
|
||||
if(getGame() == VRR_GAME_GTA_VC) {
|
||||
game.SET_PLAYER_NEVER_GETS_TIRED(game.GET_PLAYER_ID(), 0);
|
||||
game.setGameStat(STAT_PROGRESSMADE, 0);
|
||||
game.setGameStat(STAT_TOTALPROGRESSINGAME, 0);
|
||||
game.setGameStat(STAT_PROGRESSMADE, 9999);
|
||||
game.setGameStat(STAT_TOTALPROGRESSINGAME, 9999);
|
||||
game.SET_CAR_DENSITY_MULTIPLIER(3.0);
|
||||
game.SET_PED_DENSITY_MULTIPLIER(3.0);
|
||||
|
||||
game.REQUEST_ANIMATION("bikev");
|
||||
game.REQUEST_ANIMATION("bikeh");
|
||||
@@ -779,6 +788,7 @@ function setUpInitialGame() {
|
||||
|
||||
game.LOAD_ALL_MODELS_NOW();
|
||||
game.onMission = true;
|
||||
SetStandardControlsEnabled(true);
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -787,14 +797,14 @@ function setUpInitialGame() {
|
||||
game.setGameStat(STAT_WEAPONTYPE_PISTOL_SILENCED_SKILL, 400);
|
||||
game.setGameStat(STAT_WEAPONTYPE_DESERT_EAGLE_SKILL, 400);
|
||||
game.setGameStat(STAT_WEAPONTYPE_SHOTGUN_SKILL, 400);
|
||||
game.setGameStat(STAT_WEAPONTYPE_SAWNOFF_SHOTGUN_SKILL, 1);
|
||||
game.setGameStat(STAT_WEAPONTYPE_SAWNOFF_SHOTGUN_SKILL, 400);
|
||||
game.setGameStat(STAT_WEAPONTYPE_SPAS12_SHOTGUN_SKILL, 400);
|
||||
game.setGameStat(STAT_WEAPONTYPE_MICRO_UZI_SKILL, 400);
|
||||
game.setGameStat(STAT_WEAPONTYPE_MP5_SKILL, 400);
|
||||
game.setGameStat(STAT_WEAPONTYPE_AK47_SKILL, 400);
|
||||
game.setGameStat(STAT_WEAPONTYPE_M4_SKILL, 400);
|
||||
game.setGameStat(STAT_DRIVING_SKILL, 9999);
|
||||
game.setGameStat(STAT_FAT, 0);
|
||||
game.setGameStat(STAT_FAT, 9999);
|
||||
game.setGameStat(STAT_ENERGY, 9999);
|
||||
game.setGameStat(STAT_CYCLE_SKILL, 9999);
|
||||
game.setGameStat(STAT_BIKE_SKILL, 9999);
|
||||
@@ -804,9 +814,9 @@ function setUpInitialGame() {
|
||||
game.setGameStat(STAT_RESPECT_TOTAL, 0);
|
||||
game.setGameStat(STAT_SEX_APPEAL, 0);
|
||||
game.setGameStat(STAT_STAMINA, 9999);
|
||||
game.setGameStat(STAT_TOTAL_PROGRESS, 100);
|
||||
game.setGameStat(STAT_TOTAL_PROGRESS, 9999);
|
||||
game.setGameStat(STAT_UNDERWATER_STAMINA, 9999);
|
||||
game.setGameStat(STAT_BODY_MUSCLE, 0);
|
||||
game.setGameStat(STAT_BODY_MUSCLE, 9999);
|
||||
|
||||
game.setDefaultInteriors(false);
|
||||
game.onMission = true;
|
||||
@@ -814,7 +824,7 @@ function setUpInitialGame() {
|
||||
}
|
||||
|
||||
if(getGame() == VRR_GAME_GTA_IV) {
|
||||
natives.allowEmergencyServices(true);
|
||||
natives.allowEmergencyServices(false);
|
||||
natives.setCreateRandomCops(true);
|
||||
natives.setMaxWantedLevel(0);
|
||||
natives.setWantedMultiplier(0.0);
|
||||
@@ -826,13 +836,13 @@ function setUpInitialGame() {
|
||||
natives.setPlayersDropMoneyInNetworkGame(false);
|
||||
natives.setSyncWeatherAndGameTime(false);
|
||||
natives.usePlayerColourInsteadOfTeamColour(true);
|
||||
natives.setDisplayPlayerNameAndIcon(false);
|
||||
natives.setDisplayPlayerNameAndIcon(natives.getPlayerId(), false);
|
||||
natives.removeTemporaryRadarBlipsForPickups();
|
||||
natives.setPickupsFixCars(false);
|
||||
natives.displayCash(true);
|
||||
natives.displayAmmo(true);
|
||||
natives.displayHud(true);
|
||||
natives.displayAreaName(true);
|
||||
natives.displayCash(false);
|
||||
natives.displayAmmo(false);
|
||||
natives.displayHud(false);
|
||||
natives.displayAreaName(false);
|
||||
natives.setPoliceRadarBlips(false);
|
||||
|
||||
natives.requestAnims("DANCING");
|
||||
@@ -861,18 +871,18 @@ function processGameSpecifics() {
|
||||
function processVehiclePurchasing() {
|
||||
if(vehiclePurchaseState == VRR_VEHBUYSTATE_TESTDRIVE) {
|
||||
if(inVehicle == false) {
|
||||
vehiclePurchaseState = VRR_VEHBUYSTATE_EXITEDVEH;
|
||||
triggerNetworkEvent("vrr.vehBuyState", VRR_VEHBUYSTATE_EXITEDVEH);
|
||||
vehiclePurchaseState = VRR_VEHBUYSTATE_EXITVEH;
|
||||
sendNetworkEventToServer("vrr.vehBuyState", VRR_VEHBUYSTATE_EXITVEH);
|
||||
return false;
|
||||
} else {
|
||||
if(vehiclePurchasing.id == inVehicle) {
|
||||
if(vehiclePurchasing == inVehicle) {
|
||||
if(getDistance(inVehicle.position, vehiclePurchasePosition) >= 25) {
|
||||
vehiclePurchaseState = VRR_VEHBUYSTATE_FARENOUGH;
|
||||
triggerNetworkEvent("vrr.vehBuyState", VRR_VEHBUYSTATE_FARENOUGH);
|
||||
sendNetworkEventToServer("vrr.vehBuyState", VRR_VEHBUYSTATE_FARENOUGH);
|
||||
}
|
||||
} else {
|
||||
vehiclePurchaseState = VRR_VEHBUYSTATE_WRONGVEH;
|
||||
triggerNetworkEvent("vrr.vehBuyState", VRR_VEHBUYSTATE_WRONGVEH);
|
||||
sendNetworkEventToServer("vrr.vehBuyState", VRR_VEHBUYSTATE_WRONGVEH);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -880,10 +890,16 @@ function processVehiclePurchasing() {
|
||||
|
||||
// ===========================================================================
|
||||
|
||||
function setVehiclePurchaseState(state, vehicle, position) {
|
||||
function setVehiclePurchaseState(state, vehicleId, position) {
|
||||
vehiclePurchaseState = state;
|
||||
|
||||
if(vehicleId != null) {
|
||||
vehiclePurchasing = getElementFromId(vehicleId);
|
||||
} else {
|
||||
vehiclePurchasing = null;
|
||||
}
|
||||
|
||||
vehiclePurchasePosition = position;
|
||||
vehiclePurchasing = vehicle;
|
||||
}
|
||||
|
||||
// ===========================================================================
|
||||
@@ -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}`);
|
||||
}
|
||||
|
||||
// ===========================================================================
|
||||
@@ -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) {
|
||||
|
||||
}
|
||||
|
||||
// ===========================================================================
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
// ===========================================================================
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
// ===========================================================================
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
// ===========================================================================
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
// ===========================================================================
|
||||
@@ -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"]);
|
||||
}
|
||||
}
|
||||
};
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
// ==========================================================================
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
// ===========================================================================
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
// ===========================================================================
|
||||
@@ -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"));
|
||||
}
|
||||
|
||||
// ===========================================================================
|
||||
@@ -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
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
// ===========================================================================
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
// ===========================================================================
|
||||
@@ -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`);
|
||||
}
|
||||
|
||||
// ===========================================================================
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
@@ -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;
|
||||
//}
|
||||
}
|
||||
|
||||
@@ -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
120
scripts/server/gate.js
Normal 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);
|
||||
}
|
||||
|
||||
// ===========================================================================
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
// ===========================================================================
|
||||
@@ -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) {
|
||||
|
||||
@@ -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
85
scripts/server/index.js
Normal 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");
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
// ===========================================================================
|
||||
@@ -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
@@ -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;
|
||||
}
|
||||
|
||||
// ===========================================================================
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
// ===========================================================================
|
||||
@@ -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));
|
||||
}
|
||||
|
||||
// ===========================================================================
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
// ===========================================================================
|
||||
@@ -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"
|
||||
]
|
||||
}
|
||||
@@ -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(", "));
|
||||
|
||||
@@ -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) {
|
||||
}
|
||||
);
|
||||
});
|
||||
}
|
||||
|
||||
// ===========================================================================
|
||||
@@ -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}`);
|
||||
}
|
||||
|
||||
// ===========================================================================
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
// ===========================================================================
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
// ===========================================================================
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
// ===========================================================================
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
// ===========================================================================
|
||||
@@ -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)}`);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -20,7 +20,7 @@ function initServerScripts() {
|
||||
initClanScript();
|
||||
initHouseScript();
|
||||
initChatScript();
|
||||
initModerationScript();
|
||||
initStaffScript();
|
||||
initAccountScript();
|
||||
initSubAccountScript();
|
||||
initChatScript();
|
||||
|
||||
@@ -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));
|
||||
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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
@@ -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));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// ===========================================================================
|
||||
@@ -33,7 +33,7 @@ const VRR_WEAPON_DAMAGE_EVENT_MACE = 4;
|
||||
const VRR_GAME_GTA_III = 1;
|
||||
const VRR_GAME_GTA_VC = 2;
|
||||
const VRR_GAME_GTA_SA = 3;
|
||||
const VRR_GAME_GTA_IV = 4;
|
||||
const VRR_GAME_GTA_IV = 5;
|
||||
const VRR_GAME_GTA_V = 50;
|
||||
const VRR_GAME_MAFIA_ONE = 10;
|
||||
const VRR_GAME_MAFIA_TWO = 11;
|
||||
@@ -61,10 +61,13 @@ const VRR_PROPLABEL_INFO_BUYBIZ = 8;
|
||||
|
||||
// Animation Types
|
||||
const VRR_ANIMTYPE_NONE = 0;
|
||||
const VRR_ANIMTYPE_ADD = 1;
|
||||
const VRR_ANIMTYPE_NORMAL = 1;
|
||||
const VRR_ANIMTYPE_BLEND = 2;
|
||||
const VRR_ANIMTYPE_SHARED = 3; // Forces this animation to play in sync with another ped's mirrored anim (handshake, kiss, gang signs, etc)
|
||||
const VRR_ANIMTYPE_SPECIALACTION = 4; // This animtype uses a special action (only in SA)
|
||||
const VRR_ANIMTYPE_SURRENDER = 5; // This animtype is used to surrender (like handsup or cower)
|
||||
const VRR_ANIMTYPE_FORCED = 6; // This animtype is forced (can't use stopanim to get out of it)
|
||||
const VRR_ANIMTYPE_FREEZE = 7; // This animtype is forced (can't use stopanim to get out of it)
|
||||
|
||||
// Animation Move Types
|
||||
const VRR_ANIMMOVE_NONE = 0;
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user