Update worldEdit.js

This commit is contained in:
redbirdly 2025-08-21 11:06:55 +08:00 committed by GitHub
parent 0fbf786e48
commit d3e681dea2
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
1 changed files with 26 additions and 14 deletions

View File

@ -1,6 +1,6 @@
"use strict"; "use strict";
// WorldEdit.js (compiled) // WorldEdit.js (compiled)
// Version: 1.1.0 // Version: 1.2.0
// Constants // Constants
const w_accentColor = "#7cff62"; const w_accentColor = "#7cff62";
const w_style = { const w_style = {
@ -9,7 +9,8 @@ const w_style = {
selectStroke: w_accentColor, selectStroke: w_accentColor,
selectDash: true, selectDash: true,
pasteFill: "#00FFFF40", pasteFill: "#00FFFF40",
pasteStroke: "#00FFFF" pasteStroke: "#00FFFF",
pastePixelColor: "#00FFFF44"
}; };
// Global variables // Global variables
let worldEditElements = {}; let worldEditElements = {};
@ -18,7 +19,7 @@ let w_state = {
firstSelectionPos: {x: 0, y: 0}, firstSelectionPos: {x: 0, y: 0},
selection: null, selection: null,
clipboard: null, clipboard: null,
prevNonWorldEditElement: "unknown" lastNonWorldEditElement: "unknown"
}; };
// Define settings // Define settings
let w_settingsTab; let w_settingsTab;
@ -81,6 +82,10 @@ class Rect {
} }
// Functions // Functions
function reverseString(str) {
return [...str].reverse().join("");
}
function isPointInWorld(point) { function isPointInWorld(point) {
return point.x >= 0 && point.x <= width && point.y >= 0 && point.y <= height; return point.x >= 0 && point.x <= width && point.y >= 0 && point.y <= height;
} }
@ -112,10 +117,11 @@ function updatePastePreviewCanvas() {
const imageData = pastePreviewCtx.createImageData(clipboardRect.w, clipboardRect.h); const imageData = pastePreviewCtx.createImageData(clipboardRect.w, clipboardRect.h);
const buffer = new Uint32Array(imageData.data.buffer); const buffer = new Uint32Array(imageData.data.buffer);
buffer.fill(0x00000000); buffer.fill(0x00000000);
const pixelColorBinary = parseInt(reverseString(w_style.pastePixelColor.slice(1)), 16);
for (let y = 0; y < clipboardRect.h; y++) { for (let y = 0; y < clipboardRect.h; y++) {
for (let x = 0; x < clipboardRect.w; x++) { for (let x = 0; x < clipboardRect.w; x++) {
if (clipboard[y][x]) if (clipboard[y][x])
buffer[y * clipboardRect.w + x] = 0x44FFFF00; buffer[y * clipboardRect.w + x] = pixelColorBinary;
} }
} }
pastePreviewCtx.putImageData(imageData, 0, 0); pastePreviewCtx.putImageData(imageData, 0, 0);
@ -200,8 +206,8 @@ function modifySelectElement() {
// @ts-ignore // @ts-ignore
selectElement = (element) => { selectElement = (element) => {
// Keep track of last non-worldEdit element // Keep track of last non-worldEdit element
if (!worldEditElements.hasOwnProperty(currentElement)) if (!worldEditElements.hasOwnProperty(element))
w_state.prevNonWorldEditElement = currentElement; w_state.lastNonWorldEditElement = element;
originalSelectElement(element); originalSelectElement(element);
}; };
} }
@ -221,7 +227,7 @@ function addWorldEditElements(elementsToAdd) {
element.rawOnSelect = originalOnSelect; element.rawOnSelect = originalOnSelect;
element.onSelect = function (...args) { element.onSelect = function (...args) {
originalOnSelect(...args); originalOnSelect(...args);
selectElement(w_state.prevNonWorldEditElement); selectElement(w_state.lastNonWorldEditElement);
}; };
} }
} }
@ -248,17 +254,17 @@ worldEditElements.w_select = {
return; return;
if (!isPointInWorld(pos)) if (!isPointInWorld(pos))
return; return;
if (mouseType === "middle" || mouseType === "right") if (e.button === 1 || e.button === 2)
return; return;
w_state.firstSelectionPos = pos; w_state.firstSelectionPos = pos;
}, },
onPointerMove: function (e) { onPointerMoveAnywhere: function (e) {
const pos = mousePosToWorldPos({x: e.clientX, y: e.clientY}); const pos = mousePosToWorldPos({x: e.clientX, y: e.clientY});
if (!mouseIsDown) if (!mouseIsDown)
return; return;
if (showingMenu) if (showingMenu)
return; return;
if (mouseType === "middle" || mouseType === "right") if (e.button === 1 || e.button === 2)
return; return;
if (currentElement !== "w_select") if (currentElement !== "w_select")
return; return;
@ -291,12 +297,12 @@ worldEditElements.w_copy = {
} }
}; };
worldEditElements.w_paste = { worldEditElements.w_paste = {
onPointerDown: function () { onPointerDown: function (e) {
if (showingMenu) if (showingMenu)
return; return;
if (!isPointInWorld(mousePos)) if (!isPointInWorld(mousePos))
return; return;
if (mouseType === "middle" || mouseType === "right") if (e.button === 1 || e.button === 2)
return; return;
const clipboard = w_state.clipboard; const clipboard = w_state.clipboard;
if (!clipboard) { if (!clipboard) {
@ -380,7 +386,7 @@ worldEditElements.w_delete = {
worldEditElements.w_fill = { worldEditElements.w_fill = {
onSelect: function () { onSelect: function () {
const selection = w_state.selection; const selection = w_state.selection;
const fillElement = w_state.prevNonWorldEditElement; const fillElement = w_state.lastNonWorldEditElement;
if (!selection) { if (!selection) {
logMessage("Error: Nothing is selected."); logMessage("Error: Nothing is selected.");
return; return;
@ -388,9 +394,11 @@ worldEditElements.w_fill = {
// Fill area // Fill area
for (let y = selection.y; y < selection.y2; y++) { for (let y = selection.y; y < selection.y2; y++) {
for (let x = selection.x; x < selection.x2; x++) { for (let x = selection.x; x < selection.x2; x++) {
if (pixelMap[x][y])
continue;
const placed = currentPixels.push(new Pixel(x, y, fillElement)); const placed = currentPixels.push(new Pixel(x, y, fillElement));
if (!placed) if (!placed)
return; continue;
if (currentPixels.length > maxPixelCount || !fillElement) { if (currentPixels.length > maxPixelCount || !fillElement) {
currentPixels[currentPixels.length - 1].del = true; currentPixels[currentPixels.length - 1].del = true;
} else if (elements[fillElement] && elements[fillElement].onPlace !== undefined) { } else if (elements[fillElement] && elements[fillElement].onPlace !== undefined) {
@ -425,5 +433,9 @@ runAfterReset(() => {
if (elements[currentElement] && elements[currentElement].onPointerMove) if (elements[currentElement] && elements[currentElement].onPointerMove)
elements[currentElement].onPointerMove(e); elements[currentElement].onPointerMove(e);
}, {passive: false}); }, {passive: false});
document.addEventListener("pointermove", (e) => {
if (elements[currentElement] && elements[currentElement].onPointerMoveAnywhere)
elements[currentElement].onPointerMoveAnywhere(e);
});
addedCustomEventListeners = true; addedCustomEventListeners = true;
}); });