Files
Construct-CN/packs/BP/scripts/classes/MenuForm.js
T
wed150 136d5ffa3b
/ build (push) Waiting to run
Start working at 1.2.0
2026-08-26 09:54:39 +08:00

103 lines
4.1 KiB
JavaScript

import { forceShow } from '../utils';
import { instanceCollection } from './Instance/InstanceCollection';
import { MenuFormBuilder } from './MenuFormBuilder';
import { InstanceForm } from './Instance/InstanceForm';
import { BuilderForm } from './Builder/BuilderForm';
import { InstanceExistsError } from './Errors/InstanceExistsError';
import { StructureNotFoundError } from './Errors/StructureNotFoundError';
import { getDefaultRenderMode } from '../options/defaultRenderMode';
export class MenuForm {
constructor(player, { jumpToInstance = false, instanceName = void 0 } = {}) {
this.player = player;
this.show(jumpToInstance, instanceName);
}
async show(jumpToInstance = false, instanceName = void 0) {
if (jumpToInstance) {
if (!instanceName)
instanceName = instanceCollection.getInstanceAt(this.player.dimension.id, this.player.location, { useActiveLayer: false })?.getName();
if (instanceName) {
new InstanceForm(this.player, instanceName);
return;
}
}
instanceName = await this.getInstanceNameFromForm();
if (!instanceName)
return;
new InstanceForm(this.player, instanceName);
}
async getInstanceNameFromForm() {
try {
const instanceNames = instanceCollection.getInstanceNamesSortedByEnabled();
return forceShow(this.player, MenuFormBuilder.buildAllInstanceName(instanceNames)).then((response) => {
if (response.canceled)
return void 0;
let selection = response.selection;
if (selection === 0) {
new BuilderForm(this.player);
return void 0;
} else if (selection == instanceNames.length + 2) {
MenuFormBuilder.buildHowTo().show(this.player);
return void 0;
} else {
selection--;
const selectedInstanceName = instanceNames[selection];
return selectedInstanceName || this.createNewInstance();
}
});
} catch (error) {
if (error.message === 'Menu timed out.') {
this.player.sendMessage({ translate: 'construct.menu.open.timeout' });
return void 0;
}
throw error;
}
}
async createNewInstance() {
return MenuFormBuilder.buildNewInstance().show(this.player).then(async (response) => {
if (response.canceled)
return void 0;
const instanceName = response.formValues[0];
if (instanceName === '')
return void 0;
const structureId = await this.getStructureId();
if (!structureId)
return void 0;
try {
instanceCollection.add(instanceName, structureId, { renderMode: getDefaultRenderMode(this.player.id) });
} catch (error) {
if (error instanceof InstanceExistsError || error instanceof StructureNotFoundError) {
error.sendTo(this.player);
return void 0;
}
throw error;
}
return instanceName;
});
}
async getStructureId() {
return MenuFormBuilder.buildAllStructures().show(this.player).then((response) => {
if (response.canceled)
return void 0;
const worldStructureIds = instanceCollection.getWorldStructureIds();
worldStructureIds.sort((a, b) => a.localeCompare(b));
const selectedStructureId = worldStructureIds[response.selection];
return selectedStructureId || this.getOtherStructureId();
});
}
getOtherStructureId() {
return MenuFormBuilder.buildOtherStructure().show(this.player).then((response) => {
if (response.canceled)
return void 0;
const structureId = response.formValues[0];
if (structureId === '')
return void 0;
return structureId;
});
}
}