@@ -34,6 +34,8 @@ interface ModInfo {
3434 _deps : BackendDep [ ] ; // raw deps
3535 resolveDependencies : ( ) => DepResolveResult ;
3636 file : string ;
37+ duplicateCount : number ;
38+ duplicateFiles : string [ ]
3739}
3840
3941interface MissingModDepInfo {
@@ -170,6 +172,8 @@ const ModLocal = ({
170172 version,
171173 optional = false ,
172174 file,
175+ duplicateCount,
176+ duplicateFiles
173177} : ModInfo & { optional ?: boolean } ) => {
174178 const { download } = useGlobalContext ( ) ;
175179 const [ expanded , setExpanded ] = useState ( false ) ;
@@ -272,6 +276,11 @@ const ModLocal = ({
272276 { dependedByFiltered . length }
273277 </ ModBadge >
274278 ) }
279+ { duplicateCount > 1 && < ModBadge bg = "#DB3D73" color = "white" title = {
280+ duplicateFiles . map ( ( v ) => v . split ( '/' ) . pop ( ) ) . join ( ' | ' )
281+ } >
282+ 重复 Mod · { duplicateCount } 次
283+ </ ModBadge > }
275284
276285 { ctx ?. showUpdate && updateState && (
277286 < ModBadge
@@ -452,13 +461,19 @@ export const Manage = () => {
452461
453462 return { status, message } as DepResolveResult ;
454463 } ,
464+ duplicateCount : 1 ,
465+ duplicateFiles : [ mod . file ]
455466 } ;
456- modMap . set ( mod . name , modInfo ) ;
467+ if ( modMap . has ( mod . name ) ) {
468+ modMap . get ( mod . name ) ! . duplicateCount = modMap . get ( mod . name ) ! . duplicateCount + 1 ;
469+ modMap . get ( mod . name ) ! . duplicateFiles . push ( mod . file ) ;
470+ } else {
471+ modMap . set ( mod . name , modInfo ) ;
472+ }
457473 }
458474
459- for ( const mod of installedMods ) {
460- const modInfo = modMap . get ( mod . name ) ! ;
461- for ( const dep of mod . deps ) {
475+ for ( const modInfo of modMap . values ( ) ) {
476+ for ( const dep of modInfo . _deps ) {
462477 if ( ! modMap . has ( dep . name ) ) {
463478 modInfo . dependencies . push ( {
464479 name : dep . name ,
0 commit comments