From fbf895b9e6052d8cb2c6bf38964cc15a5fdd67f7 Mon Sep 17 00:00:00 2001 From: ForestOfLight Date: Fri, 6 Jun 2025 02:59:12 -0700 Subject: [PATCH] Attempt to fix all player offline memory leak --- .../classes/Instance/StructureInstance.js | 25 ++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/Construct[BP]/scripts/classes/Instance/StructureInstance.js b/Construct[BP]/scripts/classes/Instance/StructureInstance.js index 1af87d6..e3fa942 100644 --- a/Construct[BP]/scripts/classes/Instance/StructureInstance.js +++ b/Construct[BP]/scripts/classes/Instance/StructureInstance.js @@ -3,7 +3,7 @@ import { StructureOutliner } from "../Render/StructureOutliner"; import { StructureVerifier } from "../Verifier/StructureVerifier"; import { Structure } from "../Structure/Structure"; import { InstanceOptions } from "./InstanceOptions"; -import { TicksPerSecond } from "@minecraft/server"; +import { world, system, TicksPerSecond } from "@minecraft/server"; import { InstanceNotPlacedError } from "../Errors/InstanceNotPlacedError"; import { StructureMaterials } from "../Materials/StructureMaterials"; import { VerificationRenderer } from "../Render/VerificationRenderer"; @@ -20,6 +20,7 @@ export class StructureInstance { this.structure = new Structure(structureId); this.options = new InstanceOptions(instanceName, structureId); this.refreshBox(); + this.subscribeToEvents(); } delete() { @@ -50,6 +51,10 @@ export class StructureInstance { this.materials.refresh(); } + subscribeToEvents() { + this.disableInstanceWhenNoPlayersOnline(); + } + getName() { return this.options.instanceName; } @@ -240,6 +245,24 @@ export class StructureInstance { this.setLayer(this.options.currentLayer - 1); } + disableInstanceWhenNoPlayersOnline() { + // This prevents a memory leak when no players are online. + world.beforeEvents.playerLeave.subscribe(event => { + system.run(() => { + if (world.getAllPlayers().length === 0) { + this.disable(); + this.shouldEnableOnJoin = true; + } + }) + }); + world.afterEvents.playerJoin.subscribe(event => { + if (this.shouldEnableOnJoin) { + this.enable(); + this.shouldEnableOnJoin = false; + } + }); + } + toGlobalCoords(structureLocation) { return Vector.from(structureLocation).add(this.options.worldLocation); }