summaryrefslogtreecommitdiff
path: root/plugin/src/main/kotlin/moe/nea/archenemy/mojang/ArchenemyMojangExtension.kt
blob: e1a8bfed6d8ab9565fdcff807a4df6f4e673391f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
package moe.nea.archenemy.mojang

import moe.nea.archenemy.MCSide
import net.minecraftforge.artifactural.gradle.GradleRepositoryAdapter
import org.gradle.api.Project
import org.gradle.api.artifacts.Dependency
import org.gradle.api.artifacts.ModuleDependency
import java.io.File
import java.net.URI

abstract class ArchenemyMojangExtension(val project: Project) {
    val sharedExtension = project.rootProject.extensions.getByType(ArchenemySharedExtension::class.java)

    private val _registerMinecraftProvider by lazy {
        GradleRepositoryAdapter.add(
            project.repositories,
            "Minecraft Provider",
            sharedExtension.getLocalCacheDirectory().resolve("minecraft-provider"),
            sharedExtension.minecraftProvider
        )
        GradleRepositoryAdapter.add(
            project.repositories,
            "Minecraft Mapped Provider",
            getLocalCacheDirectory().resolve("minecraft-mapped-provider"),
            mappedRepositoryProvider
        )
        GradleRepositoryAdapter.add(
            project.repositories,
            "Minecraft Merged Provider",
            getLocalCacheDirectory().resolve("minecraft-merged-provider"),
            mergedRepositoryProvider
        )
        project.repositories.maven {
            it.name = "Minecraft Libraries"
            it.url = URI("https://libraries.minecraft.net/")
        }
    }

    private val mappedRepositoryProvider = MappedRepositoryProvider(this)
    private val mergedRepositoryProvider = MergedRepositoryProvider(this)

    fun yarnMappings(dependency: Dependency): MappingDependency {
        dependency as ModuleDependency
        return YarnMappingDependency(this, dependency)
    }

    fun officialMappings(version: String, side: MCSide): MappingDependency {
        _registerMinecraftProvider
        val dependency by lazy {
            project.dependencies.create(
                sharedExtension.minecraftProvider.getMappingsDependencyCoordinate(
                    MinecraftProvider.MinecraftCoordinate(
                        version,
                        side
                    )
                )
            )
        }
        return OfficialMappingDependency(side, version, project.providers.provider { dependency })
    }

    fun intermediaryMappings(version: String): MappingDependency {
        return yarnMappings(project.dependencies.create("net.fabricmc:intermediary:$version:v2"))
    }

    fun mergeJar(
        base: Dependency,
        overlay: Dependency,
    ): Dependency {
        base as ModuleDependency
        overlay as ModuleDependency
        _registerMinecraftProvider
        return project.dependencies.create(
            mergedRepositoryProvider.getCoordinate(
                MergedRepositoryProvider.Coordinate(base, overlay)
            )
        )
    }

    fun mapJar(
        dependency: Dependency,
        mappings: MappingDependency,
        sourceNamespace: String,
        destinationNamespace: String
    ): Dependency {
        dependency as ModuleDependency
        _registerMinecraftProvider
        return project.dependencies.create(
            mappedRepositoryProvider.getDependencyCoordiante(
                MappedRepositoryProvider.MappedCoordinates(
                    dependency, mappings, sourceNamespace, destinationNamespace
                )
            )
        )
    }

    fun minecraft(version: String, side: MCSide): Dependency {
        _registerMinecraftProvider
        return project.dependencies.create(
            sharedExtension.minecraftProvider.getDependencyCoordinate(
                MinecraftProvider.MinecraftCoordinate(
                    version,
                    side,
                )
            )
        )
    }

    fun getLocalCacheDirectory(): File {
        return sharedExtension.getLocalCacheDirectory().resolve("projectspecific")
            .resolve(if (project == project.rootProject) "__root" else project.path.replace(":", "_"))
    }

}