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;