- Версия(и) Minecraft
- *
Ещё один кусочек из chiseled-me.
Тут хитрости с доставанием и считыванием маппингов можно повырезать и просто обрабатывать исходные файлы каким-либо хитрым образом, заимплементив что-то вроде макросов, к примеру.
Тут вызовы метода srg с литеральной строкой и опциональным числом (вроде srg("hello") или srg("player", 3)) реплейсятся строками вроде "field_123".
Число - индекс нужно в том случае, если существуют несколько переменных "player", которые маппятся в разные SRG.
Очевидно, что в моём варианте вам нужен будет метод srg, который принимает строку (ну и для dev-а, её же и возвращает) и тот индекс.
Ну или можно там свой regex нафигачить, всё в ваших руках.
Вот собстно та таска:
А вот тут за вас я уже повырезал всё лишнее, изгаляйтесь над исходниками, как хотите:
UPD: индексы себя не оправдали, потому-что очень много повторяющихся маппингов, и искать для каждого индекс (вроде 25 для "player") в маппинге - нифига не круто, нафиг вся эта таска спрашивается, если всё-равно надо просматривать те маппинги.
Крч теперь я считываю полный маппинг (не csv, а srg, тот что от MCP) и уточнение делается не индексом, а коротким названием файла, так намного лучше)
+ мне ещё один раз пригодилось, когда оверлоады, то там для методов можно и desc указать.
Тут хитрости с доставанием и считыванием маппингов можно повырезать и просто обрабатывать исходные файлы каким-либо хитрым образом, заимплементив что-то вроде макросов, к примеру.
Тут вызовы метода srg с литеральной строкой и опциональным числом (вроде srg("hello") или srg("player", 3)) реплейсятся строками вроде "field_123".
Число - индекс нужно в том случае, если существуют несколько переменных "player", которые маппятся в разные SRG.
Очевидно, что в моём варианте вам нужен будет метод srg, который принимает строку (ну и для dev-а, её же и возвращает) и тот индекс.
Ну или можно там свой regex нафигачить, всё в ваших руках.
Вот собстно та таска:
Gradle (Groovy):
import net.minecraftforge.gradle.user.TaskSourceCopy
task postProcessSources {
dependsOn += tasks.withType(TaskSourceCopy.class)
doLast {
def map = [:].withDefault { [] }
genSrgs.mcpToSrg.eachLine {
if(it.startsWith('CL: ')) {
return
}
def mcp, srg
def desc = null
if (it.startsWith('MD: ')) {
(mcp, desc, srg) = it.split(' ')[1..3]
} else {
(mcp, srg) = it.split(' ')[1..2]
}
def idx = mcp.lastIndexOf('/')
def cls = mcp.substring(mcp.lastIndexOf('/', idx - 1) + 1, idx)
srg = srg.substring(srg.lastIndexOf('/') + 1)
map.get(mcp.substring(idx + 1)).add([srg: srg, cls: cls, desc: desc])
}
def notFound = [:].withDefault { 0 }
def ambiguous = [:].withDefault { 0 }
tasks.withType(TaskSourceCopy.class) {
fileTree(it.getOutput()).each {
it.text = it.text.replaceAll('srg\\(\\s*"(.*?)"(?:\\s*,\\s*"(.*?)")?(?:\\s*,\\s*"(.*?)")?\\s*\\)') {
def (mcp, cls, desc) = it[1..3]
def m = map.get(mcp)
if (cls == null && m.size > 1) {
ambiguous[mcp] += 1
return "\"$mcp\""
}
def x = m.size == 1 ? m.get(0) : m.find { it.cls == cls && (desc == null || desc == it.desc) }
if (x == null) {
notFound[mcp] += 1
return "\"$mcp\""
}
return "\"$x\""
}
}
}
if (!notFound.isEmpty() || !ambiguous.isEmpty()) {
def fn = { it.getKey() + (it.getValue() > 1 ? " (${it.getValue()} times)" : '') }
throw new IllegalStateException("\nProcessing SRG literals failed:\n" +
(!notFound.isEmpty() ? " * Mappings not found for:\n" +
" - ${notFound.collect(fn).join("\n - ")}\n" : "") +
(!ambiguous.isEmpty() ? " * Multiple mappings exist but class is not clarified for:\n" +
" - ${ambiguous.collect(fn).join("\n - ")}\n" : ''))
}
}
}
tasks.withType(AbstractCompile) {
it.dependsOn(postProcessSources)
}
А вот тут за вас я уже повырезал всё лишнее, изгаляйтесь над исходниками, как хотите:
Gradle (Groovy):
import net.minecraftforge.gradle.user.TaskSourceCopy
task postProcessSources {
dependsOn += tasks.withType(TaskSourceCopy.class)
doLast {
tasks.withType(TaskSourceCopy.class) {
fileTree(it.getOutput()).each {
it.text = it.text // here you can do anything with it.text
}
}
}
}
tasks.withType(AbstractCompile) {
it.dependsOn(postProcessSources)
}
UPD: индексы себя не оправдали, потому-что очень много повторяющихся маппингов, и искать для каждого индекс (вроде 25 для "player") в маппинге - нифига не круто, нафиг вся эта таска спрашивается, если всё-равно надо просматривать те маппинги.
Крч теперь я считываю полный маппинг (не csv, а srg, тот что от MCP) и уточнение делается не индексом, а коротким названием файла, так намного лучше)
+ мне ещё один раз пригодилось, когда оверлоады, то там для методов можно и desc указать.