diff --git a/xmcl-keystone-ui/src/components/InstanceManifestFileItem.vue b/xmcl-keystone-ui/src/components/InstanceManifestFileItem.vue
index 783a24a9b..e4575ff45 100644
--- a/xmcl-keystone-ui/src/components/InstanceManifestFileItem.vue
+++ b/xmcl-keystone-ui/src/components/InstanceManifestFileItem.vue
@@ -24,20 +24,19 @@
chevron_right
-
@@ -55,7 +54,7 @@
{{ getExpectedSize(item.size) }}
diff --git a/xmcl-keystone-ui/src/composables/instanceFileNodeData.ts b/xmcl-keystone-ui/src/composables/instanceFileNodeData.ts
index d15ece9c8..6a28d54b6 100644
--- a/xmcl-keystone-ui/src/composables/instanceFileNodeData.ts
+++ b/xmcl-keystone-ui/src/composables/instanceFileNodeData.ts
@@ -2,6 +2,8 @@ import { InjectionKey, Ref } from 'vue'
import { InstanceFile } from '@xmcl/runtime-api'
import { basename } from '@/util/basename'
import { CSSProperties } from 'vue/types/jsx'
+import { injection } from '@/util/inject'
+import { kInstanceModsContext } from './instanceMods'
export interface InstanceFileNode {
name: string
@@ -28,6 +30,7 @@ export type InstanceFileExportData = {
}
export function useInstanceFileNodesFromLocal(local: Ref) {
+ const { modsIconsMap } = injection(kInstanceModsContext)
function getFileNode(f: InstanceFile): InstanceFileNode {
return reactive({
name: basename(f.path),
@@ -42,6 +45,9 @@ export function useInstanceFileNodesFromLocal(local: Ref) {
modrinth: !!f.modrinth,
},
children: undefined,
+ curseforge: !!f.curseforge,
+ modrinth: !!f.modrinth,
+ avatar: modsIconsMap.value[basename(f.path, '/')],
})
}
const result = ref(local.value.map(getFileNode))
diff --git a/xmcl-keystone-ui/src/composables/instanceMods.ts b/xmcl-keystone-ui/src/composables/instanceMods.ts
index ea3564e57..34e890c39 100644
--- a/xmcl-keystone-ui/src/composables/instanceMods.ts
+++ b/xmcl-keystone-ui/src/composables/instanceMods.ts
@@ -8,6 +8,7 @@ import { InjectionKey, Ref } from 'vue'
import { useLocalStorageCache } from './cache'
import { useService } from './service'
import { useState } from './syncableState'
+import { basename } from '@/util/basename'
export const kInstanceModsContext: InjectionKey> = Symbol('instance-mods')
@@ -106,6 +107,7 @@ export function useInstanceMods(instancePath: Ref, instanceRuntime: Ref<
for (const item of newItems) {
// Update icon map
newIconMap[item.modId] = item.icon
+ newIconMap[basename(item.path)] = item.icon
if (item.enabled) {
for (const [key, val] of Object.entries(item.provideRuntime)) {
runtime[key] = val
diff --git a/xmcl-keystone-ui/src/views/AppExportDialog.vue b/xmcl-keystone-ui/src/views/AppExportDialog.vue
index 6d1ac532c..9d1fc1a58 100644
--- a/xmcl-keystone-ui/src/views/AppExportDialog.vue
+++ b/xmcl-keystone-ui/src/views/AppExportDialog.vue
@@ -405,15 +405,15 @@ const { refresh, refreshing } = useRefreshable(async () => {
const files = manifest.files
let selected = [] as string[]
selected = files
- .filter(file => !file.path.startsWith('.'))
- .filter(file => !file.path.startsWith('logs'))
- .filter(file => !file.path.startsWith('crash-reports'))
- .filter(file => !file.path.startsWith('saves'))
- .filter(file => !file.path.startsWith('resourcepacks'))
- .filter(file => !file.path.startsWith('screenshots'))
- .filter(file => !file.path.startsWith('data'))
- .filter(file => !file.path.startsWith('server'))
- .filter(file => !exclusions.includes(file.path))
+ .filter(file => file.path.startsWith('resourcepacks')
+ || file.path.startsWith('mods')
+ || file.path.startsWith('config')
+ || file.path.startsWith('scripts')
+ || file.path.startsWith('shaderpacks')
+ || file.path.startsWith('options.txt')
+ || file.path.startsWith('optionsof.txt')
+ || file.path.startsWith('servers.dat'))
+ .filter(file => !file.path.endsWith('.disabled'))
.map(file => file.path)
nextTick().then(() => { data.selected = selected })
data.files = files
diff --git a/xmcl-runtime/instanceIO/InstanceFileDiscover.ts b/xmcl-runtime/instanceIO/InstanceFileDiscover.ts
index 9d68c74bd..69419d40b 100644
--- a/xmcl-runtime/instanceIO/InstanceFileDiscover.ts
+++ b/xmcl-runtime/instanceIO/InstanceFileDiscover.ts
@@ -28,6 +28,9 @@ export async function discover(instancePath: string, logger: Logger, filter?: (r
if (relativePath === 'instance.json') {
return
}
+ if (relativePath === 'server' && status.isDirectory()) {
+ return
+ }
// no lib or exe
if (relativePath.endsWith('.dll') || relativePath.endsWith('.so') || relativePath.endsWith('.exe')) {
return