setLayer form and make easyPlace rules require paper named "easyPlace"

This commit is contained in:
ForestOfLight
2025-04-12 20:56:24 -07:00
Unverified
parent 8da6474b38
commit 6ced22b57b
8 changed files with 48 additions and 34 deletions
+8 -17
View File
@@ -2,6 +2,7 @@ import { structureCollection } from './StructureCollection';
import { MenuForm } from '../classes/MenuForm';
import { ActionFormData } from '@minecraft/server-ui';
import { InstanceEditOptions } from './InstanceEditOptions';
import { InstanceEditFormBuilder } from './InstanceEditFormBuilder';
export class InstanceEditForm {
instanceName;
@@ -34,8 +35,8 @@ export class InstanceEditForm {
}
show() {
const form = this.buildInstanceForm();
form.show(this.player).then((response) => {
const currentOptions = this.instance.isPlaced() ? this.options.isPlaced : this.options.notPlaced;
InstanceEditFormBuilder.buildInstance(this.instanceName, currentOptions, this.options.common).show(this.player).then((response) => {
if (response.canceled) return;
let selectedOption;
if (this.instance.isPlaced())
@@ -46,20 +47,6 @@ export class InstanceEditForm {
});
}
buildInstanceForm() {
const instanceOptions = this.instance.isPlaced() ? this.options.isPlaced : this.options.notPlaced;
const form = new ActionFormData()
.title('§l§2StrucTool §8Menu')
.body(`Instance: §2${this.instanceName}`)
instanceOptions.forEach(option => {
form.button(`${option}`);
});
this.options.common.forEach(option => {
form.button(`${option}`);
});
return form;
}
handleOption(option) {
switch (option) {
case InstanceEditOptions.PlaceInstance:
@@ -111,6 +98,10 @@ export class InstanceEditForm {
}
setLayerForm() {
// should have a toggle for if it should layer the structure or notw
InstanceEditFormBuilder.buildSetLayer(this.instance.getBounds().max.y, this.instance.getLayer()).show(this.player).then((response) => {
if (response.canceled) return;
const selectedLayer = response.formValues[0];
this.instance.setLayer(parseInt(selectedLayer));
});
}
}
+26 -1
View File
@@ -1,7 +1,32 @@
import { ActionFormData, ModalFormData } from '@minecraft/server-ui';
import { MenuFormBuilder } from './MenuFormBuilder';
export class InstanceEditFormBuilder {
static buildRenameInstance() {
static buildInstance(instanceName, currentOptions, commonOptions) {
const form = new ActionFormData()
.title(MenuFormBuilder.menuTitle)
.body(`Instance: §2${instanceName}`)
currentOptions.forEach(option => {
form.button(`${option}`);
});
commonOptions.forEach(option => {
form.button(`${option}`);
});
return form;
}
static buildRenameInstance() {
return new ModalFormData()
.title(MenuFormBuilder.menuTitle)
.textField('Enter a new name for the instance:', 'example_instance')
.submitButton('Rename');
}
static buildSetLayer(maxLayer, currentLayer) {
return new ModalFormData()
.title(MenuFormBuilder.menuTitle)
.label('Use the slider to select the layer. Use 0 for all layers.')
.slider("Layer", 0, maxLayer, 1, currentLayer)
.submitButton('Set Layer');
}
}
+4 -4
View File
@@ -28,7 +28,7 @@ export class MenuForm {
async getInstanceNameFromForm() {
try {
return forceShow(this.player, MenuFormBuilder.buildAllInstanceNameForm()).then((response) => {
return forceShow(this.player, MenuFormBuilder.buildAllInstanceName()).then((response) => {
if (response.canceled) return;
const selectedInstanceName = structureCollection.getInstanceNames()[response.selection];
return selectedInstanceName || this.createNewInstance();
@@ -43,7 +43,7 @@ export class MenuForm {
}
async createNewInstance() {
return MenuFormBuilder.buildNewInstanceForm().show(this.player).then(async (response) => {
return MenuFormBuilder.buildNewInstance().show(this.player).then(async (response) => {
if (response.canceled)
return;
const instanceName = response.formValues[0];
@@ -58,7 +58,7 @@ export class MenuForm {
}
async getStructureId() {
return MenuFormBuilder.buildAllStructuresForm().show(this.player).then((response) => {
return MenuFormBuilder.buildAllStructures().show(this.player).then((response) => {
if (response.canceled)
return;
const selectedStructureId = structureCollection.getWorldStructureIds()[response.selection];
@@ -67,7 +67,7 @@ export class MenuForm {
}
getOtherStructureId() {
return MenuFormBuilder.buildOtherStructureForm().show(this.player).then((response) => {
return MenuFormBuilder.buildOtherStructure().show(this.player).then((response) => {
if (response.canceled)
return;
const structureId = response.formValues[0];
+4 -4
View File
@@ -4,7 +4,7 @@ import { structureCollection } from './StructureCollection';
export class MenuFormBuilder {
static menuTitle = '§l§2StrucTool §8Menu';
static buildAllInstanceNameForm() {
static buildAllInstanceName() {
const allInstanceNameForm = new ActionFormData()
.title(this.menuTitle)
.body('Select an instance:');
@@ -15,14 +15,14 @@ export class MenuFormBuilder {
return allInstanceNameForm;
}
static buildNewInstanceForm() {
static buildNewInstance() {
return new ModalFormData()
.title(this.menuTitle)
.textField('Enter a name for the new instance:', 'example_instance')
.submitButton('Submit');
}
static buildAllStructuresForm() {
static buildAllStructures() {
const allStructuresForm = new ActionFormData()
.title(this.menuTitle)
.body('Select a structure:');
@@ -34,7 +34,7 @@ export class MenuFormBuilder {
return allStructuresForm;
}
static buildOtherStructureForm() {
static buildOtherStructure() {
return new ModalFormData()
.title(this.menuTitle)
.textField('Enter the Structure ID:', 'example_structure')
+2 -2
View File
@@ -115,7 +115,7 @@ export class StructureInstance {
}
setLayer(layer) {
if (layer < 1 || layer > this.#structure.size.y)
if (layer < 0 || layer > this.#structure.size.y)
throw new Error(`[StrucTool] Instance '${this.name}' of '${this.structureId}' does not have layer ${layer}.`);
this.#options.currentLayer = layer;
this.updateOptions();
@@ -129,7 +129,7 @@ export class StructureInstance {
const { min, max } = this.getLayeredBounds();
this.outliner = new Outliner(this.#options.dimensionId, this.toGlobalCoords(min), this.toGlobalCoords(max));
} else {
this.outliner = new Outliner(dimensionId, this.toGlobalCoords(this.getBounds().min), this.toGlobalCoords(this.getBounds().max));
this.outliner = new Outliner(this.#options.dimensionId, this.toGlobalCoords(this.getBounds().min), this.toGlobalCoords(this.getBounds().max));
}
}
-2
View File
@@ -1,7 +1,5 @@
import { Command } from '../lib/canopy/CanopyExtension';
import { extension } from '../config';
import { structureCollection } from '../classes/StructureCollection';
import { MaterialCounter } from '../classes/MaterialCounter';
import { world, system } from '@minecraft/server';
import { MenuForm } from '../classes/MenuForm';
+2 -2
View File
@@ -9,7 +9,7 @@ const ACTION_SLOT = 35;
const easyPlace = new Rule({
identifier: 'easyPlace',
description: { text: 'Simplifies placing blocks in a structure (paper in bottom right inventory slot).' },
description: { text: "Simplifies placing blocks in a structure (paper named 'easyPlace' in bottom right inventory slot)." },
onEnableCallback: () => { world.beforeEvents.playerPlaceBlock.subscribe(onPlayerPlaceBlock); },
onDisableCallback: () => { world.beforeEvents.playerPlaceBlock.unsubscribe(onPlayerPlaceBlock); }
})
@@ -29,7 +29,7 @@ function hasActionItemInCorrectSlot(player) {
if (!inventory)
return false;
const actionSlot = inventory.getSlot(ACTION_SLOT);
return actionSlot.hasItem() && actionSlot.typeId === 'minecraft:paper';
return actionSlot.hasItem() && actionSlot.typeId === 'minecraft:paper' && actionSlot.nameTag === 'easyPlace';
}
function fetchStructureBlock(location) {
+2 -2
View File
@@ -8,7 +8,7 @@ import { Raycaster } from '../classes/Raycaster';
let runner = void 0;
const easyPlace = new Rule({
identifier: 'fastEasyPlace',
description: { text: 'Looking at structure blocks with paper in your hand will place them.' },
description: { text: "Looking at structure blocks with paper named 'easyPlace' in your hand will place them." },
onEnableCallback: () => { runner = system.runInterval(onTick, 2); },
onDisableCallback: () => { system.clearRun(runner); }
})
@@ -35,7 +35,7 @@ function isHoldingActionItem(player) {
const mainhandItemStack = player.getComponent(EntityComponentTypes.Equippable).getEquipment(EquipmentSlot.Mainhand);
if (!mainhandItemStack)
return false;
return mainhandItemStack.typeId === 'minecraft:paper';
return mainhandItemStack.typeId === 'minecraft:paper' && mainhandItemStack.nameTag === 'easyPlace';
}
function tryPlaceBlock(player, worldBlock, structureBlock) {