async function objectDialog(type) { return new Promise(async function(resolve, reject) { switch(type) { case "item": { resolve( await itemsDialog() ); break; } case "account": { resolve( await accountsDialog() ); break; } case "weapon": { resolve( await weaponsDialog() ); break; } } }); } function getDefaultMarkerCustomization() { return { type: 27, scale: { x: 0.7, y: 0.7, z: 0.7 }, color: { red: 0, green: 255, blue: 0, opacity: 200 }, rotation: { x: 0.0, y: 0.0, z: 0.0 }, followCamera: false, bounce: false, rotate: true } } async function markerDialog(currentMarkerData) { return new Promise((resolve, reject) => { let markerModal = $("#marker-customization-dialog-modal"); if(!currentMarkerData) { currentMarkerData = getDefaultMarkerCustomization() } $("#marker-type").val(currentMarkerData.type); $("#marker-size-x").val(currentMarkerData.scale.x); $("#marker-size-y").val(currentMarkerData.scale.y); $("#marker-size-z").val(currentMarkerData.scale.z); $("#marker-color-red").val(currentMarkerData.color.red); $("#marker-color-green").val(currentMarkerData.color.green); $("#marker-color-blue").val(currentMarkerData.color.blue); $("#marker-color-opacity").val(currentMarkerData.color.opacity); $("#marker-rotation-x").val(currentMarkerData.rotation.x); $("#marker-rotation-y").val(currentMarkerData.rotation.y); $("#marker-rotation-z").val(currentMarkerData.rotation.z); $("#marker-follow-camera").prop("checked", currentMarkerData.followCamera); $("#marker-bounce").prop("checked", currentMarkerData.bounce); $("#marker-rotate").prop("checked", currentMarkerData.rotate); $("#marker-customization-form").unbind().submit(function(event) { if(isThereAnyErrorInForm(event)) return; let markerData = { type: parseInt( $("#marker-type").val() ), scale: { x: parseFloat( $("#marker-size-x").val() ), y: parseFloat( $("#marker-size-y").val() ), z: parseFloat( $("#marker-size-z").val() ) }, color: { red: parseInt( $("#marker-color-red").val() ), green: parseInt( $("#marker-color-green").val() ), blue: parseInt( $("#marker-color-blue").val() ), opacity: parseInt( $("#marker-color-opacity").val() ) }, rotation: { x: parseFloat( $("#marker-rotation-x").val() ), y: parseFloat( $("#marker-rotation-y").val() ), z: parseFloat( $("#marker-rotation-z").val() ) }, followCamera: $("#marker-follow-camera").prop("checked"), bounce: $("#marker-bounce").prop("checked"), rotate: $("#marker-rotate").prop("checked") } markerModal.modal("hide"); resolve(markerData); }) markerModal.modal("show"); }); } function getDefaultBlipCustomization() { return { isEnabled: true, sprite: 651, label: "Field", scale: 0.8, color: 2, display: 2, } } function getDefaultBlipCustomizationForFarms() { return { isEnabled: true, sprite: 1, label: "Farm", scale: 0.8, color: 2, display: 2, } } function getDefaultBlipCustomizationForWorkbenches() { return { isEnabled: false, sprite: 1, label: "Workbench", scale: 0.8, color: 2, display: 2, } } function getDefaultBlipCustomizationForFoundries() { return { isEnabled: true, sprite: 436, label: "Foundry", scale: 0.8, color: 2, display: 2, } } async function blipDialog(currentBlipData) { return new Promise((resolve, reject) => { let blipModal = $("#blip-customization-dialog-modal"); if(!currentBlipData) { currentBlipData = getDefaultBlipCustomization() } $("#blip-enabled").prop("checked", currentBlipData.isEnabled).change(); $("#blip-sprite").val(currentBlipData.sprite); $("#blip-name").val(currentBlipData.label); $("#blip-color").val(currentBlipData.color); $("#blip-display").val(currentBlipData.display); $("#blip-scale").val(currentBlipData.scale); $("#blip-customization-form").unbind().submit(function(event) { if(isThereAnyErrorInForm(event)) return; let blipData = { isEnabled: $("#blip-enabled").prop("checked"), sprite: parseInt( $("#blip-sprite").val() ), label: $("#blip-name").val(), scale: parseFloat( $("#blip-scale").val() ), color: parseInt( $("#blip-color").val() ), display: parseInt( $("#blip-display").val() ), } blipModal.modal("hide"); resolve(blipData); }) blipModal.modal("show"); }); } $("#blip-enabled").change(function() { let isEnabled = $(this).prop("checked"); $("#blip-customization-form").find("input, select").not( $(this) ) .prop("disabled", !isEnabled) .prop("required", isEnabled); }) async function doorsDialog(alreadySelectedDoors = {}) { return new Promise((resolve, reject) => { let inputDoorsModal = $("#input-doors-dialog-modal") inputDoorsModal.modal("show"); $("#input-door-search").val(""); $.post(`https://${resName}/getAllDoors`, JSON.stringify({}), function (doors) { let inputDoorsList = $("#doors-list"); inputDoorsList.empty(); for(const[buildingId, data] of Object.entries(doors)) { let buildingDiv = $(`

${data.label}

`); for(let [doorsId, doorsData] of Object.entries(data.doors)) { let doorDiv = $(`
`); buildingDiv.find(".doors-list").append(doorDiv); } inputDoorsList.append(buildingDiv); } for(let [doorsId, _] of Object.entries(alreadySelectedDoors) ) { $(`input[data-doors-id=${doorsId}]`).prop("checked", true); } // Unbinds the button and rebinds it to callback the selected doors $("#input-doors-confirm-btn").unbind().click(function() { let selectedDoors = {}; inputDoorsList.find("input:checked").each(function() { let doorsId = parseInt( $(this).data("doorsId") ) selectedDoors[doorsId] = true; }); inputDoorsModal.modal("hide"); resolve(selectedDoors); }) }); }) } $("#input-door-search").on("keyup", function() { let text = $(this).val().toLowerCase(); $("#doors-list .form-check").filter(function() { $(this).toggle($(this).text().toLowerCase().indexOf(text) > -1) }); }) function societiesDialog(oldSocieties) { return new Promise((resolve, reject) => { let inputSocietiesModal = $("#input-societies-dialog-modal") inputSocietiesModal.modal("show"); $("#input-society-search").val(""); $.post(`https://${resName}/getAllJobs`, JSON.stringify({}), function (jobs) { let societiesListDiv = $("#societies-list"); societiesListDiv.empty(); for(const[jobName, jobData] of Object.entries(jobs)) { let jobDiv = $(`

${jobData.label}

${getLocalizedText("menu:percentage")}
`); $(jobDiv).find(".society-checkbox").change(function() { let isEnabled = $(this).prop("checked"); $(this).closest(".society").find(".percentage").prop("disabled", !isEnabled).prop("required", isEnabled); }) societiesListDiv.append(jobDiv); } if(oldSocieties) { for(let [jobName, percentage] of Object.entries(oldSocieties)) { $("#societies-list") .find(`[data-job-name="${jobName}"]`).prop("checked", true).change() .closest(".society").find(".percentage").val(percentage); } } // Unbinds the button and rebinds it to callback the selected jobs $("#input-societies-confirm-btn").unbind().click(function() { let selectedSocieties = {}; let isThereAnySociety = false; let isAllValid = true; societiesListDiv.find("input:checked").each(function() { isThereAnySociety = true; let percentageDiv = $(this).closest(".society").find(".percentage"); let jobName = $(this).data("jobName"); let percentage = parseInt( percentageDiv.val() ); if(percentage) { selectedSocieties[jobName] = percentage; } else { isAllValid = false; } }); if(isAllValid) { inputSocietiesModal.modal("hide"); resolve(isThereAnySociety ? selectedSocieties : false); } }) }); }) } $("#input-society-search").on("keyup", function() { let text = $(this).val().toLowerCase(); $("#societies-list .society").filter(function() { $(this).toggle($(this).text().toLowerCase().indexOf(text) > -1) }); }) /* Single job dialog */ async function singleJobDialog() { return new Promise((resolve, reject) => { let inputSingleJobModal = $("#input-single-job-dialog-modal") inputSingleJobModal.modal("show"); $("#input-single-job-search").val(""); $.post(`https://${resName}/getAllJobs`, JSON.stringify({}), function (jobs) { let jobsListDiv = $("#single-jobs-list"); jobsListDiv.empty(); for(const[jobName, jobData] of Object.entries(jobs)) { let jobDiv = $(`
  • ${jobData.label}
  • `); jobDiv.click(function() { inputSingleJobModal.modal("hide"); resolve(jobName); }); jobsListDiv.append(jobDiv); } }); }) } $("#input-single-job-search").on("keyup", function() { let text = $(this).val().toLowerCase(); $("#single-jobs-list li").filter(function() { $(this).toggle($(this).text().toLowerCase().indexOf(text) > -1) }); }) /* Ground materials */ function getDefaultMaterialsOptions() { return { [0]: null, [1187676648]: null, [-1084640111]: null, [282940568]: null, [-840216541]: null, [-124769592]: null, [765206029]: null, [576169331]: null, [1639053622]: null, [1945073303]: null, [592446772]: null, [1913209870]: null, [-1595148316]: null, [510490462]: null, [909950165]: null, [-1907520769]: null, [-1937569590]: null, [-878560889]: null, [1619704960]: null, [951832588]: 0.8, [2128369009]: 0.8, [-356706482]: 0.9, [-1885547121]: 1.0, [-1942898710]: 1.0, [1635937914]: 1.0, [-273490167]: null, [1109728704]: 1.0, [223086562]: 1.0, [1584636462]: 0.8, [1144315879]: null, [560985072]: 0.7, [-461750719]: 1.0, [1333033863]: 1.0, [-1286696947]: 1.0, [-1833527165]: null, [-913351839]: null, [-2041329971]: 0.8, } } function groundMaterialsDialog(oldMaterials) { return new Promise((resolve, reject) => { oldMaterials = oldMaterials || getDefaultMaterialsOptions(); let inputGroundMaterialsModal = $("#input-ground-materials-dialog-modal") inputGroundMaterialsModal.modal("show"); $.post(`https://${resName}/getAllGroundMaterials`, JSON.stringify({}), function (groundMaterials) { let groundMaterialsListDiv = $("#ground-materials-list"); groundMaterialsListDiv.empty(); for(const[materialId, materialLabel] of Object.entries(groundMaterials)) { let materialDiv = $(`

    ${materialLabel}

    `); materialDiv.find(".allowed-material-checkbox").change(function() { const enabled = $(this).prop("checked"); materialDiv.find(".speed-multiplier").prop("disabled", !enabled).prop("required", enabled); if(!enabled) { materialDiv.find(".speed-multiplier").val(""); } }); materialDiv.find(".speed-multiplier-div").tooltip({html: true}); groundMaterialsListDiv.append(materialDiv); } if(oldMaterials) { for(const[material, speedMultiplier] of Object.entries(oldMaterials)) { let materialDiv = groundMaterialsListDiv.find(`[data-material-id="${material}"]`); materialDiv.find(".allowed-material-checkbox").prop("checked", speedMultiplier != undefined).change(); materialDiv.find(".speed-multiplier").val(speedMultiplier); } } // Unbinds the button and rebinds it to callback the resolve function $("#input-ground-materials-form").unbind().submit(function(event) { if(isThereAnyErrorInForm(event)) return; let selectedMaterials = {}; groundMaterialsListDiv.find(".material").each(function() { let isMaterialUsable = $(this).find(".allowed-material-checkbox").prop("checked"); if(isMaterialUsable) { let materialId = $(this).data("material-id"); let speedMultiplier = parseFloat( $(this).find(".speed-multiplier").val() ); selectedMaterials[materialId] = speedMultiplier; } }) inputGroundMaterialsModal.modal("hide"); resolve(selectedMaterials); }) }); }) } const defaultPlantingAnimData = { type: "scenario", scenarioName: "WORLD_HUMAN_GARDENER_PLANT", duration: 5 } const defaultPlantInteractionAnimData = { type: "scenario", scenarioName: "PROP_HUMAN_BUM_BIN", duration: 5 } const defaultWorkbenchAnimData = { type: "animation", animDict: "missmechanic", animName: "work2_base", duration: 5 } const defaultFormulaAnimData = { type: "animation", animDict: "missmechanic", animName: "work2_base", duration: 5 } function addAnimation(animData) { let animListDiv = $("#animations-dialog-animations-list"); const index = animListDiv.children().length; let animDiv = $(`
    ${getLocalizedText("menu:animations_list")}
    ${getLocalizedText("menu:animation_dictionary")}
    ${getLocalizedText("menu:animation_name")}
    ${getLocalizedText("menu:duration")}

    `); let animationTypeDiv = animDiv.find(".animation-type-div"); animationTypeDiv.find(".animation-type-radio").change(function() { const newValue = $(this).val(); if(newValue == "scenario") { animDiv.find(".animation-div").hide().find("input").prop("required", false); animDiv.find(".special-div").hide().find("input").prop("required", false); animDiv.find(".scenario-div").show().find("input").prop("required", true); } else if(newValue == "animation") { animDiv.find(".scenario-div").hide().find("input").prop("required", false); animDiv.find(".special-div").hide().find("input").prop("required", false); animDiv.find(".animation-div").show().find("input").prop("required", true); } else if(newValue == "special") { animDiv.find(".scenario-div").hide().find("input").prop("required", false); animDiv.find(".animation-div").hide().find("input").prop("required", false); animDiv.find(".special-div").show().find("input").prop("required", true); } }); animDiv.find(".remove-animation-btn").click(function() { animDiv.remove(); }); if(animData) { animationTypeDiv.find(`.animation-type-radio[value="${animData.type}"]`).prop("checked", true).change(); if(animData.type == "scenario") { animDiv.find(".scenario-name").val(animData.scenarioName); animDiv.find(".scenario-duration").val(animData.duration); } else if(animData.type == "animation") { animDiv.find(".animation-dictionary").val(animData.animDict); animDiv.find(".animation-name").val(animData.animName); animDiv.find(".animation-duration").val(animData.duration); } else if(animData.type == "special") { animDiv.find(".special-animation").val(animData.specialAnimation); animDiv.find(".special-duration").val(animData.duration); } } animListDiv.append(animDiv); } function animationsDialog(oldAnimations) { return new Promise((resolve, reject) => { let animationsModal = $("#animations-dialog-modal"); $("#animations-dialog-animations-list").empty(); if(oldAnimations) { oldAnimations.forEach((animData) => { addAnimation(animData); }); } animationsModal.modal("show"); $("#animations-form").unbind().submit(function(event) { if(isThereAnyErrorInForm(event)) return; const animationsList = []; let isThereAnyAnimation = false; $("#animations-dialog-animations-list").find(".animation").each(function() { isThereAnyAnimation = true; const animationType = $(this).find(".animation-type-radio:checked").val(); if(animationType == "animation") { const animDict = $(this).find(".animation-dictionary").val(); const animName = $(this).find(".animation-name").val(); const duration = parseFloat( $(this).find(".animation-duration").val() ); animationsList.push({ type: "animation", animDict: animDict, animName: animName, duration: duration }); } else if(animationType == "scenario") { const scenarioName = $(this).find(".scenario-name").val(); const duration = parseFloat( $(this).find(".scenario-duration").val() ); animationsList.push({ type: "scenario", scenarioName: scenarioName, duration: duration }); } else if(animationType == "special") { const specialAnimation = $(this).find(".special-animation").val(); const duration = parseFloat( $(this).find(".special-duration").val() ); animationsList.push({ type: "special", specialAnimation: specialAnimation, duration: duration }); } }); animationsModal.modal("hide"); resolve(isThereAnyAnimation ? animationsList : null); }) }) } $("#animations-dialog-add-animation-btn").click(function() { addAnimation(); }) $("#animations-dialog-add-default-planting-animation-btn").click(function() { addAnimation(defaultPlantingAnimData); }) $("#animations-dialog-add-default-interaction-animation-btn").click(function() { addAnimation(defaultPlantInteractionAnimData); }) async function formulasDialog(alreadySelectedFormulas = {}) { return new Promise((resolve, reject) => { let inputFormulasModal = $("#formulas-dialog-modal") inputFormulasModal.modal("show"); $("#input-formula-search").val(""); $.post(`https://${resName}/getAllFormulas`, JSON.stringify({}), function (formulas) { let inputFormulasList = $("#formulas-list"); inputFormulasList.empty(); for(const[formulaId, data] of Object.entries(formulas)) { // Many divs because flexbox can't use $.toggle let formulaDiv = $(`
    `); $(formulaDiv).find(".edit-formula-btn").click(function() { editFormula(data.id); }) inputFormulasList.append(formulaDiv); } for(let [formulaId, _] of Object.entries(alreadySelectedFormulas) ) { $(`input[data-formula-id=${formulaId}]`).prop("checked", true); } // Unbinds the button and rebinds it to callback the selected formulas $("#formulas-form").unbind().submit(function(event) { if(isThereAnyErrorInForm(event)) return; let selectedFormulas = {}; inputFormulasList.find("input:checked").each(function() { let formulaId = parseInt( $(this).data("formulaId") ) selectedFormulas[formulaId] = true; }); inputFormulasModal.modal("hide"); resolve(selectedFormulas); }) }); }) } $("#input-formula-search").on("keyup", function() { let text = $(this).val().toLowerCase(); $("#formulas-list .formula-div .formula-checkbox").filter(function() { const formulaDiv = $(this).closest(".formula-div"); const canSee = $(this).text().toLowerCase().indexOf(text) > -1; formulaDiv.toggle(canSee); }); }) function getDefaultObjectCustomization() { return { isEnabled: false, model: "", rotation: { x: 0.0, y: 0.0, z: 0.0 } } } function getDefaultObjectCustomizationForWorkbenches() { return { isEnabled: true, model: "prop_tablesaw_01", rotation: { x: 0.0, y: 0.0, z: 0.0 } } } async function objectCustomizationDialog(currentObjectData) { return new Promise((resolve, reject) => { let objectModal = $("#object-customization-dialog-modal"); if(!currentObjectData) { currentObjectData = getDefaultObjectCustomization() } $("#object-enabled").prop("checked", currentObjectData.isEnabled).change(); $("#object-model").val(currentObjectData.model); $("#object-rotation-x").val(currentObjectData.rotation.x); $("#object-rotation-y").val(currentObjectData.rotation.y); $("#object-rotation-z").val(currentObjectData.rotation.z); $("#object-customization-form").unbind().submit(function(event) { if(isThereAnyErrorInForm(event)) return; let objectData = { isEnabled: $("#object-enabled").prop("checked"), model: $("#object-model").val(), rotation: { x: parseFloat( $("#object-rotation-x").val() ), y: parseFloat( $("#object-rotation-y").val() ), z: parseFloat( $("#object-rotation-z").val() ) } } objectModal.modal("hide"); resolve(objectData); }) objectModal.modal("show"); }); } $("#object-enabled").change(function() { let isEnabled = $(this).prop("checked"); $("#object-customization-form").find("input, select").not( $(this) ) .prop("disabled", !isEnabled) .prop("required", isEnabled); }) function toggleCursor(enabled) { if (enabled) { $.post(`https://${resName}/enableCursor`, JSON.stringify({})); } else { $.post(`https://${resName}/disableCursor`, JSON.stringify({})); } } function loadDialog(dialogName) { var script = document.createElement('script'); console.log(`../utils/dialogs/${dialogName}/${dialogName}.js`) script.setAttribute('src',`../utils/dialogs/${dialogName}/${dialogName}.js`); document.head.appendChild(script); } // Messages received by client window.addEventListener('message', (event) => { let data = event.data; let action = data.action; switch(action) { case "loadDialog": { var script = document.createElement('script'); script.setAttribute('src',`../utils/dialogs/${data.dialogName}/${data.dialogName}.js`); document.head.appendChild(script); break; } } }) $.post(`https://${resName}/nuiReady`, JSON.stringify({}));