Merge branch 'nightly' into patch-1

This commit is contained in:
Vortrex
2023-03-08 23:43:48 -06:00
committed by GitHub
36 changed files with 830 additions and 279 deletions

View File

@@ -782,5 +782,13 @@
"ResetActionTipsConfirm": "Are you sure you want to reset all seen action tips?", "ResetActionTipsConfirm": "Are you sure you want to reset all seen action tips?",
"ActionTipsReset": "All seen action tips have been reset.", "ActionTipsReset": "All seen action tips have been reset.",
"NormalChatDisabled": "Normal chat is disabled by server admin. Use chat commands instead.", "NormalChatDisabled": "Normal chat is disabled by server admin. Use chat commands instead.",
"GlobalChatDisabled": "Global out-of-character chat is disabled by server admin" "GlobalChatDisabled": "Global out-of-character chat is disabled by server admin",
"CantEditJobUniforms": "You can't edit job uniforms!",
"PlayerNotSurrendered": "The player must be surrendered (hands up, be knocked out, or tazed)!",
"PlayerRemovedFromJob": "You removed {1} from the job",
"RemovedFromJob": "You were removed from the job by {1}",
"UnableToCallPlayer": "{1} can't be called right now",
"NoRadioToUse": "You must have a radio, or be in a vehicle with a radio!",
"FrequencyMustBeNumber": "The radio channel must be a number!",
"FrequencyMustBeBetween": "The radio channel must be between {1} and {2}!"
} }

View File

@@ -780,5 +780,13 @@
"ResetActionTipsConfirm": "Are you sure you want to reset all seen action tips?", "ResetActionTipsConfirm": "Are you sure you want to reset all seen action tips?",
"ActionTipsReset": "All seen action tips have been reset.", "ActionTipsReset": "All seen action tips have been reset.",
"NormalChatDisabled": "Normal chat is disabled by server admin. Use chat commands instead.", "NormalChatDisabled": "Normal chat is disabled by server admin. Use chat commands instead.",
"GlobalChatDisabled": "Global out-of-character chat is disabled by server admin" "GlobalChatDisabled": "Global out-of-character chat is disabled by server admin",
"CantEditJobUniforms": "You can't edit job uniforms!",
"PlayerNotSurrendered": "The player must be surrendered (hands up, be knocked out, or tazed)!",
"PlayerRemovedFromJob": "You removed {1} from the job",
"RemovedFromJob": "You were removed from the job by {1}",
"UnableToCallPlayer": "{1} can't be called right now",
"NoRadioToUse": "You must have a radio, or be in a vehicle with a radio!",
"FrequencyMustBeNumber": "The radio channel must be a number!",
"FrequencyMustBeBetween": "The radio channel must be between {1} and {2}!"
} }

View File

@@ -778,5 +778,13 @@
"ResetActionTipsConfirm": "Are you sure you want to reset all seen action tips?", "ResetActionTipsConfirm": "Are you sure you want to reset all seen action tips?",
"ActionTipsReset": "All seen action tips have been reset.", "ActionTipsReset": "All seen action tips have been reset.",
"NormalChatDisabled": "Normal chat is disabled by server admin. Use chat commands instead.", "NormalChatDisabled": "Normal chat is disabled by server admin. Use chat commands instead.",
"GlobalChatDisabled": "Global out-of-character chat is disabled by server admin" "GlobalChatDisabled": "Global out-of-character chat is disabled by server admin",
"CantEditJobUniforms": "You can't edit job uniforms!",
"PlayerNotSurrendered": "The player must be surrendered (hands up, be knocked out, or tazed)!",
"PlayerRemovedFromJob": "You removed {1} from the job",
"RemovedFromJob": "You were removed from the job by {1}",
"UnableToCallPlayer": "{1} can't be called right now",
"NoRadioToUse": "You must have a radio, or be in a vehicle with a radio!",
"FrequencyMustBeNumber": "The radio channel must be a number!",
"FrequencyMustBeBetween": "The radio channel must be between {1} and {2}!"
} }

View File

@@ -789,5 +789,13 @@
"JobInviteAlreadyHasJob": "That player already has a job!", "JobInviteAlreadyHasJob": "That player already has a job!",
"JobInviteRequest": "{1} invited you to the {2} job.", "JobInviteRequest": "{1} invited you to the {2} job.",
"CantAddJobMembers": "You can't invite new members to the job!", "CantAddJobMembers": "You can't invite new members to the job!",
"CantRemoveJobMembers": "You can't remove members from the job!" "CantRemoveJobMembers": "You can't remove members from the job!",
"CantEditJobUniforms": "You can't edit job uniforms!",
"PlayerNotSurrendered": "The player must be surrendered (hands up, be knocked out, or tazed)!",
"PlayerRemovedFromJob": "You removed {1} from the job",
"RemovedFromJob": "You were removed from the job by {1}",
"UnableToCallPlayer": "{1} can't be called right now",
"NoRadioToUse": "You must have a radio, or be in a vehicle with a radio!",
"FrequencyMustBeNumber": "The radio channel must be a number!",
"FrequencyMustBeBetween": "The radio channel must be between {1} and {2}!"
} }

View File

@@ -777,5 +777,13 @@
"ResetActionTipsConfirm": "Are you sure you want to reset all seen action tips?", "ResetActionTipsConfirm": "Are you sure you want to reset all seen action tips?",
"ActionTipsReset": "All seen action tips have been reset.", "ActionTipsReset": "All seen action tips have been reset.",
"NormalChatDisabled": "Normal chat is disabled by server admin. Use chat commands instead.", "NormalChatDisabled": "Normal chat is disabled by server admin. Use chat commands instead.",
"GlobalChatDisabled": "Global out-of-character chat is disabled by server admin" "GlobalChatDisabled": "Global out-of-character chat is disabled by server admin",
"CantEditJobUniforms": "You can't edit job uniforms!",
"PlayerNotSurrendered": "The player must be surrendered (hands up, be knocked out, or tazed)!",
"PlayerRemovedFromJob": "You removed {1} from the job",
"RemovedFromJob": "You were removed from the job by {1}",
"UnableToCallPlayer": "{1} can't be called right now",
"NoRadioToUse": "You must have a radio, or be in a vehicle with a radio!",
"FrequencyMustBeNumber": "The radio channel must be a number!",
"FrequencyMustBeBetween": "The radio channel must be between {1} and {2}!"
} }

View File

@@ -778,5 +778,13 @@
"ResetActionTipsConfirm": "Are you sure you want to reset all seen action tips?", "ResetActionTipsConfirm": "Are you sure you want to reset all seen action tips?",
"ActionTipsReset": "All seen action tips have been reset.", "ActionTipsReset": "All seen action tips have been reset.",
"NormalChatDisabled": "Normal chat is disabled by server admin. Use chat commands instead.", "NormalChatDisabled": "Normal chat is disabled by server admin. Use chat commands instead.",
"GlobalChatDisabled": "Global out-of-character chat is disabled by server admin" "GlobalChatDisabled": "Global out-of-character chat is disabled by server admin",
"CantEditJobUniforms": "You can't edit job uniforms!",
"PlayerNotSurrendered": "The player must be surrendered (hands up, be knocked out, or tazed)!",
"PlayerRemovedFromJob": "You removed {1} from the job",
"RemovedFromJob": "You were removed from the job by {1}",
"UnableToCallPlayer": "{1} can't be called right now",
"NoRadioToUse": "You must have a radio, or be in a vehicle with a radio!",
"FrequencyMustBeNumber": "The radio channel must be a number!",
"FrequencyMustBeBetween": "The radio channel must be between {1} and {2}!"
} }

View File

@@ -777,5 +777,13 @@
"ResetActionTipsConfirm": "Are you sure you want to reset all seen action tips?", "ResetActionTipsConfirm": "Are you sure you want to reset all seen action tips?",
"ActionTipsReset": "All seen action tips have been reset.", "ActionTipsReset": "All seen action tips have been reset.",
"NormalChatDisabled": "Normal chat is disabled by server admin. Use chat commands instead.", "NormalChatDisabled": "Normal chat is disabled by server admin. Use chat commands instead.",
"GlobalChatDisabled": "Global out-of-character chat is disabled by server admin" "GlobalChatDisabled": "Global out-of-character chat is disabled by server admin",
"CantEditJobUniforms": "You can't edit job uniforms!",
"PlayerNotSurrendered": "The player must be surrendered (hands up, be knocked out, or tazed)!",
"PlayerRemovedFromJob": "You removed {1} from the job",
"RemovedFromJob": "You were removed from the job by {1}",
"UnableToCallPlayer": "{1} can't be called right now",
"NoRadioToUse": "You must have a radio, or be in a vehicle with a radio!",
"FrequencyMustBeNumber": "The radio channel must be a number!",
"FrequencyMustBeBetween": "The radio channel must be between {1} and {2}!"
} }

View File

@@ -778,5 +778,13 @@
"ResetActionTipsConfirm": "Are you sure you want to reset all seen action tips?", "ResetActionTipsConfirm": "Are you sure you want to reset all seen action tips?",
"ActionTipsReset": "All seen action tips have been reset.", "ActionTipsReset": "All seen action tips have been reset.",
"NormalChatDisabled": "Normal chat is disabled by server admin. Use chat commands instead.", "NormalChatDisabled": "Normal chat is disabled by server admin. Use chat commands instead.",
"GlobalChatDisabled": "Global out-of-character chat is disabled by server admin" "GlobalChatDisabled": "Global out-of-character chat is disabled by server admin",
"CantEditJobUniforms": "You can't edit job uniforms!",
"PlayerNotSurrendered": "The player must be surrendered (hands up, be knocked out, or tazed)!",
"PlayerRemovedFromJob": "You removed {1} from the job",
"RemovedFromJob": "You were removed from the job by {1}",
"UnableToCallPlayer": "{1} can't be called right now",
"NoRadioToUse": "You must have a radio, or be in a vehicle with a radio!",
"FrequencyMustBeNumber": "The radio channel must be a number!",
"FrequencyMustBeBetween": "The radio channel must be between {1} and {2}!"
} }

View File

@@ -780,5 +780,13 @@
"ResetActionTipsConfirm": "Are you sure you want to reset all seen action tips?", "ResetActionTipsConfirm": "Are you sure you want to reset all seen action tips?",
"ActionTipsReset": "All seen action tips have been reset.", "ActionTipsReset": "All seen action tips have been reset.",
"NormalChatDisabled": "Normal chat is disabled by server admin. Use chat commands instead.", "NormalChatDisabled": "Normal chat is disabled by server admin. Use chat commands instead.",
"GlobalChatDisabled": "Global out-of-character chat is disabled by server admin" "GlobalChatDisabled": "Global out-of-character chat is disabled by server admin",
"CantEditJobUniforms": "You can't edit job uniforms!",
"PlayerNotSurrendered": "The player must be surrendered (hands up, be knocked out, or tazed)!",
"PlayerRemovedFromJob": "You removed {1} from the job",
"RemovedFromJob": "You were removed from the job by {1}",
"UnableToCallPlayer": "{1} can't be called right now",
"NoRadioToUse": "You must have a radio, or be in a vehicle with a radio!",
"FrequencyMustBeNumber": "The radio channel must be a number!",
"FrequencyMustBeBetween": "The radio channel must be between {1} and {2}!"
} }

View File

@@ -779,5 +779,13 @@
"ResetActionTipsConfirm": "Are you sure you want to reset all seen action tips?", "ResetActionTipsConfirm": "Are you sure you want to reset all seen action tips?",
"ActionTipsReset": "All seen action tips have been reset.", "ActionTipsReset": "All seen action tips have been reset.",
"NormalChatDisabled": "Normal chat is disabled by server admin. Use chat commands instead.", "NormalChatDisabled": "Normal chat is disabled by server admin. Use chat commands instead.",
"GlobalChatDisabled": "Global out-of-character chat is disabled by server admin" "GlobalChatDisabled": "Global out-of-character chat is disabled by server admin",
"CantEditJobUniforms": "You can't edit job uniforms!",
"PlayerNotSurrendered": "The player must be surrendered (hands up, be knocked out, or tazed)!",
"PlayerRemovedFromJob": "You removed {1} from the job",
"RemovedFromJob": "You were removed from the job by {1}",
"UnableToCallPlayer": "{1} can't be called right now",
"NoRadioToUse": "You must have a radio, or be in a vehicle with a radio!",
"FrequencyMustBeNumber": "The radio channel must be a number!",
"FrequencyMustBeBetween": "The radio channel must be between {1} and {2}!"
} }

View File

@@ -779,5 +779,13 @@
"ResetActionTipsConfirm": "Are you sure you want to reset all seen action tips?", "ResetActionTipsConfirm": "Are you sure you want to reset all seen action tips?",
"ActionTipsReset": "All seen action tips have been reset.", "ActionTipsReset": "All seen action tips have been reset.",
"NormalChatDisabled": "Normal chat is disabled by server admin. Use chat commands instead.", "NormalChatDisabled": "Normal chat is disabled by server admin. Use chat commands instead.",
"GlobalChatDisabled": "Global out-of-character chat is disabled by server admin" "GlobalChatDisabled": "Global out-of-character chat is disabled by server admin",
"CantEditJobUniforms": "You can't edit job uniforms!",
"PlayerNotSurrendered": "The player must be surrendered (hands up, be knocked out, or tazed)!",
"PlayerRemovedFromJob": "You removed {1} from the job",
"RemovedFromJob": "You were removed from the job by {1}",
"UnableToCallPlayer": "{1} can't be called right now",
"NoRadioToUse": "You must have a radio, or be in a vehicle with a radio!",
"FrequencyMustBeNumber": "The radio channel must be a number!",
"FrequencyMustBeBetween": "The radio channel must be between {1} and {2}!"
} }

View File

