From e0382cdf86fd220f06c6daa2a241750b727ad78d Mon Sep 17 00:00:00 2001 From: syuilo <4439005+syuilo@users.noreply.github.com> Date: Sat, 16 May 2026 07:12:11 +0900 Subject: [PATCH] duplicateSelectedObject --- packages/frontend/src/pages/rooms/room.core.vue | 6 ++++++ packages/frontend/src/world/room/controller.ts | 4 ++++ packages/frontend/src/world/room/engine.ts | 8 ++++++++ 3 files changed, 18 insertions(+) diff --git a/packages/frontend/src/pages/rooms/room.core.vue b/packages/frontend/src/pages/rooms/room.core.vue index 7ab20fefb9..c4f16bab0f 100644 --- a/packages/frontend/src/pages/rooms/room.core.vue +++ b/packages/frontend/src/pages/rooms/room.core.vue @@ -53,6 +53,7 @@ SPDX-License-Identifier: AGPL-3.0-only + (X) 降りる (Q) @@ -417,6 +418,11 @@ function changeEnvType(type: RoomState['env']['type']) { refresh(); } +function duplicateSelectedObject() { + controller.duplicateSelectedObject(); + canvas.value!.focus(); +} + function removeSelectedObject() { controller.removeSelectedObject(); canvas.value!.focus(); diff --git a/packages/frontend/src/world/room/controller.ts b/packages/frontend/src/world/room/controller.ts index 0357af6661..20cceec507 100644 --- a/packages/frontend/src/world/room/controller.ts +++ b/packages/frontend/src/world/room/controller.ts @@ -158,6 +158,10 @@ export class RoomController extends EngineControllerBase { this.call('beginSelectedInstalledObjectGrabbing'); } + public duplicateSelectedObject() { + this.call('duplicateSelectedObject'); + } + public removeSelectedObject() { this.call('removeSelectedObject'); } diff --git a/packages/frontend/src/world/room/engine.ts b/packages/frontend/src/world/room/engine.ts index 6ea00c09aa..60fa6ff172 100644 --- a/packages/frontend/src/world/room/engine.ts +++ b/packages/frontend/src/world/room/engine.ts @@ -1673,6 +1673,14 @@ export class RoomEngine extends EventEmitter { */ } + public duplicateSelectedObject() { + if (this.selected == null) return; + + const objectState = this.selected.objectState; + + this.addObject(objectState.type, deepClone(objectState.options)); + } + public removeSelectedObject() { if (this.selected == null) return;