diff --git a/apps/app-frontend/src/pages/Browse.vue b/apps/app-frontend/src/pages/Browse.vue index da28b6121a..2ef0d66878 100644 --- a/apps/app-frontend/src/pages/Browse.vue +++ b/apps/app-frontend/src/pages/Browse.vue @@ -90,6 +90,9 @@ const { effectiveServerWorldId, serverContextServerData, serverContextWorldName, + serverContextWorldGameVersion, + serverContextWorldLoader, + serverContextWorldLoaderVersion, serverContentProjectIds, queuedServerInstallProjectIds, queuedServerInstallCount, @@ -296,10 +299,10 @@ const serverContextFilters = computed(() => { const pt = projectType.value if (pt !== 'modpack') { - const gameVersion = serverContextServerData.value.mc_version + const gameVersion = serverContextWorldGameVersion.value if (gameVersion) filters.push({ type: 'game_version', option: gameVersion }) - const platform = serverContextServerData.value.loader?.toLowerCase() + const platform = serverContextWorldLoader.value?.toLowerCase().replaceAll('_', '') if (platform && ['fabric', 'forge', 'quilt', 'neoforge'].includes(platform)) filters.push({ type: 'mod_loader', option: platform }) if (platform && ['paper', 'purpur'].includes(platform)) @@ -334,6 +337,14 @@ const combinedProvidedFilters = computed(() => isServerContext.value ? serverContextFilters.value : instanceFilters.value, ) +const serverContentProjectType = computed(() => { + const loader = serverContextWorldLoader.value?.toLowerCase() + if (!loader) return null + if (loader === 'paper' || loader === 'purpur') return 'plugin' + if (loader === 'vanilla') return 'datapack' + return 'mod' +}) + const { serverPings, contextMenuRef, @@ -477,6 +488,21 @@ function resetInstanceContext() { breadcrumbs.setContext(null) } +watch( + [isServerContext, isSetupServerContext, projectType, serverContentProjectType], + ([serverContext, setupServerContext, currentProjectType, targetProjectType]) => { + if (!serverContext || setupServerContext || !targetProjectType) return + if (!['mod', 'plugin', 'datapack'].includes(currentProjectType)) return + if (currentProjectType === targetProjectType) return + + router.replace({ + path: `/browse/${targetProjectType}`, + query: route.query, + }) + }, + { immediate: true }, +) + watch( () => route.params.projectType as ProjectType, async (newType) => { @@ -562,9 +588,9 @@ const installContext = computed(() => { if (isServerContext.value && serverContextServerData.value) { return { name: serverContextWorldName.value ?? formatMessage(messages.worldFallbackName), - loader: serverContextServerData.value.loader ?? '', - loaderVersion: serverContextServerData.value.loader_version ?? '', - gameVersion: serverContextServerData.value.mc_version ?? '', + loader: serverContextWorldLoader.value ?? '', + loaderVersion: serverContextWorldLoaderVersion.value ?? '', + gameVersion: serverContextWorldGameVersion.value ?? '', serverId: serverIdQuery.value, upstream: serverContextServerData.value.upstream, iconSrc: null as string | null, @@ -639,8 +665,8 @@ function getCurrentSelectedInstallPreferences(projectTypeValue: string) { function getServerInstallTargetPreferences(contentType: BrowseInstallContentType) { return getTargetInstallPreferences( { - gameVersion: serverContextServerData.value?.mc_version, - loader: serverContextServerData.value?.loader, + gameVersion: serverContextWorldGameVersion.value, + loader: serverContextWorldLoader.value, }, contentType, ) diff --git a/apps/app-frontend/src/providers/setup/server-install-content.ts b/apps/app-frontend/src/providers/setup/server-install-content.ts index a9c0ccc8d1..983fec9855 100644 --- a/apps/app-frontend/src/providers/setup/server-install-content.ts +++ b/apps/app-frontend/src/providers/setup/server-install-content.ts @@ -65,6 +65,9 @@ export interface ServerInstallContentContext { effectiveServerWorldId: ComputedRef serverContextServerData: Ref serverContextWorldName: ComputedRef + serverContextWorldGameVersion: ComputedRef + serverContextWorldLoader: ComputedRef + serverContextWorldLoaderVersion: ComputedRef serverContentProjectIds: Ref> queuedServerInstallProjectIds: ComputedRef> queuedServerInstallCount: ComputedRef @@ -283,6 +286,21 @@ export function createServerInstallContent(opts: { return serverFull.worlds.find((world) => world.is_active) ?? serverFull.worlds[0] ?? null }) const serverContextWorldName = computed(() => serverContextWorld.value?.name ?? null) + const serverContextWorldGameVersion = computed(() => { + const worldGameVersion = serverContextWorld.value?.content?.game_version + if (worldIdQuery.value) return worldGameVersion ?? null + return worldGameVersion ?? serverContextServerData.value?.mc_version ?? null + }) + const serverContextWorldLoader = computed(() => { + const worldLoader = serverContextWorld.value?.content?.modloader + if (worldIdQuery.value) return worldLoader ?? null + return worldLoader ?? serverContextServerData.value?.loader ?? null + }) + const serverContextWorldLoaderVersion = computed(() => { + const worldLoaderVersion = serverContextWorld.value?.content?.modloader_version + if (worldIdQuery.value) return worldLoaderVersion ?? null + return worldLoaderVersion ?? serverContextServerData.value?.loader_version ?? null + }) const serverBackUrl = computed(() => { const sid = serverIdQuery.value if (!sid) return '/hosting/manage' @@ -688,6 +706,9 @@ export function createServerInstallContent(opts: { effectiveServerWorldId, serverContextServerData, serverContextWorldName, + serverContextWorldGameVersion, + serverContextWorldLoader, + serverContextWorldLoaderVersion, serverContentProjectIds, queuedServerInstallProjectIds, queuedServerInstallCount, diff --git a/packages/ui/src/layouts/wrapped/hosting/manage/[id]/instances/[instance-id]/content.vue b/packages/ui/src/layouts/wrapped/hosting/manage/[id]/instances/[instance-id]/content.vue index 446f2c8734..a92e5c7497 100644 --- a/packages/ui/src/layouts/wrapped/hosting/manage/[id]/instances/[instance-id]/content.vue +++ b/packages/ui/src/layouts/wrapped/hosting/manage/[id]/instances/[instance-id]/content.vue @@ -129,13 +129,6 @@ const { canSetup, permissionDeniedMessage } = useServerPermissions() const router = useRouter() const queryClient = useQueryClient() -const type = computed(() => { - const loader = server.value?.loader?.toLowerCase() - if (loader === 'paper' || loader === 'purpur') return 'plugin' - if (loader === 'vanilla') return 'datapack' - return 'mod' -}) - const queryKey = computed(() => ['content', 'list', 'v1', serverId, worldId.value]) const modpackContentQueryKey = computed(() => [ 'content', @@ -159,6 +152,13 @@ const contentQuery = useQuery({ staleTime: 0, }) +const type = computed(() => { + const loader = (contentQuery.data.value?.modloader ?? server.value?.loader)?.toLowerCase() + if (loader === 'paper' || loader === 'purpur') return 'plugin' + if (loader === 'vanilla') return 'datapack' + return 'mod' +}) + const isModpackContentModalOpen = ref(false) const modpackContentQuery = useQuery({ queryKey: modpackContentQueryKey,