@@ -778,4 +778,12 @@
"ActionTipsReset": "Wszystkie zobaczone wskazówki dotyczące akcji zostały zresetowane.", "ActionTipsReset": "Wszystkie zobaczone wskazówki dotyczące akcji zostały zresetowane.",
"NormalChatDisabled": "Normalny czat jest wyłączony przez administratora serwera. Zamiast tego należy użyć komend czatu.", "NormalChatDisabled": "Normalny czat jest wyłączony przez administratora serwera. Zamiast tego należy użyć komend czatu.",
"GlobalChatDisabled": "Globalny czat poza postacią jest wyłączony przez administratora serwera" "GlobalChatDisabled": "Globalny czat poza postacią jest wyłączony przez administratora serwera"
"CantEditJobUniforms": "You can't edit job uniforms!",
"PlayerNotSurrendered": "The player must be surrendered (hands up, be knocked out, or tazed)!",
"PlayerRemovedFromJob": "You removed {1} from the job",
"RemovedFromJob": "You were removed from the job by {1}",
"UnableToCallPlayer": "{1} can't be called right now",
"NoRadioToUse": "You must have a radio, or be in a vehicle with a radio!",
"FrequencyMustBeNumber": "The radio channel must be a number!",
"FrequencyMustBeBetween": "The radio channel must be between {1} and {2}!"
} }

View File

@@ -778,5 +778,13 @@
"ResetActionTipsConfirm": "Are you sure you want to reset all seen action tips?", "ResetActionTipsConfirm": "Are you sure you want to reset all seen action tips?",
"ActionTipsReset": "All seen action tips have been reset.", "ActionTipsReset": "All seen action tips have been reset.",
"NormalChatDisabled": "Normal chat is disabled by server admin. Use chat commands instead.", "NormalChatDisabled": "Normal chat is disabled by server admin. Use chat commands instead.",
"GlobalChatDisabled": "Global out-of-character chat is disabled by server admin" "GlobalChatDisabled": "Global out-of-character chat is disabled by server admin",
"CantEditJobUniforms": "You can't edit job uniforms!",
"PlayerNotSurrendered": "The player must be surrendered (hands up, be knocked out, or tazed)!",
"PlayerRemovedFromJob": "You removed {1} from the job",
"RemovedFromJob": "You were removed from the job by {1}",
"UnableToCallPlayer": "{1} can't be called right now",
"NoRadioToUse": "You must have a radio, or be in a vehicle with a radio!",
"FrequencyMustBeNumber": "The radio channel must be a number!",
"FrequencyMustBeBetween": "The radio channel must be between {1} and {2}!"
} }

View File

@@ -778,5 +778,13 @@
"ResetActionTipsConfirm": "Are you sure you want to reset all seen action tips?", "ResetActionTipsConfirm": "Are you sure you want to reset all seen action tips?",
"ActionTipsReset": "All seen action tips have been reset.", "ActionTipsReset": "All seen action tips have been reset.",
"NormalChatDisabled": "Normal chat is disabled by server admin. Use chat commands instead.", "NormalChatDisabled": "Normal chat is disabled by server admin. Use chat commands instead.",
"GlobalChatDisabled": "Global out-of-character chat is disabled by server admin" "GlobalChatDisabled": "Global out-of-character chat is disabled by server admin",
"CantEditJobUniforms": "You can't edit job uniforms!",
"PlayerNotSurrendered": "The player must be surrendered (hands up, be knocked out, or tazed)!",
"PlayerRemovedFromJob": "You removed {1} from the job",
"RemovedFromJob": "You were removed from the job by {1}",
"UnableToCallPlayer": "{1} can't be called right now",
"NoRadioToUse": "You must have a radio, or be in a vehicle with a radio!",
"FrequencyMustBeNumber": "The radio channel must be a number!",
"FrequencyMustBeBetween": "The radio channel must be between {1} and {2}!"
} }

View File

@@ -784,5 +784,13 @@
"ResetActionTipsConfirm": "Are you sure you want to reset all seen action tips?", "ResetActionTipsConfirm": "Are you sure you want to reset all seen action tips?",
"ActionTipsReset": "All seen action tips have been reset.", "ActionTipsReset": "All seen action tips have been reset.",
"NormalChatDisabled": "Normal chat is disabled by server admin. Use chat commands instead.", "NormalChatDisabled": "Normal chat is disabled by server admin. Use chat commands instead.",
"GlobalChatDisabled": "Global out-of-character chat is disabled by server admin" "GlobalChatDisabled": "Global out-of-character chat is disabled by server admin",
"CantEditJobUniforms": "You can't edit job uniforms!",
"PlayerNotSurrendered": "The player must be surrendered (hands up, be knocked out, or tazed)!",
"PlayerRemovedFromJob": "You removed {1} from the job",
"RemovedFromJob": "You were removed from the job by {1}",
"UnableToCallPlayer": "{1} can't be called right now",
"NoRadioToUse": "You must have a radio, or be in a vehicle with a radio!",
"FrequencyMustBeNumber": "The radio channel must be a number!",
"FrequencyMustBeBetween": "The radio channel must be between {1} and {2}!"
} }

View File

@@ -104,7 +104,6 @@ let serverData = {
}; };
let localPlayerMoney = 0; let localPlayerMoney = 0;
let localPlayerMoneyInterval = null;
let currencyString = "${AMOUNT}"; let currencyString = "${AMOUNT}";

View File

