- 88
- 4
- 6
Не знаю как у вас, но у меня утро начинается с модинга в 9 утра , поэтому я решил написать тему про эктрактор файлов.
Вообще, это не совсем моддинг, по большей части стандартная Java, но на Stackoveflow я нормального решения не нашел, а те что находил - не работают, поэтому ловите гайдик.
Начнем с основ. Прочитайте данное сообщение, потом уже продолжайте:
Итак,продолжим.
Я начну с Kotlin, поэтому, если вам нужна Java, листайте ниже.
Для начала создадим класс JarExtractor, после загружаем в него следующее содержимое
В результате, у нас получится, что в папку с майном, по пути
а теперь то же самое, только на java
Итак, на этом все! Если хотите, можете поиграться с этим и сделать возможность кастома своего мода (если, конечно, с ассетридером разберетесь)
P.s. Снимаю с себя ответственность этим сообщением, если вдруг, кто-то решит сделать малварь, основываясь на этом коде.
P.p.s. Я код не смог найти ни в KubeJS, ни в CraftTweaker зато, нашел не понятную лапшу
Вообще, это не совсем моддинг, по большей части стандартная Java, но на Stackoveflow я нормального решения не нашел, а те что находил - не работают, поэтому ловите гайдик.
Начнем с основ. Прочитайте данное сообщение, потом уже продолжайте:
ДАННЫЙ КОД ЯВЛЯЕТСЯ СТАНДАРТНОЙ JAVA(и Kotlin).
ЕСЛИ ВЫ НЕ ЗНАЕТЕ JAVA/KOTLIN, НЕ ЛЕЗТЕ СЮДА.
НЕ РАБОТАЕТ НА MCREATOR!
ЕСЛИ ВЫ НЕ ЗНАЕТЕ JAVA/KOTLIN, НЕ ЛЕЗТЕ СЮДА.
НЕ РАБОТАЕТ НА MCREATOR!
Итак,продолжим.
Я начну с Kotlin, поэтому, если вам нужна Java, листайте ниже.
Для начала создадим класс JarExtractor, после загружаем в него следующее содержимое
JarExtractor.kt:
class JarExtractor{
fun relocate() {
if (FMLEnvironment.production) {
/**
* папка, откуда доставаться файлы
*
* Выглядит это примерно так:
*
* jar://directoryoffiles/MyDir
*/
extractScripts("MyDir")
} else {
// Сообщение о том, что невозможно распоковать файлы, если у нас FML не в продукте, а в ide
Constant.LOGGER.warn("Failed to automatic extract files!")
Constant.LOGGER.warn("If this is developerment side, you can ignore this message")
Constant.LOGGER.warn("You will have to manually copy the scripts located on the path: mymodid/*, where * is the name of the directory.")
Constant.LOGGER.warn("Else, send this to developer")
}
}
private fun extract(sourceFolder: String) {
val resource = "directoryoffiles/${sourceFolder}" // директория в нашем jar файле
val path = FMLPaths.GAMEDIR.get().resolve("mydir/").resolve("myfiles/") // путь до того, где будут наши файлы
val exitFolder= path.toFile().path
extract(resource, exitFolder)
}
private fun extract(sourceFolder: String, targetFolder: String) {
val jarFilePath = ModList.get().getModFileById("mymodid").file.filePath.toFile() // Получаем Jar'ник через ModId
try {
val jarFile = JarFile(jarFilePath)
jarFile.stream()
.filter { entry -> entry.name.startsWith(sourceFolder) }
.forEach { entry -> saveFileFromJar(entry, targetFolder) }
Constant.LOGGER.debug("Extraction completed successfully!")
jarFile.close()
} catch (e: IOException) {
LOGGER.error("Extraction failed!", e)
}
}
// Сам сейвер
private fun saveFileFromJar(entry: JarEntry, targetFolder: String) {
try {
val output = File(targetFolder, entry.name)
if (entry.isDirectory) Files.createDirectories(output.toPath())
else {
JarExtractor::class.java.getResourceAsStream("/" + entry.name).use { inputStream ->
FileOutputStream(output).use { outputStream ->
val buffer = ByteArray(4096)
var bytesRead: Int
if (inputStream != null) {
while (inputStream.read(buffer).also { bytesRead = it } != -1) {
outputStream.write(buffer, 0, bytesRead)
}
}
}
}
}
} catch (e: IOException) {
LOGGER.error("Saving Failed!", e)
}
}
companion object {
@JvmStatic
private var instance: JarExtractor? = null // Нулляем переменную, чтобы потом наделить ее значением
@JvmStatic
fun getInstance(): JarScriptExtractor {
if (instance == null) instance = JarExtractor() // При первом старте мода, будет стартовать и инстанс, без повторного вызова new
return instance!!
}
}
}
В результате, у нас получится, что в папку с майном, по пути
mydir/myfiles/mymodid/directoryoffiles/MyDir
будут извлекаться файлы из нашего Jarnika.а теперь то же самое, только на java
JarExtractor.java:
class JarExtractor {
public static void relocate() {
extractScripts("MyDir");
}
public static void extract(String sourceFolderPath) {
String resourcePath = "directoryoffiles/" + sourceFolderPath;
Path path = FMLPaths.GAMEDIR.get().resolve("mydir/").resolve("myfiles/");
String hesp = path.toFile().getPath();
extract(resourcePath, hesp);
}
public static void extract(String sourceFolderPath, String targetFolder) {
File jarFilePath = ModList.get().getModFileById(Constant.ModId).getFile().getFilePath().toFile();
try {
JarFile jarFile = new JarFile(jarFilePath);
jarFile.stream()
.filter(entry -> entry.getName().startsWith(sourceFolderPath))
.forEach(entry -> saveFileFromJar(entry, targetFolder));
jarFile.close();
Constant.LOGGER.debug("Extraction completed successfully!");
} catch (IOException e) {
Constant.LOGGER.error("Extraction failed!", e);
}
}
private static void saveFileFromJar(JarEntry entry, String targetFolderPath) {
try {
File outputFile = new File(targetFolderPath, entry.getName());
if (entry.isDirectory()) {
Files.createDirectories(outputFile.toPath());
} else {
try (InputStream inputStream = JarExtractor.class.getResourceAsStream("/" + entry.getName());
FileOutputStream outputStream = new FileOutputStream(outputFile)) {
byte[] buffer = new byte[4096];
int bytesRead;
while ((bytesRead = inputStream.read(buffer)) != -1) {
outputStream.write(buffer, 0, bytesRead);
}
}
}
} catch (IOException e) {
Constant.LOGGER.error("Saving Failed!", e);
}
}
}
Итак, на этом все! Если хотите, можете поиграться с этим и сделать возможность кастома своего мода (если, конечно, с ассетридером разберетесь)
P.s. Снимаю с себя ответственность этим сообщением, если вдруг, кто-то решит сделать малварь, основываясь на этом коде.
P.p.s. Я код не смог найти ни в KubeJS, ни в CraftTweaker зато, нашел не понятную лапшу