diff --git a/hub-return-addon/hub_return_transfer_BP/manifest.json b/hub-return-addon/hub_return_transfer_BP/manifest.json index bcfbcd7..87230d0 100644 --- a/hub-return-addon/hub_return_transfer_BP/manifest.json +++ b/hub-return-addon/hub_return_transfer_BP/manifest.json @@ -4,7 +4,7 @@ "name": "Hub Return Transfer", "description": "Transfers players back to lobby when they step on the return portal", "uuid": "b2c3d4e5-1111-2222-3333-fedcba654321", - "version": [1, 0, 5], + "version": [1, 0, 9], "min_engine_version": [1, 21, 0] }, "modules": [ @@ -12,7 +12,7 @@ "type": "script", "language": "javascript", "uuid": "b2c3d4e5-4444-5555-6666-fedcba987654", - "version": [1, 0, 5], + "version": [1, 0, 9], "entry": "scripts/main.js" } ], diff --git a/hub-return-addon/hub_return_transfer_BP/scripts/main.js b/hub-return-addon/hub_return_transfer_BP/scripts/main.js index 15ffb8d..1f0316b 100644 --- a/hub-return-addon/hub_return_transfer_BP/scripts/main.js +++ b/hub-return-addon/hub_return_transfer_BP/scripts/main.js @@ -190,6 +190,8 @@ world.afterEvents.playerSpawn.subscribe((event) => { player.runCommand(`titleraw @s title {"rawtext":[{"text":"§6Welcome!"}]}`); player.runCommand(`titleraw @s subtitle {"rawtext":[{"text":"§7You are now in §e${WORLD_NAME}"}]}`); giveCompassIfMissing(player); + // Light social reminder — break-protection only covers chests, not terrain. + player.sendMessage("§7[Tip] §fUse a §dprivate chest§f for valuables — break-protection only covers chests."); } catch (e) { // Player may have disconnected } @@ -244,6 +246,27 @@ async function openCompassMenu(player) { form.button("\uD83E\uDDED Get a marker block"); actions.push({ kind: "give_marker" }); + // Family Goals integration — only surfaces if the family-goals addon is loaded + // in this world. We sniff its world dynamic property; absence = silent skip. + let familyLoaded = false; + let famDebug = "?"; + let idsList = "?"; + try { + const v = world.getDynamicProperty("family_goals_v1"); + famDebug = `${typeof v}:${v === undefined ? "undef" : String(v).slice(0, 30)}`; + familyLoaded = v !== undefined; + if (typeof world.getDynamicPropertyIds === "function") { + idsList = world.getDynamicPropertyIds().join(","); + } else { + idsList = "(getDynamicPropertyIds missing)"; + } + } catch (e) { famDebug = `err:${e.message}`; } + console.warn(`[Hub][diag] familyLoaded=${familyLoaded} probe=${famDebug} ids=${idsList}`); + if (familyLoaded) { + form.button("\uD83C\uDFC6 Family"); + actions.push({ kind: "family_menu" }); + } + form.button("§7Cancel"); actions.push({ kind: "cancel" }); @@ -282,6 +305,14 @@ async function openCompassMenu(player) { giveMarkerBlock(player); return; } + if (a.kind === "family_menu") { + // Hand off to family-goals addon. The scriptevent is dispatched as the + // player so family-goals' subscriber sees event.sourceEntity = this player. + try { player.runCommand("scriptevent family:menu"); } catch (e) { + player.sendMessage(`§c[Hub] Couldn't open Family menu: ${e.message}`); + } + return; + } } function giveMarkerBlock(player) {