@@ -16,9 +16,6 @@ function initEventScript() {
// =========================================================================== // ===========================================================================
function addAllEventHandlers() { function addAllEventHandlers() {
addEventHandler("OnResourceStart", onResourceStart);
addEventHandler("OnResourceReady", onResourceReady);
addEventHandler("OnResourceStop", onResourceStop);
addEventHandler("OnProcess", onProcess); addEventHandler("OnProcess", onProcess);
addEventHandler("OnKeyUp", onKeyUp); addEventHandler("OnKeyUp", onKeyUp);
addEventHandler("OnDrawnHUD", onDrawnHUD); addEventHandler("OnDrawnHUD", onDrawnHUD);
@@ -94,8 +91,11 @@ function onResourceStop(event, resource) {
function onResourceReady(event, resource) { function onResourceReady(event, resource) {
if (resource == thisResource) { if (resource == thisResource) {
logToConsole(LOG_DEBUG | LOG_WARN, `[V.RP.Event] onResourceReady called - Sending signal to server`); logToConsole(LOG_DEBUG | LOG_WARN, `[V.RP.Event] onResourceReady called - Sending signal to server`);
loadLocaleConfig();
setTimeout(function () {
initClientScripts();
sendResourceReadySignalToServer(); sendResourceReadySignalToServer();
}, 500);
} }
} }

View File

@@ -8,7 +8,7 @@
// =========================================================================== // ===========================================================================
class HouseData { class HouseData {
constructor(houseId, description, entrancePosition, blipModel, pickupModel, hasInterior) { constructor(houseId, description, entrancePosition, blipModel, pickupModel, hasInterior, locked) {
this.index = -1; this.index = -1;
this.houseId = houseId; this.houseId = houseId;
this.description = description; this.description = description;
@@ -19,14 +19,21 @@ class HouseData {
this.rentPrice = 0; this.rentPrice = 0;
this.buyPrice = 0; this.buyPrice = 0;
this.blipId = -1; this.blipId = -1;
this.locked = false; this.locked = locked;
} }
} }
// =========================================================================== // ===========================================================================
function initHouseScript() {
logToConsole(LOG_DEBUG, "[V.RP.House]: Initializing house script ...");
logToConsole(LOG_DEBUG, "[V.RP.House]: House script initialized!");
}
// ===========================================================================
function receiveHouseFromServer(houseId, isDeleted, description, entrancePosition, blipModel, pickupModel, buyPrice, rentPrice, hasInterior, locked) { function receiveHouseFromServer(houseId, isDeleted, description, entrancePosition, blipModel, pickupModel, buyPrice, rentPrice, hasInterior, locked) {
logToConsole(LOG_DEBUG, `[V.RP.House] Received house ${houseId} (${name}) from server`); logToConsole(LOG_DEBUG, `[V.RP.House] Received house ${houseId} (${description}) from server`);
if (!areServerElementsSupported() || getGame() == V_GAME_MAFIA_ONE || getGame() == V_GAME_GTA_IV) { if (!areServerElementsSupported() || getGame() == V_GAME_MAFIA_ONE || getGame() == V_GAME_GTA_IV) {
if (isDeleted == true) { if (isDeleted == true) {
@@ -96,7 +103,7 @@ function receiveHouseFromServer(houseId, isDeleted, description, entrancePositio
} }
} else { } else {
logToConsole(LOG_DEBUG, `[V.RP.House] House ${houseId} doesn't exist. Adding ...`); logToConsole(LOG_DEBUG, `[V.RP.House] House ${houseId} doesn't exist. Adding ...`);
let tempHouseData = new HouseData(houseId, description, entrancePosition, blipModel, pickupModel, hasInterior); let tempHouseData = new HouseData(houseId, description, entrancePosition, blipModel, pickupModel, hasInterior, locked);
if (blipModel != -1) { if (blipModel != -1) {
let blipId = createGameBlip(tempHouseData.blipModel, tempHouseData.entrancePosition, "House"); let blipId = createGameBlip(tempHouseData.blipModel, tempHouseData.entrancePosition, "House");
if (blipId != -1) { if (blipId != -1) {

View File

@@ -18,10 +18,11 @@ let payPhoneRingingSound = null;
let payPhoneDialingSound = null; let payPhoneDialingSound = null;
let payPhonePickupSound = null; let payPhonePickupSound = null;
let payPhoneHangupSound = null; let payPhoneHangupSound = null;
let payPhoneRingingSoundFilePath = "files/sounds/payphone/old-payphone-ring.mp3";
let payPhoneDialingSoundFilePath = "files/sounds/payphone/old-payphone-dial.mp3"; let payPhoneRingingSoundFilePath = "";
let payPhonePickupSoundFilePath = "files/sounds/payphone/old-payphone-pickup.mp3"; let payPhoneDialingSoundFilePath = "";
let payPhoneHangupSoundFilePath = "files/sounds/payphone/old-payphone-hangup.mp3"; let payPhonePickupSoundFilePath = "";
let payPhoneHangupSoundFilePath = "";
let ringingPayPhone = -1; let ringingPayPhone = -1;
@@ -40,6 +41,21 @@ class PayPhoneData {
function initPayPhoneScript() { function initPayPhoneScript() {
logToConsole(LOG_DEBUG, "[V.RP.PayPhone]: Initializing payphone script ..."); logToConsole(LOG_DEBUG, "[V.RP.PayPhone]: Initializing payphone script ...");
if (getGame() == V_GAME_MAFIA_ONE) {
payPhoneRingingSoundFilePath = "files/sounds/payphone/old-payphone-ring.mp3";
payPhoneDialingSoundFilePath = "files/sounds/payphone/old-payphone-dial.mp3";
payPhonePickupSoundFilePath = "files/sounds/payphone/old-payphone-pickup.mp3";
payPhoneHangupSoundFilePath = "files/sounds/payphone/old-payphone-hangup.mp3";
} else {
if (getGame() != V_GAME_GTA_SA) {
payPhoneRingingSoundFilePath = "files/sounds/payphone/old-payphone-ring.mp3";
payPhoneDialingSoundFilePath = "files/sounds/payphone/old-payphone-dial.mp3";
payPhonePickupSoundFilePath = "files/sounds/payphone/old-payphone-pickup.mp3";
payPhoneHangupSoundFilePath = "files/sounds/payphone/old-payphone-hangup.mp3";
}
}
//payPhoneRingingIndicatorImage = loadPayPhoneRingingIndicatorImage(); //payPhoneRingingIndicatorImage = loadPayPhoneRingingIndicatorImage();
payPhoneRingingSound = loadPayPhoneRingingSound(); payPhoneRingingSound = loadPayPhoneRingingSound();
payPhoneDialingSound = loadPayPhoneDialingSound(); payPhoneDialingSound = loadPayPhoneDialingSound();
@@ -51,6 +67,10 @@ function initPayPhoneScript() {
// =========================================================================== // ===========================================================================
function loadPayPhoneRingingIndicatorImage() { function loadPayPhoneRingingIndicatorImage() {
if (payPhoneRingingIndicatorImagePath == "") {
return null;
}
let imageStream = openFile(payPhoneRingingIndicatorImagePath); let imageStream = openFile(payPhoneRingingIndicatorImagePath);
let tempImage = null; let tempImage = null;
if (imageStream != null) { if (imageStream != null) {
@@ -64,6 +84,10 @@ function loadPayPhoneRingingIndicatorImage() {
// =========================================================================== // ===========================================================================
function loadPayPhoneRingingSound() { function loadPayPhoneRingingSound() {
if (payPhoneRingingSoundFilePath == "") {
return null;
}
let soundStream = openFile(payPhoneRingingSoundFilePath); let soundStream = openFile(payPhoneRingingSoundFilePath);
let tempSound = null; let tempSound = null;
if (soundStream != null) { if (soundStream != null) {
@@ -77,6 +101,10 @@ function loadPayPhoneRingingSound() {
// =========================================================================== // ===========================================================================
function loadPayPhoneDialingSound() { function loadPayPhoneDialingSound() {
if (payPhoneDialingSoundFilePath == "") {
return null;
}
let soundStream = openFile(payPhoneDialingSoundFilePath); let soundStream = openFile(payPhoneDialingSoundFilePath);
let tempSound = null; let tempSound = null;
if (soundStream != null) { if (soundStream != null) {
@@ -94,6 +122,10 @@ function loadPayPhoneDialingSound() {
// =========================================================================== // ===========================================================================
function loadPayPhonePickupSound() { function loadPayPhonePickupSound() {
if (payPhonePickupSoundFilePath == "") {
return null;
}
let soundStream = openFile(payPhonePickupSoundFilePath); let soundStream = openFile(payPhonePickupSoundFilePath);
let tempSound = null; let tempSound = null;
if (soundStream != null) { if (soundStream != null) {
@@ -111,6 +143,10 @@ function loadPayPhonePickupSound() {
// =========================================================================== // ===========================================================================
function loadPayPhoneHangupSound() { function loadPayPhoneHangupSound() {
if (payPhoneHangupSoundFilePath == "") {
return null;
}
let soundStream = openFile(payPhoneHangupSoundFilePath); let soundStream = openFile(payPhoneHangupSoundFilePath);
let tempSound = null; let tempSound = null;
if (soundStream != null) { if (soundStream != null) {
@@ -128,6 +164,10 @@ function loadPayPhoneHangupSound() {
// =========================================================================== // ===========================================================================
function processPayPhonesDistance() { function processPayPhonesDistance() {
if (payPhoneRingingSound == null) {
return false;
}
let tempRingingPhone = -1; let tempRingingPhone = -1;
for (let i in getServerData().payPhones) { for (let i in getServerData().payPhones) {
if (getServerData().payPhones[i].state == V_PAYPHONE_STATE_RINGING) { if (getServerData().payPhones[i].state == V_PAYPHONE_STATE_RINGING) {
@@ -231,6 +271,11 @@ function removePayPhonesFromClient() {
// =========================================================================== // ===========================================================================
function payPhoneDial() { function payPhoneDial() {
if (payPhoneDialingSound == null) {
logToConsole(LOG_DEBUG | LOG_ERROR, "[V.RP.PayPhone]: Attempted to play payphone dial sound, but sound object is null");
return false;
}
logToConsole(LOG_DEBUG, "[V.RP.PayPhone]: Playing payphone dial sound"); logToConsole(LOG_DEBUG, "[V.RP.PayPhone]: Playing payphone dial sound");
payPhoneDialingSound.play(); payPhoneDialingSound.play();
} }
@@ -238,6 +283,11 @@ function payPhoneDial() {
// =========================================================================== // ===========================================================================
function payPhoneHangup() { function payPhoneHangup() {
if (payPhoneHangupSound == null) {
logToConsole(LOG_DEBUG | LOG_ERROR, "[V.RP.PayPhone]: Attempted to play payphone hangup sound, but sound object is null");
return false;
}
logToConsole(LOG_DEBUG, "[V.RP.PayPhone]: Playing payphone hangup sound"); logToConsole(LOG_DEBUG, "[V.RP.PayPhone]: Playing payphone hangup sound");
payPhoneHangupSound.play(); payPhoneHangupSound.play();
} }
@@ -245,6 +295,11 @@ function payPhoneHangup() {
// =========================================================================== // ===========================================================================
function payPhonePickup() { function payPhonePickup() {
if (payPhonePickupSound == null) {
logToConsole(LOG_DEBUG | LOG_ERROR, "[V.RP.PayPhone]: Attempted to play payphone pickup sound, but sound object is null");
return false;
}
logToConsole(LOG_DEBUG, "[V.RP.PayPhone]: Playing payphone pickup sound"); logToConsole(LOG_DEBUG, "[V.RP.PayPhone]: Playing payphone pickup sound");
payPhonePickupSound.play(); payPhonePickupSound.play();
} }

View File

@@ -25,6 +25,11 @@ function initClientScripts() {
initPayPhoneScript(); initPayPhoneScript();
initTimersScript(); initTimersScript();
initJobScript(); initJobScript();
initItemScript();
initBusinessScript();
initHouseScript();
loadLocaleConfig();
addAllNetworkHandlers(); addAllNetworkHandlers();
@@ -203,6 +208,8 @@ function setUpInitialGame() {
// =========================================================================== // ===========================================================================
initClientScripts(); addEventHandler("OnResourceStart", onResourceStart);
addEventHandler("OnResourceReady", onResourceReady);
addEventHandler("OnResourceStop", onResourceStop);
// =========================================================================== // ===========================================================================

View File

@@ -7,6 +7,10 @@
// TYPE: Client (JavaScript) // TYPE: Client (JavaScript)
// =========================================================================== // ===========================================================================
let localPlayerMoneyInterval = null;
// ===========================================================================
function initTimersScript() { function initTimersScript() {
logToConsole(LOG_DEBUG, "[V.RP.Timers]: Initializing timer script ..."); logToConsole(LOG_DEBUG, "[V.RP.Timers]: Initializing timer script ...");
logToConsole(LOG_DEBUG, "[V.RP.Timers]: Timers script initialized!"); logToConsole(LOG_DEBUG, "[V.RP.Timers]: Timers script initialized!");
@@ -15,6 +19,7 @@ function initTimersScript() {
// =========================================================================== // ===========================================================================
function initTimers() { function initTimers() {
localPlayerMoneyInterval = setInterval(updateLocalPlayerMoney, 1000 * 5);
} }
// =========================================================================== // ===========================================================================

View File

@@ -95,6 +95,9 @@ class BusinessData {
this.labelHelpType = V_PROPLABEL_INFO_NONE; this.labelHelpType = V_PROPLABEL_INFO_NONE;
this.whoAdded = 0;
this.whenAdded = 0;
if (dbAssoc) { if (dbAssoc) {
this.databaseId = toInteger(dbAssoc["biz_id"]); this.databaseId = toInteger(dbAssoc["biz_id"]);
this.name = toString(dbAssoc["biz_name"]); this.name = toString(dbAssoc["biz_name"]);
@@ -124,9 +127,10 @@ class BusinessData {
this.entranceFee = toInteger(dbAssoc["biz_entrance_fee"]); this.entranceFee = toInteger(dbAssoc["biz_entrance_fee"]);
this.till = toInteger(dbAssoc["biz_till"]); this.till = toInteger(dbAssoc["biz_till"]);
this.labelHelpType = toInteger(dbAssoc["biz_label_help_type"]); this.labelHelpType = toInteger(dbAssoc["biz_label_help_type"]);
this.streamingRadioStation = toInteger(dbAssoc["biz_radio_station"]); this.streamingRadioStation = toInteger(dbAssoc["biz_radio_station"]);
this.whoAdded = toInteger(dbAssoc["biz_who_added"]);
this.whenAdded = toInteger(dbAssoc["biz_when_added"]);
} }
}; };
}; };
@@ -315,7 +319,9 @@ function createBusinessCommand(command, params, client) {
-1, -1,
getPlayerInterior(client), getPlayerInterior(client),
getPlayerDimension(client), getPlayerDimension(client),
getPlayerData(client).interiorScene); getPlayerData(client).interiorScene,
getPlayerData(client).accountData.databaseId
);
messageAdmins(`{adminOrange}${getPlayerName(client)}{MAINCOLOUR} created business: {businessBlue}${params}`, true); messageAdmins(`{adminOrange}${getPlayerName(client)}{MAINCOLOUR} created business: {businessBlue}${params}`, true);
} }
@@ -357,7 +363,7 @@ function createBusinessLocationCommand(command, params, client) {
// =========================================================================== // ===========================================================================
function createBusiness(name, entrancePosition, exitPosition, entrancePickupModel = -1, entranceBlipModel = -1, entranceInterior = 0, entranceDimension = 0, entranceScene = -1) { function createBusiness(name, entrancePosition, exitPosition, entrancePickupModel = -1, entranceBlipModel = -1, entranceInterior = 0, entranceDimension = 0, entranceScene = -1, whoAdded = defaultNoAccountId) {
let tempBusinessData = new BusinessData(false); let tempBusinessData = new BusinessData(false);
tempBusinessData.name = name; tempBusinessData.name = name;
@@ -377,6 +383,9 @@ function createBusiness(name, entrancePosition, exitPosition, entrancePickupMode
tempBusinessData.exitDimension = 0; tempBusinessData.exitDimension = 0;
tempBusinessData.exitScene = -1; tempBusinessData.exitScene = -1;
tempBusinessData.whoAdded = whoAdded;
tempBusinessData.whenAdded = getCurrentUnixTimestamp();
tempBusinessData.needsSaved = true; tempBusinessData.needsSaved = true;
let businessId = getServerData().businesses.push(tempBusinessData); let businessId = getServerData().businesses.push(tempBusinessData);
setBusinessDataIndexes(); setBusinessDataIndexes();
@@ -1933,6 +1942,8 @@ function saveBusinessToDatabase(businessId) {
["biz_radio_station", (getRadioStationData(tempBusinessData.streamingRadioStationIndex) != false) ? toInteger(getRadioStationData(tempBusinessData.streamingRadioStationIndex).databaseId) : -1], ["biz_radio_station", (getRadioStationData(tempBusinessData.streamingRadioStationIndex) != false) ? toInteger(getRadioStationData(tempBusinessData.streamingRadioStationIndex).databaseId) : -1],
["biz_custom_interior", boolToInt(tempBusinessData.customInterior)], ["biz_custom_interior", boolToInt(tempBusinessData.customInterior)],
["biz_buy_price", tempBusinessData.buyPrice], ["biz_buy_price", tempBusinessData.buyPrice],
["biz_who_added", tempBusinessData.whoAdded],
["biz_when_added", tempBusinessData.whenAdded],
//["biz_rent_price", tempBusinessData.rentPrice], //["biz_rent_price", tempBusinessData.rentPrice],
]; ];

View File

@@ -207,9 +207,11 @@ function resetClientStuff(client) {
function kickAllClients() { function kickAllClients() {
getClients().forEach((client) => { getClients().forEach((client) => {
if (getPlayerData(client) != false) {
getPlayerData(client).customDisconnectReason = "ServerRestarting"; getPlayerData(client).customDisconnectReason = "ServerRestarting";
}
disconnectPlayer(client); disconnectPlayer(client);
}) });
} }
// =========================================================================== // ===========================================================================

View File

@@ -348,9 +348,10 @@ function loadCommands() {
new CommandData("use", useItemCommand, "", getStaffFlagValue("None"), true, false, "Uses the currently equipped item"), new CommandData("use", useItemCommand, "", getStaffFlagValue("None"), true, false, "Uses the currently equipped item"),
new CommandData("inv", listPlayerInventoryCommand, "", getStaffFlagValue("None"), true, false, "Shows the items in your inventory"), new CommandData("inv", listPlayerInventoryCommand, "", getStaffFlagValue("None"), true, false, "Shows the items in your inventory"),
new CommandData("inventory", listPlayerInventoryCommand, "", getStaffFlagValue("None"), true, false, "Shows the items in your inventory"), new CommandData("inventory", listPlayerInventoryCommand, "", getStaffFlagValue("None"), true, false, "Shows the items in your inventory"),
new CommandData("search", listOtherPlayerInventoryCommand, "<player name/id>", getStaffFlagValue("None"), true, false, "Shows the items in a player's inventory"),
new CommandData("items", listItemInventoryCommand, "", getStaffFlagValue("None"), true, false, "Shows the items stored in a container item"), new CommandData("items", listItemInventoryCommand, "", getStaffFlagValue("None"), true, false, "Shows the items stored in a container item"),
new CommandData("vehtrunk", listVehicleTrunkInventoryCommand, "", getStaffFlagValue("None"), true, false, "Shows the items in a vehicle's trunk"), //new CommandData("vehtrunk", listVehicleTrunkInventoryCommand, "", getStaffFlagValue("None"), true, false, "Shows the items in a vehicle's trunk"),
new CommandData("houseitems", listHouseInventoryCommand, "", getStaffFlagValue("None"), true, false, "Shows the items in the house's storage"), new CommandData("houseitems", listHouseInventoryCommand, "", getStaffFlagValue("None"), true, false, "Shows the items in the house's storage"),
new CommandData("bizstorage", listBusinessStorageInventoryCommand, "", getStaffFlagValue("None"), true, false, "Shows the items in the business's extra storage (not buyable)"), new CommandData("bizstorage", listBusinessStorageInventoryCommand, "", getStaffFlagValue("None"), true, false, "Shows the items in the business's extra storage (not buyable)"),
new CommandData("bizfloor", listBusinessFloorInventoryCommand, "", getStaffFlagValue("None"), true, false, "Shows the items that can be bought from the business"), new CommandData("bizfloor", listBusinessFloorInventoryCommand, "", getStaffFlagValue("None"), true, false, "Shows the items that can be bought from the business"),
@@ -359,11 +360,11 @@ function loadCommands() {
new CommandData("buylist", listBusinessFloorInventoryCommand, "", getStaffFlagValue("None"), true, false, "Shows the items that can be bought from the business"), new CommandData("buylist", listBusinessFloorInventoryCommand, "", getStaffFlagValue("None"), true, false, "Shows the items that can be bought from the business"),
new CommandData("power", toggleItemEnabledCommand, "", getStaffFlagValue("None"), true, false, "Turns on or off an item"), new CommandData("power", toggleItemEnabledCommand, "", getStaffFlagValue("None"), true, false, "Turns on or off an item"),
new CommandData("freq", setWalkieTalkieFrequencyCommand, "[frequncy number]", getStaffFlagValue("None"), true, false, "Sets a radio item's frequency"), //new CommandData("freq", setRadioFrequencyCommand, "[frequency number]", getStaffFlagValue("None"), true, false, "Sets a vehicle or item radio frequency"),
//new CommandData("call", callWithPhoneCommand, "[number]", getStaffFlagValue("None"), true, false), //new CommandData("call", callWithPhoneCommand, "[number]", getStaffFlagValue("None"), true, false),
//new CommandData("speakerphone", togglePhoneSpeakerCommand, "", getStaffFlagValue("None"), true, false), //new CommandData("speakerphone", togglePhoneSpeakerCommand, "", getStaffFlagValue("None"), true, false),
new CommandData("radio", walkieTalkieChatCommand, "", getStaffFlagValue("None"), true, false, "Chat over a radio item (item must be able to transmit)"), new CommandData("radio", radioTransmitCommand, "", getStaffFlagValue("None"), true, false, "Chat over a radio (vehicle radio or item)"),
new CommandData("r", walkieTalkieChatCommand, "", getStaffFlagValue("None"), true, false, "Chat over a radio item (item must be able to transmit)"), new CommandData("r", radioTransmitCommand, "", getStaffFlagValue("None"), true, false, "Chat over a radio (vehicle radio or item)"),
new CommandData("additemtype", createItemTypeCommand, "<name>", getStaffFlagValue("ManageItems"), true, false, "Adds a new item type"), new CommandData("additemtype", createItemTypeCommand, "<name>", getStaffFlagValue("ManageItems"), true, false, "Adds a new item type"),
new CommandData("itemtypeusetype", setItemTypeUseTypeCommand, "<item type> <use type>", getStaffFlagValue("ManageItems"), true, false, "Sets an item type's use-type (what kind of action is performed when using it)"), new CommandData("itemtypeusetype", setItemTypeUseTypeCommand, "<item type> <use type>", getStaffFlagValue("ManageItems"), true, false, "Sets an item type's use-type (what kind of action is performed when using it)"),
@@ -428,6 +429,8 @@ function loadCommands() {
new CommandData("deljobroute", deleteJobRouteCommand, "", getStaffFlagValue("ManageJobs"), true, false), new CommandData("deljobroute", deleteJobRouteCommand, "", getStaffFlagValue("ManageJobs"), true, false),
new CommandData("deljobrouteloc", deleteJobRouteLocationCommand, "", getStaffFlagValue("ManageJobs"), true, false), new CommandData("deljobrouteloc", deleteJobRouteLocationCommand, "", getStaffFlagValue("ManageJobs"), true, false),
new CommandData("deljobroutelocation", deleteJobRouteLocationCommand, "", getStaffFlagValue("ManageJobs"), true, false), new CommandData("deljobroutelocation", deleteJobRouteLocationCommand, "", getStaffFlagValue("ManageJobs"), true, false),
new CommandData("jobuniformname", setJobUniformNameCommand, "<uniform id> <name>", getStaffFlagValue("ManageJobs"), true, false),
new CommandData("jobuniformrank", setJobUniformMinimumRankCommand, "<uniform id> <rank level>", getStaffFlagValue("ManageJobs"), true, false),
new CommandData("jobroutelocpos", setJobRouteLocationPositionCommand, "", getStaffFlagValue("ManageJobs"), true, false), new CommandData("jobroutelocpos", setJobRouteLocationPositionCommand, "", getStaffFlagValue("ManageJobs"), true, false),
new CommandData("jobroutename", setJobRouteNameCommand, "<name>", getStaffFlagValue("ManageJobs"), true, false), new CommandData("jobroutename", setJobRouteNameCommand, "<name>", getStaffFlagValue("ManageJobs"), true, false),
new CommandData("jobroutepay", setJobRoutePayCommand, "<amount>", getStaffFlagValue("ManageJobs"), true, false), new CommandData("jobroutepay", setJobRoutePayCommand, "<amount>", getStaffFlagValue("ManageJobs"), true, false),

View File

@@ -211,8 +211,8 @@ let globalConfig = {
houseDimensionStart: 100, houseDimensionStart: 100,
buyVehicleDriveAwayDistance: 25.0, buyVehicleDriveAwayDistance: 25.0,
returnToJobVehicleTime: 30, returnToJobVehicleTime: 30,
walkieTalkieSpeakerDistance: 15, radioTransmitSpeakerDistance: 15,
walkieTalkieTalkDistance: 15, radioTransmitTalkDistance: 15,
phoneSpeakerDistance: 15, phoneSpeakerDistance: 15,
phoneTalkDistance: 15, phoneTalkDistance: 15,
tazerEffectDuration: 15000, tazerEffectDuration: 15000,
@@ -283,6 +283,7 @@ let globalConfig = {
nightMapEndHour: 7, nightMapEndHour: 7,
payPhoneGiveDistance: 2.5, payPhoneGiveDistance: 2.5,
payPhoneAnswerDistance: 2.5, payPhoneAnswerDistance: 2.5,
vehicleTransmitRadioUseDistance: 2.5,
}; };
// =========================================================================== // ===========================================================================

View File

@@ -593,11 +593,10 @@ function togglePauseSavingToDatabaseCommand(command, params, client) {
function createAccountDataForNewServer(serverId) { function createAccountDataForNewServer(serverId) {
let dbConnection = connectToDatabase(); let dbConnection = connectToDatabase();
let dbQuery = false;
if (dbConnection) { if (dbConnection) {
dbQuery = queryDatabase(dbConnection, `SELECT * FROM acct_main`); let accounts = fetchQueryAssoc(dbConnection, `SELECT * FROM acct_main`);
if (dbQuery) { for (let i in accounts) {
let dbQueryString = `INSERT INTO acct_svr (acct_svr_acct, acct_svr_svr) VALUES (${accountDatabaseId}, ${serverId})`; let dbQueryString = `INSERT INTO acct_svr (acct_svr_acct, acct_svr_svr) VALUES (${accounts[i]["acct_id"]}, ${serverId})`;
quickDatabaseQuery(dbQueryString); quickDatabaseQuery(dbQueryString);
} }
} }
@@ -605,6 +604,60 @@ function createAccountDataForNewServer(serverId) {
// =========================================================================== // ===========================================================================
function fixMissingAccountServerData() {
let dbConnection = connectToDatabase();
console.log(`Connection: ${dbConnection}`);
if (dbConnection != false) {
let accounts = fetchQueryAssoc(dbConnection, `SELECT * FROM acct_main WHERE acct_id > 12`);
console.log(`Accounts: ${accounts.length}`);
let servers = fetchQueryAssoc(dbConnection, `SELECT * FROM svr_main`);
console.log(`Servers: ${servers.length}`);
for (let i in accounts) {
let serverAccounts = fetchQueryAssoc(dbConnection, `SELECT * FROM acct_svr WHERE acct_svr_acct = ${accounts[i]["acct_id"]}`)
console.log(`Server accounts for ${accounts[i]["acct_id"]}: ${serverAccounts.length}`);
for (let k in servers) {
let check = serverAccounts.find((sa) => sa["acct_svr_svr"] == servers[k]["svr_id"]);
console.log(`Check server: ${servers[k]["svr_id"]}. Amount ${check}`);
if (typeof check == "undefined") {
let dbQueryString = `INSERT INTO acct_svr (acct_svr_acct, acct_svr_svr) VALUES (${accounts[i]["acct_id"]}, ${servers[k]["svr_id"]})`;
//console.log(dbQueryString);
quickDatabaseQuery(dbQueryString);
}
}
}
}
}
// ===========================================================================
function fixMissingSubAccountServerData() {
let dbConnection = connectToDatabase();
console.log(`Connection: ${dbConnection}`);
if (dbConnection != false) {
let subAccounts = fetchQueryAssoc(dbConnection, `SELECT * FROM sacct_main`);
console.log(`SubAccounts: ${subAccounts.length}`);
let servers = fetchQueryAssoc(dbConnection, `SELECT * FROM svr_main`);
console.log(`Servers: ${servers.length}`);
for (let i in subAccounts) {
let serverAccounts = fetchQueryAssoc(dbConnection, `SELECT * FROM sacct_svr WHERE sacct_svr_sacct = ${subAccounts[i]["sacct_id"]}`)
console.log(`Server accounts for ${subAccounts[i]["sacct_id"]}: ${serverAccounts.length}`);
for (let k in servers) {
let check = serverAccounts.find((sa) => sa["sacct_svr_server"] == servers[k]["svr_id"]);
console.log(`Check server: ${servers[k]["svr_id"]}. Amount ${check}`);
if (typeof check == "undefined") {
let dbQueryString = `INSERT INTO sacct_svr (sacct_svr_sacct, sacct_svr_server) VALUES (${subAccounts[i]["sacct_id"]}, ${servers[k]["svr_id"]})`;
//console.log(dbQueryString);
quickDatabaseQuery(dbQueryString);
}
}
}
}
}
// ===========================================================================
function streamAudioURLToAllPlayersCommand(command, params, client) { function streamAudioURLToAllPlayersCommand(command, params, client) {
if (areParamsEmpty(params)) { if (areParamsEmpty(params)) {
messagePlayerSyntax(client, getCommandSyntaxText(command)); messagePlayerSyntax(client, getCommandSyntaxText(command));

View File

@@ -1801,9 +1801,21 @@ function updateHousePickupLabelData(houseId) {
if (!areServerElementsSupported() || getGame() == V_GAME_MAFIA_ONE || getGame() == V_GAME_GTA_IV) { if (!areServerElementsSupported() || getGame() == V_GAME_MAFIA_ONE || getGame() == V_GAME_GTA_IV) {
if (houseData == false) { if (houseData == false) {
sendHouseToPlayer(null, houseId, true, "", false, -1, -1, 0, 0, false, false, false); sendHouseToPlayer(null, houseId, true, "", false, -1, -1, 0, 0, false, false);
} else { } else {
sendHouseToPlayer(null, houseId, false, houseData.description, houseData.entrancePosition, getHouseEntranceBlipModelForNetworkEvent(houseId), getHouseEntrancePickupModelForNetworkEvent(houseId), houseData.buyPrice, houseData.rentPrice, houseData.hasInterior, houseData.locked); sendHouseToPlayer(
null,
houseId,
false,
houseData.description,
houseData.entrancePosition,
getHouseEntranceBlipModelForNetworkEvent(houseId),
getHouseEntrancePickupModelForNetworkEvent(houseId),
houseData.buyPrice,
houseData.rentPrice,
houseData.hasInterior,
houseData.locked
);
} }
return false; return false;
} }

View File

@@ -2400,26 +2400,46 @@ function getBestItemToTake(client, slot) {
* *
*/ */
function listPlayerInventoryCommand(command, params, client) { function listPlayerInventoryCommand(command, params, client) {
//let targetClient = client;
//if(!areParamsEmpty(client)) {
// if(doesPlayerHaveStaffPermission(client, getStaffFlagValue("BasicModeration"))) {
// if(targetClient == false) {
// sendMessageToPlayer(client, getLocaleString(client, "InvalidPlayer"));
// return false;
// }
//
// targetClient = getPlayerFromParams(params);
// }
//}
//showPlayerInventoryToPlayer(client, targetClient);
showPlayerInventoryToPlayer(client, client); showPlayerInventoryToPlayer(client, client);
markPlayerActionTipSeen(client, "ViewInventory"); markPlayerActionTipSeen(client, "ViewInventory");
} }
// =========================================================================== // ===========================================================================
/**
* This is a command handler function.
*
* @param {string} command - The command name used by the player
* @param {string} params - The parameters/args string used with the command by the player
* @param {Client} client - The client/player that used the command
* @return {bool} Whether or not the command was successful
*
*/
function listOtherPlayerInventoryCommand(command, params, client) {
if (areParamsEmpty(params)) {
messagePlayerSyntax(client, getCommandSyntaxText(client, command));
return false;
}
let targetClient = getPlayerFromParams(params);
if (!targetClient) {
messagePlayerError(client, getLocaleString(client, "InvalidPlayer"));
return false;
}
if (!doesPlayerHaveStaffPermission(client, getStaffFlagValue("ManageItems"))) {
if (!isPlayerSurrendered(targetClient)) {
messagePlayerError(client, getLocaleString(client, "MustBeSurrendered"));
return false;
}
}
showPlayerInventoryToPlayer(client, targetClient);
}
// ===========================================================================
/** /**
* This is a command handler function. * This is a command handler function.
* *

View File

@@ -6,134 +6,3 @@
// DESC: Provides features and usage for the walkie-talkie item type // DESC: Provides features and usage for the walkie-talkie item type
// TYPE: Server (JavaScript) // TYPE: Server (JavaScript)
// =========================================================================== // ===========================================================================
function getPlayerActiveWalkieTalkieFrequency(client) {
let walkieTalkieSlot = getPlayerFirstItemSlotByUseType(client, V_ITEM_USE_TYPE_WALKIETALKIE);
if (walkieTalkieSlot != -1) {
if (getItemData(getPlayerData(client).hotBarItems[walkieTalkieSlot])) {
if (getItemData(getPlayerData(client).hotBarItems[walkieTalkieSlot]).enabled) {
return getItemData(getPlayerData(client).hotBarItems[walkieTalkieSlot]).value;
}
}
}
return false;
}
// ===========================================================================
function walkieTalkieTransmit(radioFrequency, messageText, transmittingPlayer) {
walkieTalkieOutgoingToNearbyPlayers(transmittingPlayer, messageText);
//let clients = getServerData().items;
//for(let i in clients) {
// if(isPlayerSpawned(clients[i])) {
// if(!isSamePlayer(transmittingPlayer, clients[i])) {
// if(getPlayerActiveWalkieTalkieFrequency(clients[i]) == radioFrequency) {
// if(getItemData(getPlayerData(clients[i]).hotBarItems[getPlayerFirstItemSlotByUseType(clients[i], V_ITEM_USE_TYPE_WALKIETALKIE)]).enabled) {
// walkieTalkieIncomingToNearbyPlayers(clients[i], messageText);
// }
// }
// }
// }
//}
let items = getServerData().items;
for (let i in items) {
if (items[i].enabled) {
if (getItemTypeData(items[i].itemTypeIndex).useType == V_ITEM_USE_TYPE_WALKIETALKIE) {
if (items[i].value == radioFrequency) {
walkieTalkieIncomingToNearbyPlayers(null, messageText, getItemPosition(i));
}
}
}
}
}
// ===========================================================================
function walkieTalkieOutgoingToNearbyPlayers(client, messageText) {
let clients = getPlayersInRange(getPlayerPosition(client), getGlobalConfig().talkDistance);
for (let i in clients) {
messagePlayerNormal(clients[i], `[#CCCCCC]${getCharacterFullName(client)} {ALTCOLOUR}(to radio): {MAINCOLOUR}${messageText}`);
}
}
// ===========================================================================
function walkieTalkieIncomingToNearbyPlayers(client, messageText, position = null) {
let prefix = `{ALTCOLOUR}(Nearby radio)`;
if (client != null) {
prefix = `${getCharacterFullName(client)} {ALTCOLOUR}(from radio)`;
}
let clients = getPlayersInRange(getPlayerPosition(client), getGlobalConfig().walkieTalkieSpeakerDistance);
for (let i in clients) {
messagePlayerNormal(clients[i], `[#CCCCCC]${prefix}: {MAINCOLOUR}${messageText}`);
}
}
// ===========================================================================
function setWalkieTalkieFrequencyCommand(command, params, client) {
if (areParamsEmpty(params)) {
messagePlayerSyntax(client, getCommandSyntaxText(command));
return false;
}
if (isNaN(params)) {
messagePlayerError(client, `The frequency channel must be a number!`);
return false;
}
params = toInteger(params);
if (params < 100 || params > 500) {
messagePlayerError(client, `The frequency channel must be between 100 and 500!`);
return false;
}
if (!getPlayerActiveItem(client)) {
messagePlayerError(client, `You aren't holding a walkie talkie!`);
return false;
}
if (!getItemData(getPlayerActiveItem(client))) {
messagePlayerError(client, `You aren't holding a walkie talkie!`);
return false;
}
if (getItemData(getPlayerActiveItem(client)).enabled) {
if (!doesPlayerHaveKeyBindsDisabled(client) && doesPlayerHaveKeyBindForCommand(client, "use")) {
messagePlayerError(client, `Your walkie talkie is turned off. Press ${toUpperCase(getKeyNameFromId(getPlayerKeyBindForCommand(client, "use")).key)} to turn it on`);
} else {
messagePlayerError(client, `Your walkie talkie is turned off. Type {ALTCOLOUR}/use {MAINCOLOUR}to turn it on`);
}
return false;
}
getItemData(getPlayerActiveItem(client)).value = params * 100;
messagePlayerSuccess(client, getLocaleString(client, "FrequencyChannelChanged", `Walkie Talkie`, `${getPlayerData(client).activeHotBarSlot + 1}`, `${getItemValueDisplayForItem(getPlayerActiveItem(client))}`));
}
// ===========================================================================
function walkieTalkieChatCommand(command, params, client) {
if (areParamsEmpty(params)) {
messagePlayerSyntax(client, getCommandSyntaxText(command));
return false;
}
let walkieTalkieSlot = getPlayerFirstItemSlotByUseType(client, V_ITEM_USE_TYPE_WALKIETALKIE);
if (!getItemData(getPlayerData(client).hotBarItems[walkieTalkieSlot]).enabled) {
messagePlayerError(client, "Please turn on a walkie talkie first!");
return false;
}
walkieTalkieTransmit(getPlayerActiveWalkieTalkieFrequency(client), params, client);
markPlayerActionTipSeen(client, "RadioCommandAfterEnablingWalkieTalkie");
}
// ===========================================================================

View File

@@ -57,11 +57,11 @@ class JobData {
this.colour = toColour(0, 0, 0, 255); this.colour = toColour(0, 0, 0, 255);
this.whiteListEnabled = false; this.whiteListEnabled = false;
this.blackListEnabled = false; this.blackListEnabled = false;
this.walkieTalkieFrequency = 0; this.radioFrequency = 0;
this.index = -1; this.index = -1;
this.needsSaved = false; this.needsSaved = false;
this.whoCreated = 0; this.whoAdded = 0;
this.whenCreated = 0; this.whenAdded = 0;
/** @type {Array.<JobEquipmentData>} */ /** @type {Array.<JobEquipmentData>} */
this.equipment = []; this.equipment = [];
@@ -95,9 +95,9 @@ class JobData {
this.colour = toColour(dbAssoc["job_colour_r"], dbAssoc["job_colour_g"], dbAssoc["job_colour_b"], 255); this.colour = toColour(dbAssoc["job_colour_r"], dbAssoc["job_colour_g"], dbAssoc["job_colour_b"], 255);
this.whiteListEnabled = dbAssoc["job_wl"]; this.whiteListEnabled = dbAssoc["job_wl"];
this.blackListEnabled = dbAssoc["job_bl"]; this.blackListEnabled = dbAssoc["job_bl"];
this.walkieTalkieFrequency = dbAssoc["job_walkietalkiefreq"]; this.radioFrequency = dbAssoc["job_radio_freq"];
this.whoCreated = dbAssoc["job_who_added"]; this.whoAdded = dbAssoc["job_who_added"];
this.whenCreated = dbAssoc["job_when_added"]; this.whenAdded = dbAssoc["job_when_added"];
this.equipment = []; this.equipment = [];
this.uniforms = []; this.uniforms = [];
@@ -136,8 +136,8 @@ class JobRouteData {
//this.failedMessage = ""; //this.failedMessage = "";
this.locationArriveMessage = ""; this.locationArriveMessage = "";
this.locationGotoMessage = ""; this.locationGotoMessage = "";
this.whoCreated = 0; this.whoAdded = 0;
this.whenCreated = 0; this.whenAdded = 0;
this.sphere = null; this.sphere = null;
/** @type {Array.<JobRouteLocationData>} */ /** @type {Array.<JobRouteLocationData>} */
@@ -158,8 +158,8 @@ class JobRouteData {
this.vehicleColour1 = toInteger(dbAssoc["job_route_veh_colour1"]); this.vehicleColour1 = toInteger(dbAssoc["job_route_veh_colour1"]);
this.vehicleColour2 = toInteger(dbAssoc["job_route_veh_colour2"]); this.vehicleColour2 = toInteger(dbAssoc["job_route_veh_colour2"]);
this.detail = toInteger(dbAssoc["job_route_detail"]); this.detail = toInteger(dbAssoc["job_route_detail"]);
this.whoCreated = dbAssoc["job_route_who_added"]; this.whoAdded = dbAssoc["job_route_who_added"];
this.whenCreated = dbAssoc["job_route_when_added"]; this.whenAdded = dbAssoc["job_route_when_added"];
this.sphere = null; this.sphere = null;
} }
} }
@@ -186,8 +186,8 @@ class JobRouteLocationData {
this.type = V_JOB_ROUTE_LOC_TYPE_NONE; this.type = V_JOB_ROUTE_LOC_TYPE_NONE;
this.gotoMessage = ""; this.gotoMessage = "";
this.departMessage = ""; this.departMessage = "";
this.whoCreated = 0; this.whoAdded = 0;
this.whenCreated = 0; this.whenAdded = 0;
if (dbAssoc) { if (dbAssoc) {
this.databaseId = toInteger(dbAssoc["job_route_loc_id"]); this.databaseId = toInteger(dbAssoc["job_route_loc_id"]);
@@ -199,8 +199,8 @@ class JobRouteLocationData {
this.pay = toInteger(dbAssoc["job_route_loc_pay"]); this.pay = toInteger(dbAssoc["job_route_loc_pay"]);
this.arriveMessage = toInteger(dbAssoc["job_route_loc_arrive_msg"]); this.arriveMessage = toInteger(dbAssoc["job_route_loc_arrive_msg"]);
this.gotoMessage = toInteger(dbAssoc["job_route_loc_goto_msg"]); this.gotoMessage = toInteger(dbAssoc["job_route_loc_goto_msg"]);
this.whoCreated = dbAssoc["job_route_loc_who_added"]; this.whoAdded = dbAssoc["job_route_loc_who_added"];
this.whenCreated = dbAssoc["job_route_loc_when_added"]; this.whenAdded = dbAssoc["job_route_loc_when_added"];
} }
} }
}; };
@@ -221,8 +221,8 @@ class JobEquipmentData {
this.index = -1; this.index = -1;
this.jobIndex = -1; this.jobIndex = -1;
this.needsSaved = false; this.needsSaved = false;
this.whoCreated = 0; this.whoAdded = 0;
this.whenCreated = 0; this.whenAdded = 0;
/** @type {Array.<JobEquipmentItemData>} */ /** @type {Array.<JobEquipmentItemData>} */
this.items = []; this.items = [];
@@ -233,8 +233,8 @@ class JobEquipmentData {
this.name = dbAssoc["job_equip_name"]; this.name = dbAssoc["job_equip_name"];
this.requiredRank = dbAssoc["job_equip_minrank"]; this.requiredRank = dbAssoc["job_equip_minrank"];
this.enabled = dbAssoc["job_equip_enabled"]; this.enabled = dbAssoc["job_equip_enabled"];
this.whoCreated = dbAssoc["job_equip_who_added"]; this.whoAdded = dbAssoc["job_equip_who_added"];
this.whenCreated = dbAssoc["job_equip_when_added"]; this.whenAdded = dbAssoc["job_equip_when_added"];
} }
} }
}; };
@@ -254,8 +254,8 @@ class JobEquipmentItemData {
this.index = -1; this.index = -1;
this.jobIndex = -1; this.jobIndex = -1;
this.needsSaved = false; this.needsSaved = false;
this.whoCreated = 0; this.whoAdded = 0;
this.whenCreated = 0; this.whenAdded = 0;
if (dbAssoc) { if (dbAssoc) {
this.databaseId = dbAssoc["job_equip_item_id"]; this.databaseId = dbAssoc["job_equip_item_id"];
@@ -263,8 +263,8 @@ class JobEquipmentItemData {
this.itemType = dbAssoc["job_equip_item_type"]; this.itemType = dbAssoc["job_equip_item_type"];
this.value = dbAssoc["job_equip_item_value"]; this.value = dbAssoc["job_equip_item_value"];
this.enabled = dbAssoc["job_equip_item_enabled"]; this.enabled = dbAssoc["job_equip_item_enabled"];
this.whoCreated = dbAssoc["job_equip_item_who_added"]; this.whoAdded = dbAssoc["job_equip_item_who_added"];
this.whenCreated = dbAssoc["job_equip_item_when_added"]; this.whenAdded = dbAssoc["job_equip_item_when_added"];
} }
} }
}; };
@@ -285,8 +285,8 @@ class JobUniformData {
this.index = -1; this.index = -1;
this.jobIndex = -1; this.jobIndex = -1;
this.needsSaved = false; this.needsSaved = false;
this.whoCreated = 0; this.whoAdded = 0;
this.whenCreated = 0; this.whenAdded = 0;
/* /*
this.bodyParts = { this.bodyParts = {
@@ -317,8 +317,8 @@ class JobUniformData {
this.requiredRank = dbAssoc["job_uniform_minrank"]; this.requiredRank = dbAssoc["job_uniform_minrank"];
this.skin = dbAssoc["job_uniform_skin"]; this.skin = dbAssoc["job_uniform_skin"];
this.enabled = intToBool(dbAssoc["job_uniform_enabled"]); this.enabled = intToBool(dbAssoc["job_uniform_enabled"]);
this.whoCreated = dbAssoc["job_uniform_who_added"]; this.whoAdded = dbAssoc["job_uniform_who_added"];
this.whenCreated = dbAssoc["job_uniform_when_added"]; this.whenAdded = dbAssoc["job_uniform_when_added"];
/* /*
this.bodyParts = { this.bodyParts = {
@@ -364,8 +364,8 @@ class JobLocationData {
this.jobIndex = -1; this.jobIndex = -1;
this.needsSaved = false; this.needsSaved = false;
this.routeCache = []; this.routeCache = [];
this.whoCreated = 0; this.whoAdded = 0;
this.whenCreated = 0; this.whenAdded = 0;
if (dbAssoc) { if (dbAssoc) {
this.databaseId = dbAssoc["job_loc_id"]; this.databaseId = dbAssoc["job_loc_id"];
@@ -376,8 +376,8 @@ class JobLocationData {
this.enabled = intToBool(dbAssoc["job_loc_enabled"]); this.enabled = intToBool(dbAssoc["job_loc_enabled"]);
this.interior = dbAssoc["job_loc_int"]; this.interior = dbAssoc["job_loc_int"];
this.dimension = dbAssoc["job_loc_vw"]; this.dimension = dbAssoc["job_loc_vw"];
this.whoCreated = dbAssoc["job_loc_who_added"]; this.whoAdded = dbAssoc["job_loc_who_added"];
this.whenCreated = dbAssoc["job_loc_when_added"]; this.whenAdded = dbAssoc["job_loc_when_added"];
} }
} }
}; };
@@ -397,8 +397,8 @@ class JobRankData {
this.level = 0; this.level = 0;
this.enabled = false; this.enabled = false;
this.pay = 0; this.pay = 0;
this.whoCreated = 0; this.whoAdded = 0;
this.whenCreated = 0; this.whenAdded = 0;
this.flags = 0; this.flags = 0;
this.needsSaved = false; this.needsSaved = false;
this.public = false; this.public = false;
@@ -410,8 +410,8 @@ class JobRankData {
this.level = toInteger(dbAssoc["job_rank_level"]); this.level = toInteger(dbAssoc["job_rank_level"]);
this.enabled = intToBool(dbAssoc["job_rank_enabled"]); this.enabled = intToBool(dbAssoc["job_rank_enabled"]);
this.pay = toInteger(dbAssoc["job_rank_pay"]); this.pay = toInteger(dbAssoc["job_rank_pay"]);
this.whoCreated = toInteger(dbAssoc["job_rank_who_added"]); this.whoAdded = toInteger(dbAssoc["job_rank_who_added"]);
this.whenCreated = toInteger(dbAssoc["job_rank_when_added"]); this.whenAdded = toInteger(dbAssoc["job_rank_when_added"]);
this.flags = toInteger(dbAssoc["job_rank_flags"]); this.flags = toInteger(dbAssoc["job_rank_flags"]);
this.public = intToBool(dbAssoc["job_rank_public"]); this.public = intToBool(dbAssoc["job_rank_public"]);
} }
@@ -429,16 +429,16 @@ class JobWhiteListData {
this.index = -1; this.index = -1;
this.jobIndex = -1; this.jobIndex = -1;
this.needsSaved = false; this.needsSaved = false;
this.whoCreated = 0; this.whoAdded = 0;
this.whenCreated = 0; this.whenAdded = 0;
if (dbAssoc) { if (dbAssoc) {
this.databaseId = dbAssoc["job_wl_id"]; this.databaseId = dbAssoc["job_wl_id"];
this.job = dbAssoc["job_wl_job"]; this.job = dbAssoc["job_wl_job"];
this.subAccount = dbAssoc["job_wl_sacct"] this.subAccount = dbAssoc["job_wl_sacct"]
this.enabled = dbAssoc["job_wl_enabled"]; this.enabled = dbAssoc["job_wl_enabled"];
this.whoCreated = dbAssoc["job_wl_who_added"]; this.whoAdded = dbAssoc["job_wl_who_added"];
this.whenCreated = dbAssoc["job_wl_when_added"]; this.whenAdded = dbAssoc["job_wl_when_added"];
} }
} }
}; };
@@ -454,16 +454,16 @@ class JobBlackListData {
this.index = -1; this.index = -1;
this.jobIndex = -1; this.jobIndex = -1;
this.needsSaved = false; this.needsSaved = false;
this.whoCreated = 0; this.whoAdded = 0;
this.whenCreated = 0; this.whenAdded = 0;
if (dbAssoc) { if (dbAssoc) {
this.databaseId = dbAssoc["job_bl_id"]; this.databaseId = dbAssoc["job_bl_id"];
this.job = dbAssoc["job_bl_job"]; this.job = dbAssoc["job_bl_job"];
this.subAccount = dbAssoc["job_bl_sacct"] this.subAccount = dbAssoc["job_bl_sacct"]
this.enabled = dbAssoc["job_bl_enabled"]; this.enabled = dbAssoc["job_bl_enabled"];
this.whoCreated = dbAssoc["job_bl_who_added"]; this.whoAdded = dbAssoc["job_bl_who_added"];
this.whenCreated = dbAssoc["job_bl_when_added"]; this.whenAdded = dbAssoc["job_bl_when_added"];
} }
} }
}; };
@@ -1148,7 +1148,7 @@ function givePlayerJobEquipment(client, equipmentId) {
for (let i in getJobData(jobId).equipment[equipmentId].items) { for (let i in getJobData(jobId).equipment[equipmentId].items) {
let value = getJobData(jobId).equipment[equipmentId].items[i].value let value = getJobData(jobId).equipment[equipmentId].items[i].value
if (getItemTypeData(getItemTypeIndexFromDatabaseId(getJobData(jobId).equipment[equipmentId].items[i].itemType)).useType == V_ITEM_USE_TYPE_WALKIETALKIE) { if (getItemTypeData(getItemTypeIndexFromDatabaseId(getJobData(jobId).equipment[equipmentId].items[i].itemType)).useType == V_ITEM_USE_TYPE_WALKIETALKIE) {
value = getJobData(jobId).walkieTalkieFrequency; value = getJobData(jobId).radioFrequency;
} }
let itemId = createItem(getItemTypeIndexFromDatabaseId(getJobData(jobId).equipment[equipmentId].items[i].itemType), value, V_ITEM_OWNER_PLAYER, getPlayerCurrentSubAccount(client).databaseId); let itemId = createItem(getItemTypeIndexFromDatabaseId(getJobData(jobId).equipment[equipmentId].items[i].itemType), value, V_ITEM_OWNER_PLAYER, getPlayerCurrentSubAccount(client).databaseId);
getItemData(itemId).needsSaved = false; getItemData(itemId).needsSaved = false;
@@ -1818,7 +1818,9 @@ function setPlayerJobRankCommand(command, params, client) {
} }
let targetClient = getPlayerFromParams(getParam(params, " ", 1)); let targetClient = getPlayerFromParams(getParam(params, " ", 1));
let rankIndex = getJobRankFromParams(jobIndex, params.split(" ").slice(2).join(" ")); let rankParam = getJobRankFromParams(jobIndex, params.split(" ").slice(2).join(" "));
let rankIndex = getJobRankFromParams(jobIndex, rankParam);
if (!targetClient) { if (!targetClient) {
messagePlayerError(client, getLocaleString(client, "InvalidPlayer")); messagePlayerError(client, getLocaleString(client, "InvalidPlayer"));
@@ -2763,7 +2765,7 @@ function setAllJobDataIndexes() {
// =========================================================================== // ===========================================================================
function createJobLocation(jobId, position, interior, dimension, whoCreated) { function createJobLocation(jobId, position, interior, dimension, whoAdded) {
let jobLocationData = new JobLocationData(false); let jobLocationData = new JobLocationData(false);
jobLocationData.position = position; jobLocationData.position = position;
jobLocationData.jobId = getJobData(jobId).databaseId; jobLocationData.jobId = getJobData(jobId).databaseId;
@@ -2772,8 +2774,8 @@ function createJobLocation(jobId, position, interior, dimension, whoCreated) {
jobLocationData.enabled = true; jobLocationData.enabled = true;
jobLocationData.jobIndex = jobId; jobLocationData.jobIndex = jobId;
jobLocationData.needsSaved = true; jobLocationData.needsSaved = true;
jobLocationData.whoCreated = whoCreated; jobLocationData.whoAdded = whoAdded;
jobLocationData.whenCreated = getCurrentUnixTimestamp(); jobLocationData.whenAdded = getCurrentUnixTimestamp();
getServerData().jobs[jobId].locations.push(jobLocationData); getServerData().jobs[jobId].locations.push(jobLocationData);
let newSlot = getServerData().jobs[jobId].locations.length - 1; let newSlot = getServerData().jobs[jobId].locations.length - 1;
@@ -2811,11 +2813,11 @@ function saveJobToDatabase(jobData) {
["job_colour_r", colour[0]], ["job_colour_r", colour[0]],
["job_colour_g", colour[1]], ["job_colour_g", colour[1]],
["job_colour_b", colour[2]], ["job_colour_b", colour[2]],
["job_walkietalkiefreq", jobData.walkieTalkieFrequency], ["job_radio_freq", jobData.radioFrequency],
["job_wl", jobData.whiteListEnabled], ["job_wl", jobData.whiteListEnabled],
["job_bl", jobData.blackListEnabled], ["job_bl", jobData.blackListEnabled],
["job_who_added", jobData.whoCreated], ["job_who_added", jobData.whoAdded],
["job_when_added", jobData.whenCreated], ["job_when_added", jobData.whenAdded],
]; ];
let dbQuery = null; let dbQuery = null;
@@ -2863,8 +2865,8 @@ function saveJobRankToDatabase(jobRankData) {
["job_rank_flags", jobRankData.flags], ["job_rank_flags", jobRankData.flags],
["job_rank_pay", jobRankData.pay], ["job_rank_pay", jobRankData.pay],
["job_rank_level", jobRankData.level], ["job_rank_level", jobRankData.level],
["job_rank_who_added", jobRankData.whoCreated], ["job_rank_who_added", jobRankData.whoAdded],
["job_rank_when_added", jobRankData.whenCreated], ["job_rank_when_added", jobRankData.whenAdded],
["job_rank_public", boolToInt(jobRankData.public)], ["job_rank_public", boolToInt(jobRankData.public)],
]; ];
@@ -2930,8 +2932,8 @@ function saveJobRouteToDatabase(jobRouteData) {
["job_route_loc_goto_msg", safeLocationNextMessage], ["job_route_loc_goto_msg", safeLocationNextMessage],
["job_route_pay", jobRouteData.pay], ["job_route_pay", jobRouteData.pay],
["job_route_detail", jobRouteData.detail], ["job_route_detail", jobRouteData.detail],
["job_route_who_added", jobRouteData.whoCreated], ["job_route_who_added", jobRouteData.whoAdded],
["job_route_when_added", jobRouteData.whenCreated], ["job_route_when_added", jobRouteData.whenAdded],
]; ];
let dbQuery = null; let dbQuery = null;
@@ -2987,8 +2989,8 @@ function saveJobRouteLocationToDatabase(jobRouteLocationData) {
["job_route_loc_z", jobRouteLocationData.position.z], ["job_route_loc_z", jobRouteLocationData.position.z],
["job_route_loc_pay", jobRouteLocationData.pay], ["job_route_loc_pay", jobRouteLocationData.pay],
["job_route_loc_delay", jobRouteLocationData.stopDelay], ["job_route_loc_delay", jobRouteLocationData.stopDelay],
["job_route_loc_who_added", jobRouteLocationData.whoCreated], ["job_route_loc_who_added", jobRouteLocationData.whoAdded],
["job_route_loc_when_added", jobRouteLocationData.whenCreated], ["job_route_loc_when_added", jobRouteLocationData.whenAdded],
]; ];
let dbQuery = null; let dbQuery = null;
@@ -3042,8 +3044,8 @@ function saveJobLocationToDatabase(jobLocationData) {
["job_loc_pos_z", jobLocationData.position.z], ["job_loc_pos_z", jobLocationData.position.z],
["job_loc_int", jobLocationData.interior], ["job_loc_int", jobLocationData.interior],
["job_loc_vw", jobLocationData.dimension], ["job_loc_vw", jobLocationData.dimension],
["job_loc_who_added", jobLocationData.whoCreated], ["job_loc_who_added", jobLocationData.whoAdded],
["job_loc_when_added", jobLocationData.whenCreated], ["job_loc_when_added", jobLocationData.whenAdded],
]; ];
let dbQuery = null; let dbQuery = null;
@@ -3097,12 +3099,12 @@ function saveJobEquipmentToDatabase(jobEquipmentData) {
["job_equip_enabled", boolToInt(jobEquipmentData.enabled)], ["job_equip_enabled", boolToInt(jobEquipmentData.enabled)],
["job_equip_minrank", jobLocationData.requiredRank], ["job_equip_minrank", jobLocationData.requiredRank],
["job_equip_name", safeName], ["job_equip_name", safeName],
["job_equip_who_added", jobEquipmentData.whoCreated], ["job_equip_who_added", jobEquipmentData.whoAdded],
["job_equip_when_added", jobEquipmentData.whenCreated], ["job_equip_when_added", jobEquipmentData.whenAdded],
]; ];
let dbQuery = null; let dbQuery = null;
if (tempJobRouteData.databaseId == 0) { if (jobEquipmentData.databaseId == 0) {
let queryString = createDatabaseInsertQuery("job_equip", data); let queryString = createDatabaseInsertQuery("job_equip", data);
dbQuery = queryDatabase(dbConnection, queryString); dbQuery = queryDatabase(dbConnection, queryString);
jobEquipmentData.databaseId = getDatabaseInsertId(dbConnection); jobEquipmentData.databaseId = getDatabaseInsertId(dbConnection);
@@ -3150,12 +3152,12 @@ function saveJobEquipmentItemToDatabase(jobEquipmentItemData) {
["job_equip_item_enabled", boolToInt(jobEquipmentItemData.enabled)], ["job_equip_item_enabled", boolToInt(jobEquipmentItemData.enabled)],
["job_equip_item_type", jobEquipmentItemData.itemType], ["job_equip_item_type", jobEquipmentItemData.itemType],
["job_equip_item_value", jobEquipmentItemData.value], ["job_equip_item_value", jobEquipmentItemData.value],
["job_equip_item_who_added", jobEquipmentItemData.whoCreated], ["job_equip_item_who_added", jobEquipmentItemData.whoAdded],
["job_equip_item_when_added", jobEquipmentItemData.whenCreated], ["job_equip_item_when_added", jobEquipmentItemData.whenAdded],
]; ];
let dbQuery = null; let dbQuery = null;
if (tempJobRouteData.databaseId == 0) { if (jobEquipmentItemData.databaseId == 0) {
let queryString = createDatabaseInsertQuery("job_equip_item", data); let queryString = createDatabaseInsertQuery("job_equip_item", data);
dbQuery = queryDatabase(dbConnection, queryString); dbQuery = queryDatabase(dbConnection, queryString);
jobEquipmentItemData.databaseId = getDatabaseInsertId(dbConnection); jobEquipmentItemData.databaseId = getDatabaseInsertId(dbConnection);
@@ -3199,17 +3201,17 @@ function saveJobUniformToDatabase(jobUniformData) {
if (dbConnection) { if (dbConnection) {
let safeName = escapeDatabaseString(dbConnection, jobUniformData.name); let safeName = escapeDatabaseString(dbConnection, jobUniformData.name);
let data = [ let data = [
["job_uniform_job", jobUniformData.jobId], ["job_uniform_job", jobUniformData.job],
["job_uniform_enabled", boolToInt(jobUniformData.enabled)], ["job_uniform_enabled", boolToInt(jobUniformData.enabled)],
["job_uniform_minrank", jobUniformData.requiredRank], ["job_uniform_minrank", jobUniformData.requiredRank],
["job_uniform_name", safeName], ["job_uniform_name", safeName],
["job_uniform_model", jobUniformData.skin], ["job_uniform_skin", jobUniformData.skin],
["job_uniform_who_added", jobUniformData.whoCreated], ["job_uniform_who_added", jobUniformData.whoAdded],
["job_uniform_when_added", jobUniformData.whenCreated], ["job_uniform_when_added", jobUniformData.whenAdded],
]; ];
let dbQuery = null; let dbQuery = null;
if (tempJobRouteData.databaseId == 0) { if (jobUniformData.databaseId == 0) {
let queryString = createDatabaseInsertQuery("job_uniform", data); let queryString = createDatabaseInsertQuery("job_uniform", data);
dbQuery = queryDatabase(dbConnection, queryString); dbQuery = queryDatabase(dbConnection, queryString);
jobUniformData.databaseId = getDatabaseInsertId(dbConnection); jobUniformData.databaseId = getDatabaseInsertId(dbConnection);
@@ -3686,14 +3688,14 @@ function createJobUniformCommand(command, params, client) {
return false; return false;
} }
createJobUniform(jobId, skinIndex); createJobUniform(jobId, skinIndex, getPlayerData(client).accountData.databaseId);
messageAdmins(`{adminOrange}${getPlayerName(client)}{MAINCOLOUR} created uniform with skin {ALTCOLOUR}${getSkinNameFromIndex(skinIndex)} (${getGameConfig().skins[getGame()][skinIndex][0]}){MAINCOLOUR} for job {jobYellow}${getJobData(jobId).name}`); messageAdmins(`{adminOrange}${getPlayerName(client)}{MAINCOLOUR} created uniform with skin {ALTCOLOUR}${getSkinNameFromIndex(skinIndex)} (${getGameConfig().skins[getGame()][skinIndex][0]}){MAINCOLOUR} for job {jobYellow}${getJobData(jobId).name}`);
return true; return true;
} }
// =========================================================================== // ===========================================================================
function createJobRoute(routeName, closestJobLocation, whoCreated = defaultNoAccountId) { function createJobRoute(routeName, closestJobLocation, whoAdded = defaultNoAccountId) {
let tempJobRouteData = new JobRouteData(false); let tempJobRouteData = new JobRouteData(false);
tempJobRouteData.name = routeName; tempJobRouteData.name = routeName;
tempJobRouteData.jobId = closestJobLocation.jobId; tempJobRouteData.jobId = closestJobLocation.jobId;
@@ -3708,8 +3710,8 @@ function createJobRoute(routeName, closestJobLocation, whoCreated = defaultNoAcc
tempJobRouteData.finishMessage = `You have finished the {ALTCOLOUR}{JOBROUTENAME}{MAINCOLOUR} route and {ALTCOLOUR}{JOBROUTEPAY}{MAINCOLOUR} has been added to your next paycheck!`; tempJobRouteData.finishMessage = `You have finished the {ALTCOLOUR}{JOBROUTENAME}{MAINCOLOUR} route and {ALTCOLOUR}{JOBROUTEPAY}{MAINCOLOUR} has been added to your next paycheck!`;
tempJobRouteData.locationArriveMessage = `You arrived at a stop.`; tempJobRouteData.locationArriveMessage = `You arrived at a stop.`;
tempJobRouteData.locationGotoMessage = `Drive to the next stop.`; tempJobRouteData.locationGotoMessage = `Drive to the next stop.`;
tempJobRouteData.whoCreated = whoCreated; tempJobRouteData.whoAdded = whoAdded;
tempJobRouteData.whenCreated = getCurrentUnixTimestamp(); tempJobRouteData.whenAdded = getCurrentUnixTimestamp();
let routeId = getJobData(closestJobLocation.jobIndex).routes.push(tempJobRouteData); let routeId = getJobData(closestJobLocation.jobIndex).routes.push(tempJobRouteData);
saveJobRouteToDatabase(tempJobRouteData); saveJobRouteToDatabase(tempJobRouteData);
@@ -3719,7 +3721,7 @@ function createJobRoute(routeName, closestJobLocation, whoCreated = defaultNoAcc
// =========================================================================== // ===========================================================================
function createJobRouteLocation(routeLocationName, position, jobRouteData, whoCreated = defaultNoAccountId, delay = 0, arriveMessage = "", gotoMessage = "", type = V_JOB_ROUTE_LOC_TYPE_NONE) { function createJobRouteLocation(routeLocationName, position, jobRouteData, whoAdded = defaultNoAccountId, delay = 0, arriveMessage = "", gotoMessage = "", type = V_JOB_ROUTE_LOC_TYPE_NONE) {
let tempJobRouteLocationData = new JobRouteLocationData(false); let tempJobRouteLocationData = new JobRouteLocationData(false);
tempJobRouteLocationData.name = routeLocationName; tempJobRouteLocationData.name = routeLocationName;
tempJobRouteLocationData.routeId = jobRouteData.databaseId; tempJobRouteLocationData.routeId = jobRouteData.databaseId;
@@ -3731,8 +3733,8 @@ function createJobRouteLocation(routeLocationName, position, jobRouteData, whoCr
tempJobRouteLocationData.arriveMessage = arriveMessage; tempJobRouteLocationData.arriveMessage = arriveMessage;
tempJobRouteLocationData.gotoMessage = gotoMessage; tempJobRouteLocationData.gotoMessage = gotoMessage;
tempJobRouteLocationData.type = type; tempJobRouteLocationData.type = type;
tempJobRouteLocationData.whoCreated = whoCreated; tempJobRouteLocationData.whoAdded = whoAdded;
tempJobRouteLocationData.whenCreated = getCurrentUnixTimestamp(); tempJobRouteLocationData.whenAdded = getCurrentUnixTimestamp();
getJobData(jobRouteData.jobIndex).routes[jobRouteData.index].locations.push(tempJobRouteLocationData); getJobData(jobRouteData.jobIndex).routes[jobRouteData.index].locations.push(tempJobRouteLocationData);
//saveJobRouteLocationToDatabase(tempJobRouteLocationData); //saveJobRouteLocationToDatabase(tempJobRouteLocationData);
@@ -3741,13 +3743,16 @@ function createJobRouteLocation(routeLocationName, position, jobRouteData, whoCr
// =========================================================================== // ===========================================================================
function createJobUniform(jobId, skinIndex) { function createJobUniform(jobId, skinIndex, whoAdded = defaultNoAccountId) {
let tempJobUniformData = new JobUniformData(false); let tempJobUniformData = new JobUniformData(false);
tempJobUniformData.skin = skinIndex; tempJobUniformData.skin = skinIndex;
tempJobUniformData.jobIndex = jobId; tempJobUniformData.jobIndex = jobId;
tempJobUniformData.job = getJobData(jobId).databaseId; tempJobUniformData.job = getJobData(jobId).databaseId;
tempJobUniformData.name = getGameConfig().skins[getGame()][skinIndex][1]; tempJobUniformData.name = getGameConfig().skins[getGame()][skinIndex][1];
tempJobUniformData.whoAdded = whoAdded;
tempJobUniformData.whenAdded = getCurrentUnixTimestamp();
tempJobUniformData.needsSaved = true; tempJobUniformData.needsSaved = true;
tempJobUniformData.enabled = true;
getJobData(jobId).uniforms.push(tempJobUniformData); getJobData(jobId).uniforms.push(tempJobUniformData);
@@ -3822,6 +3827,11 @@ function deleteJobUniformCommand(command, params, client) {
return false; return false;
} }
if (doesPlayerHaveJobPermission(client, getJobFlagValue("ManageUniforms"))) {
messagePlayerError(client, "You can't edit job uniforms!");
return false;
}
if (isNaN(uniformIndex)) { if (isNaN(uniformIndex)) {
messagePlayerError(client, getLocaleString(client, "MustBeNumber")); messagePlayerError(client, getLocaleString(client, "MustBeNumber"));
return false; return false;
@@ -3841,6 +3851,82 @@ function deleteJobUniformCommand(command, params, client) {
// =========================================================================== // ===========================================================================
function setJobUniformMinimumRankCommand(command, params, client) {
let uniformIndex = getParam(params, " ", 1);
let newRankLevel = getParam(params, " ", 2);
if (!getJobData(jobId)) {
messagePlayerError(client, getLocaleString(client, "InvalidJob"));
return false;
}
let jobIndex = getPlayerJob(client);
if (doesPlayerHaveJobPermission(client, getJobFlagValue("ManageUniforms"))) {
messagePlayerError(client, "You can't edit job uniforms!");
return false;
}
if (isNaN(uniformIndex)) {
messagePlayerError(client, getLocaleString(client, "MustBeNumber"));
return false;
}
if (isNaN(newRankLevel)) {
messagePlayerError(client, getLocaleString(client, "MustBeNumber"));
return false;
}
if (typeof getJobData(jobId).uniforms[uniformIndex] == "undefined") {
messagePlayerError(client, getLocaleString(client, "InvalidJobUniform"));
return false;
}
if (newRankLevel < 0) {
messagePlayerError(client, "The rank can't be negative!");
return false;
}
getJobData(jobIndex).uniforms[uniformIndex].requiredRank = newRankLevel;
getJobData(jobIndex).uniforms[uniformIndex].needsSaved = true;
messagePlayerSuccess(client, `You set job uniform ${getJobUniformData(jobIndex, uniformIndex).name}'s minimum rank to ${newRankLevel}`);
}
// ===========================================================================
function setJobUniformNameCommand(command, params, client) {
let uniformIndex = getParam(params, " ", 1);
let newName = params.slice(1).join(" ");
if (!getJobData(jobId)) {
messagePlayerError(client, getLocaleString(client, "InvalidJob"));
return false;
}
let jobIndex = getPlayerJob(client);
if (doesPlayerHaveJobPermission(client, getJobFlagValue("ManageUniforms"))) {
messagePlayerError(client, "You can't edit job uniforms!");
return false;
}
if (isNaN(uniformIndex)) {
messagePlayerError(client, getLocaleString(client, "InvalidJobUniform"));
return false;
}
if (typeof getJobData(jobId).uniforms[uniformIndex] == "undefined") {
messagePlayerError(client, getLocaleString(client, "InvalidJobUniform"));
return false;
}
getJobData(jobIndex).uniforms[uniformIndex].name = newName;
getJobData(jobIndex).uniforms[uniformIndex].needsSaved = true;
messagePlayerSuccess(client, `You set job uniform ${getJobUniformData(jobIndex, uniformIndex).name}'s name to ${newName}`);
}
// ===========================================================================
function getJobFromParams(params) { function getJobFromParams(params) {
if (isNaN(params)) { if (isNaN(params)) {
for (let i in getServerData().jobs) { for (let i in getServerData().jobs) {
@@ -4315,6 +4401,31 @@ function getJobRankFromParams(jobIndex, params) {
// =========================================================================== // ===========================================================================
/**
* @param {Number} jobIndex - The job index to search uniforms for
* @param {String} params - The params to search for
* @return {Number} The data index of a matching job
*/
function getJobUniformFromParams(jobIndex, params) {
if (isNaN(params)) {
for (let i in getJobData(jobIndex).uniforms) {
if ((toLowerCase(getJobData(jobIndex).uniforms[i].name).indexOf(toLowerCase(params)) != -1)) {
return i;
}
}
} else {
for (let i in getJobData(jobIndex).uniforms) {
if (getJobData(jobIndex).uniforms[i].level == toInteger(params)) {
return i;
}
}
}
return false;
}
// ===========================================================================
function getJobRoutesCommand(command, params, client) { function getJobRoutesCommand(command, params, client) {
let closestJobLocation = getClosestJobLocation(getPlayerPosition(client)); let closestJobLocation = getClosestJobLocation(getPlayerPosition(client));
@@ -4326,7 +4437,7 @@ function getJobRoutesCommand(command, params, client) {
let jobData = getJobData(closestJobLocation.jobIndex); let jobData = getJobData(closestJobLocation.jobIndex);
let jobRoutesList = jobData.routes.map(function (r) { let jobRoutesList = jobData.routes.map(function (r) {
return `{chatBoxListIndex}${r.index}: ${(r.enabled) ? "{softGreen}" : "{softRed}"}${r.name} {ALTCOLOUR}(${r.locations.length} stops, added ${getTimeDifferenceDisplay(getCurrentUnixTimestamp(), r.whenCreated)} ago)`; return `{chatBoxListIndex}${r.index}: ${(r.enabled) ? "{softGreen}" : "{softRed}"}${r.name} {ALTCOLOUR}(${r.locations.length} stops, added ${getTimeDifferenceDisplay(getCurrentUnixTimestamp(), r.whenAdded)} ago)`;
}); });
let chunkedList = splitArrayIntoChunks(jobRoutesList, 2); let chunkedList = splitArrayIntoChunks(jobRoutesList, 2);
@@ -4368,8 +4479,8 @@ function getJobRouteInfoCommand(command, params, client) {
[`ID`, `${jobRouteData.index}/${jobRouteData.databaseId}`], [`ID`, `${jobRouteData.index}/${jobRouteData.databaseId}`],
[`Job`, `${jobData.name}`], [`Job`, `${jobData.name}`],
[`Name`, `${jobRouteData.name}`], [`Name`, `${jobRouteData.name}`],
[`Added By`, `${loadAccountFromId(jobRouteData.whoCreated).name}`], [`Added By`, `${loadAccountFromId(jobRouteData.whoAdded).name}`],
[`Added On`, `${new Date(jobRouteData.whenCreated * 1000).toLocaleDateString("en-GB")}`], [`Added On`, `${new Date(jobRouteData.whenAdded * 1000).toLocaleDateString("en-GB")}`],
[`Enabled`, `${getYesNoFromBool(jobRouteData.enabled)}`], [`Enabled`, `${getYesNoFromBool(jobRouteData.enabled)}`],
[`Stops`, `${jobRouteData.locations.length}`], [`Stops`, `${jobRouteData.locations.length}`],
[`Pay`, `${getCurrencyString(jobRouteData.pay)}`], [`Pay`, `${getCurrencyString(jobRouteData.pay)}`],
@@ -4463,3 +4574,61 @@ function jobUninviteCommand(command, params, client) {
} }
// =========================================================================== // ===========================================================================
function addPlayerToJobBlackList(client, jobIndex, whoAdded = defaultNoAccountId) {
let tempJobBlackListData = new JobBlackListData(false);
tempJobBlackListData.subAccount = getPlayerCurrentSubAccount(client).databaseId;
tempJobBlackListData.jobIndex = jobIndex;
tempJobBlackListData.job = getJobData(jobIndex).databaseId;
tempJobBlackListData.whoAdded = whoAdded;
tempJobBlackListData.whenAdded = getCurrentUnixTimestamp();
tempJobBlackListData.needsSaved = true;
getJobData(jobIndex).blackList.push(tempJobBlackListData);
setAllJobDataIndexes();
}
// ===========================================================================
function addPlayerToJobWhiteList(client, jobIndex, whoAdded = defaultNoAccountId) {
let tempJobWhiteListData = new JobWhiteListData(false);
tempJobWhiteListData.subAccount = getPlayerCurrentSubAccount(client).databaseId;
tempJobWhiteListData.jobIndex = jobIndex;
tempJobWhiteListData.job = getJobData(jobIndex).databaseId;
tempJobWhiteListData.whoAdded = whoAdded;
tempJobWhiteListData.whenAdded = getCurrentUnixTimestamp();
tempJobWhiteListData.needsSaved = true;
getJobData(jobIndex).whiteList.push(tempJobWhiteListData);
setAllJobDataIndexes();
}
// ===========================================================================
function removePlayerFromJobBlackList(client, jobIndex, whoDeleted = defaultNoAccountId) {
quickDatabaseQuery(`UPDATE job_bl SET job_bl_deleted = 1, job_bl_who_deleted = ${whoDeleted}, job_bl_when_deleted = UNIX_TIMESTAMP() WHERE job_bl_sacct = ${getPlayerCurrentSubAccount(client).databaseId}`)
for (let i in getServerData().jobs[jobIndex].blackList) {
if (getServerData().jobs[jobIndex].blackList[i].subAccount == getPlayerCurrentSubAccount(client).databaseId) {
getServerData().jobs[jobIndex].splice(i, 1);
}
}
setAllJobDataIndexes();
}
// ===========================================================================
function removePlayerFromJobWhiteList(client, jobIndex, whoDeleted = defaultNoAccountId) {
quickDatabaseQuery(`UPDATE job_wl SET job_wl_deleted = 1, job_wl_who_deleted = ${whoDeleted}, job_wl_when_deleted = UNIX_TIMESTAMP() WHERE job_wl_sacct = ${getPlayerCurrentSubAccount(client).databaseId}`)
for (let i in getServerData().jobs[jobIndex].whiteList) {
if (getServerData().jobs[jobIndex].whiteList[i].subAccount == getPlayerCurrentSubAccount(client).databaseId) {
getServerData().jobs[jobIndex].splice(i, 1);
}
}
setAllJobDataIndexes();
}
// ===========================================================================

View File

@@ -61,9 +61,20 @@ let disconnectReasons = [
function getPlayerPosition(client) { function getPlayerPosition(client) {
if (!areServerElementsSupported()) { if (!areServerElementsSupported()) {
return getPlayerData(client).syncPosition; return getPlayerData(client).syncPosition;
} else {
// Check if Mafia 1, player position is bugged when in a vehicle
if (getGame() == V_GAME_MAFIA_ONE) {
if (isPlayerInAnyVehicle(client)) {
return getPlayerVehicle(client).position;
} else {
return getPlayerPed(client).position;
}
} else { } else {
if (getPlayerPed(client) != null) { if (getPlayerPed(client) != null) {
return getPlayerPed(client).position; return getPlayerPed(client).position;
} else {
return toVector3(0.0, 0.0, 0.0);
}
} }
} }
} }
@@ -166,6 +177,10 @@ function isPlayerInAnyVehicle(client) {
if (!areServerElementsSupported()) { if (!areServerElementsSupported()) {
return (getPlayerData().syncVehicle != null); return (getPlayerData().syncVehicle != null);
} else { } else {
if (getPlayerPed(client) == null) {
return false;
}
return (getPlayerPed(client).vehicle != null); return (getPlayerPed(client).vehicle != null);
} }
} }

View File

@@ -219,14 +219,14 @@ function callPayPhoneCommand(command, params, client) {
} }
if (getPlayerData(targetClient).usingPayPhone != -1 || isPlayerRestrained(targetClient) || isPlayerSurrendered(targetClient) || isPlayerMuted(targetClient) || !isPlayerSpawned(targetClient)) { if (getPlayerData(targetClient).usingPayPhone != -1 || isPlayerRestrained(targetClient) || isPlayerSurrendered(targetClient) || isPlayerMuted(targetClient) || !isPlayerSpawned(targetClient)) {
messagePlayerError(client, getLocaleString(client, "UnableToCallPlayer")); messagePlayerError(client, getLocaleString(client, "UnableToCallPlayer", getCharacterFullName(targetClient)));
return false; return false;
} }
let closestPayPhoneTarget = getClosestPayPhone(getPlayerPosition(targetClient)); let closestPayPhoneTarget = getClosestPayPhone(getPlayerPosition(targetClient));
if (closestPayPhoneTarget == closestPayPhone) { if (closestPayPhoneTarget == closestPayPhone) {
messagePlayerError(client, getLocaleString(client, "UnableToCallPlayer")); messagePlayerError(client, getLocaleString(client, "UnableToCallPlayer", getCharacterFullName(targetClient)));
return false; return false;
} }

View File

@@ -330,3 +330,145 @@ function getRadioStationData(radioStationIndex) {
} }
// =========================================================================== // ===========================================================================
function radioTransmitCommand(command, params, client) {
let possibleRadio = getPlayerFirstItemSlotByUseType(client, V_ITEM_USE_TYPE_WALKIETALKIE);
let frequency = -1;
if (possibleRadio != -1) {
if (getItemData(possibleRadio).enabled) {
frequency = getItemData(possibleRadio).value;
}
} else {
let vehicle = null;
if (isPlayerInAnyVehicle(client)) {
vehicle = getPlayerVehicle(client);
} else {
let tempVehicle = getClosestVehicle(getPlayerPosition(client));
if (getDistance(getPlayerPosition(client), getVehiclePosition(tempVehicle)) <= getGlobalConfig().vehicleTrunkDistance) {
vehicle = tempVehicle;
}
}
if (vehicle == null) {
messagePlayerError(client, getLocaleString(client, "NoRadioToUse"));
return false;
}
if (!doesVehicleHaveTransmitRadio(vehicle)) {
messagePlayerError(client, getLocaleString(client, "NoRadioToUse"));
return false;
}
frequency = getVehicleData(vehicle).radioFrequency;
}
if (frequency == -1) {
messagePlayerError(client, getLocaleString(client, "NoRadioToUse"));
return false;
}
sendRadioTransmission(frequency, params, client);
}
// ===========================================================================
function sendRadioTransmission(frequency, messageText, sentFromClient) {
let seenClients = [];
seenClients.push(sentFromClient);
let clients = getClients();
for (let i in clients) {
if (seenClients.indexOf(clients[i]) == -1) {
if (getDistance(getPlayerPosition(clients[i]), getPlayerPosition(sentFromClient)) <= getGlobalConfig().talkDistance) {
seenClients.push(clients[i]);
messagePlayerNormal(`[#CCCCCC]${getCharacterFullName(client)} {ALTCOLOUR}(to radio): {MAINCOLOUR}${messageText}`);
}
}
}
let vehicles = getServerData().vehicles;
for (let i in vehicles) {
if (getVehicleData(vehicles[i]).radioFrequency == frequency) {
for (let j in clients) {
if (seenClients.indexOf(clients[j]) == -1) {
if (getDistance(getPlayerPosition(clients[j]), getVehiclePosition(getServerData().vehicles[j].vehicle)) <= getGlobalConfig().transmitRadioSpeakerDistance) {
seenClients.push(clients[j]);
messagePlayerNormal(clients[j], `📻 {ALTCOLOUR}(On Radio): {MAINCOLOUR}${messageText}`);
}
}
}
}
}
let items = getServerData().items;
for (let i in items) {
if (items[i].enabled) {
if (getItemTypeData(items[i].itemTypeIndex).useType == V_ITEM_USE_TYPE_WALKIETALKIE) {
if (items[i].value == frequency) {
for (let j in clients) {
if (seenClients.indexOf(clients[j]) == -1) {
if (getDistance(getPlayerPosition(clients[j], getItemPosition(i))) <= getGlobalConfig().transmitRadioSpeakerDistance) {
seenClients.push(clients[j]);
messagePlayerNormal(clients[j], `📻 {ALTCOLOUR}(On Radio): {MAINCOLOUR}${messageText}`);
}
}
}
}
}
}
}
}
// ===========================================================================
function setRadioFrequencyCommand(command, params, client) {
// Needs finished
return false;
/*
if (areParamsEmpty(params)) {
messagePlayerSyntax(client, getCommandSyntaxText(command));
return false;
}
if (isNaN(params)) {
messagePlayerError(client, ``);
return false;
}
params = toInteger(params);
if (params < 100 || params > 500) {
messagePlayerError(client, `The frequency channel must be between 100 and 500!`);
return false;
}
if (!getPlayerActiveItem(client)) {
messagePlayerError(client, `You aren't holding a walkie talkie!`);
return false;
}
if (!getItemData(getPlayerActiveItem(client))) {
messagePlayerError(client, `You aren't holding a walkie talkie!`);
return false;
}
if (getItemData(getPlayerActiveItem(client)).enabled) {
if (!doesPlayerHaveKeyBindsDisabled(client) && doesPlayerHaveKeyBindForCommand(client, "use")) {
messagePlayerError(client, `Your walkie talkie is turned off. Press ${toUpperCase(getKeyNameFromId(getPlayerKeyBindForCommand(client, "use")).key)} to turn it on`);
} else {
messagePlayerError(client, `Your walkie talkie is turned off. Type {ALTCOLOUR}/use {MAINCOLOUR}to turn it on`);
}
return false;
}
getItemData(getPlayerActiveItem(client)).value = params * 100;
messagePlayerSuccess(client, getLocaleString(client, "FrequencyChannelChanged", `Walkie Talkie`, `${getPlayerData(client).activeHotBarSlot + 1}`, `${getItemValueDisplayForItem(getPlayerActiveItem(client))}`));
*/
}
// ===========================================================================

View File

@@ -172,6 +172,7 @@ function setAllServerDataIndexes() {
setAllRaceDataIndexes(); setAllRaceDataIndexes();
setAllRadioStationIndexes(); setAllRadioStationIndexes();
setAllPayPhoneIndexes(); setAllPayPhoneIndexes();
setAllVehicleRadioTransmitFrequencies();
cacheAllGroundItems(); cacheAllGroundItems();
cacheAllBusinessItems(); cacheAllBusinessItems();
cacheAllItemItems(); cacheAllItemItems();

View File

@@ -208,8 +208,20 @@ function loadSubAccountsFromAccount(accountId) {
let clanRankIndex = getClanRankIndexFromDatabaseId(clanIndex, tempSubAccount.clanRank); let clanRankIndex = getClanRankIndexFromDatabaseId(clanIndex, tempSubAccount.clanRank);
if (!getClanRankData(clanIndex, clanRankIndex)) { if (!getClanRankData(clanIndex, clanRankIndex)) {
let newClanRankIndex = getLowestClanRank(clanIndex); let newClanRankIndex = getLowestClanRank(clanIndex);
tempSubAccount.clanRank = getClanRankData(clanIndex, newClanRankIndex).databaseId if (getClanRankData(clanIndex, newClanRankIndex) != false) {
console.log(LOG_DEBUG | LOG_WARN, `[V.RP.SubAccount]: Clan ${clanIndex} has no rank ${tempSubAccount.clanRank}! Using lowest rank ${newClanRankIndex} instead.`);
tempSubAccount.clanRank = getClanRankData(clanIndex, newClanRankIndex).databaseId;
tempSubAccount.clanRankIndex = newClanRankIndex; tempSubAccount.clanRankIndex = newClanRankIndex;
} else {
// Somethings fucked. Clan rank invalid, and no other rank to use. Removing from clan.
logToConsole(LOG_DEBUG | LOG_ERROR, `[V.RP.SubAccount]: Clan ${clanIndex} has no rank ${tempSubAccount.clanRank}, and no other rank to use. Removing from clan ...`);
tempSubAccount.clan = 0;
tempSubAccount.clanRank = 0;
tempSubAccount.clanIndex = -1;
tempSubAccount.clanRankIndex = -1;
tempSubAccount.clanTitle = "";
tempSubAccount.clanFlags = 0;
}
} else { } else {
tempSubAccount.clanRankIndex = clanRankIndex; tempSubAccount.clanRankIndex = clanRankIndex;
} }
@@ -231,7 +243,19 @@ function loadSubAccountsFromAccount(accountId) {
let jobRankIndex = getJobRankIndexFromDatabaseId(jobIndex, tempSubAccount.jobRank); let jobRankIndex = getJobRankIndexFromDatabaseId(jobIndex, tempSubAccount.jobRank);
if (!getJobRankData(jobIndex, jobRankIndex)) { if (!getJobRankData(jobIndex, jobRankIndex)) {
let newJobRankIndex = getLowestJobRank(jobIndex); let newJobRankIndex = getLowestJobRank(jobIndex);
console.log(`[V.RP.SubAccount]: Job ${jobIndex} has no rank ${tempSubAccount.jobRank}! Using lowest rank ${newJobRankIndex} instead.`); if (getJobRankData(jobIndex, newJobRankIndex) != false) {
console.log(LOG_DEBUG | LOG_WARN, `[V.RP.SubAccount]: Job ${jobIndex} has no rank ${tempSubAccount.jobRank}! Using lowest rank ${newJobRankIndex} instead.`);
tempSubAccount.jobRank = getJobRankData(jobIndex, newJobRankIndex).databaseId;
tempSubAccount.jobRankIndex = newJobRankIndex;
} else {
// Somethings fucked. Job rank invalid, and no other rank to use. Removing from Job.
logToConsole(LOG_DEBUG | LOG_ERROR, `[V.RP.SubAccount]: Job ${jobIndex} has no rank ${tempSubAccount.jobRank}, and no other rank to use. Removing from job ...`);
tempSubAccount.job = 0;
tempSubAccount.jobRank = 0;
tempSubAccount.jobIndex = -1;
tempSubAccount.jobRankIndex = -1;
}
tempSubAccount.jobRank = getJobRankData(jobIndex, newJobRankIndex).databaseId; tempSubAccount.jobRank = getJobRankData(jobIndex, newJobRankIndex).databaseId;
tempSubAccount.jobRankIndex = newJobRankIndex; tempSubAccount.jobRankIndex = newJobRankIndex;
} else { } else {

View File

@@ -87,6 +87,7 @@ class VehicleData {
this.whoAdded = 0; this.whoAdded = 0;
this.whenAdded = 0; this.whenAdded = 0;
this.licensePlate = ""; this.licensePlate = "";
this.radioFrequency = -1;
this.lastActiveTime = false; this.lastActiveTime = false;
@@ -160,6 +161,9 @@ class VehicleData {
this.whenAdded = toInteger(dbAssoc["veh_when_added"]); this.whenAdded = toInteger(dbAssoc["veh_when_added"]);
this.licensePlate = toInteger(dbAssoc["veh_license_plate"]); this.licensePlate = toInteger(dbAssoc["veh_license_plate"]);
this.rank = toInteger(dbAssoc["veh_rank"]); this.rank = toInteger(dbAssoc["veh_rank"]);
this.radioFrequency = toInteger(dbAssoc["veh_radio_freq"]);
this.whoAdded = toInteger(dbAssoc["veh_who_added"]);
this.whenAdded = toInteger(dbAssoc["veh_when_added"]);
} }
} }
}; };
@@ -1989,3 +1993,35 @@ function getVehicleDataIndexFromVehicle(vehicle) {
} }
// =========================================================================== // ===========================================================================
function doesVehicleHaveTransmitRadio(vehicle) {
if (getVehicleData(vehicle).ownerType == V_VEHOWNER_JOB) {
if (getJobType(getJobIdFromDatabaseId(getVehicleData(vehicle).ownerId)) == V_JOB_POLICE) {
return true;
}
if (getJobType(getJobIdFromDatabaseId(getVehicleData(vehicle).ownerId)) == V_JOB_FIRE) {
return true;
}
if (getJobType(getJobIdFromDatabaseId(getVehicleData(vehicle).ownerId)) == V_JOB_MEDICAL) {
return true;
}
}
return false;
}
// ===========================================================================
function setAllVehicleRadioTransmitFrequencies() {
for (let i in getServerData().vehicles) {
if (getServerData().vehicles[i].ownerType == V_VEHOWNER_JOB) {
if (getJobData(getJobIdFromDatabaseId(getServerData().vehicles[i].ownerId)) != false) {
getServerData().vehicles[i].radioFrequency = getJobData(getJobIdFromDatabaseId(getServerData().vehicles[i].ownerId)).radioFrequency;
}
}
}
}
// ===========================================================================