Полное имя NMod - Native-Mod. Native-Mod модифицирует Minecraft с помощью native кода (C/C++), поэтому он называется NMod. Как мы все знаем Minecraft Pocket Edition написан на C++.
NMods сложен в написании. Язык программирования C++ очень сложный. Ниже рассказывается, как разработать свои NMods.
- Навыки программирования на C/C++
- Компилятор кода для Android (Android Studio, Eclipse, AIDE и др.)
- Некоторые навыки создания библиотек (*.so)
- Знание синтаксиса Json
Native-Mods ссылается на libsubstrate.so и libminecraftpe.so для выполнения модификаций. Убедитесь, что вы объеденили модуль substrate и minecraftpe.
(Вы можете посмотреть наши примеры, чтобы узнать, как объеденить эти библиотеки.)
NModAPI provides some listeners to tell each NMod when the nmod is loaded,the game is started or finished.You only need to define these methods,then NModAPI will invoke them.
- OnLoad Listener:
NMod_OnLoad(JavaVM* javaVM,JNIEnv* jniEnv,const char* minecraftVersion,const char* nmodApiVersion,const char* pathOflibminecraftpeso)
javaVM is a pointer to JavaVM.
jniEnv is a pointer to JNIEnv.
minecraftVersion is a c-style string,values installed minecraft version name.
nmodApiVersion is a c-style string,values NModAPI version name.
pathOflibminecraftpeso is a c-style string,values libminecraftpe.so's path.You can use dlopen with it: dlopen(pathOflibminecraftpeso,RTLD_LAZY); - OnActicityCreate Listener:
NMod_OnActivityCreate(JNIEnv* env,jobject thiz,jobject savedInstanceState)
env is a pointer to JNIEnv
thiz is a jobject.[Lcom/mojang/minecraftpe/MainActivity;]
savedInstanceState is a jobject.[Landroid/os/Bundle;] - OnActivityFinish Listener:
NMod_OnActivityFinish(JNIEnv* env,jobject thiz)
env a ppinter to JNIEnv
thiz is a jobject.[Lcom/mojang/minecraftpe/MainActivity;]
Не понимаете? Посмотрите наши примеры!
После вышеуказанных шагов, как мы можем изменить minecraft?
Substrate Framework предоставляет метод модификации: MSHookFunction. MSHookFunction может заменить методы по умолчанию, заданные в libminecraftpe.so нашими собственными методами, и предлагает способ вызова методов по умолчанию.
MSHookFunction требует три аргумента:
MSHookFunction( (void*)& DefaultMethod,
(void*)& ReplacementMethod,
(void**)& MethodPointerOfDefaultMethod);
Например, если мы хотим заменить Explosion :: explode() в libminectpepe.so, мы можем написать:
//Определяем метод по умолчанию
class Explosion
{
public:
void explode();
}
//Define Method Pointer
void (*explode_default)(Explosion*);
void explode_replacement(Explosion* self)
{
//Do Something
//If you want to explode properly instead of no explosion, invoke the method pointer.
explode_default(self);
}
//Регистрация MSHookFunction в NMod_OnLoad
extern "C" void NMod_OnLoad(JavaVM*, JNIEnv*, const char*, const char*, const char*)
{
MSHookFunction( (void*)& Explosion::explode,
(void*)& explode_replacement,
(void**)& explode_default);
}
NModAPI читает информацию nmod, читая nmod_manifest.json.
Если вы хотите использовать редактор nmod json или текстовый редактор nmod, вы также можете определить информацию редактирования в нём!
{
//Советы. Вам не нужно определять все элементы в этом json-файле.
//Имя NMod.
"name" : "My NMod",
//Имя пакета NMod. Имя пакета должно соответствовать пакету в AndroidManifest.xml!
"package_name" : "my.nmod.package.name",
//Автор NMod. Напишите здесь свое имя или название вашей организации.
"author" : "Me or My Company",
//NMod native libraries.
"native_libs_info" :
[
{
//имя native library:
//должен соответствовать имени вашей native library!
"name" : "libmynmodlib.so",
//whether the nmod uses nmodapi:
//use_api must be true if you use game listeners(NMod_OnLoad,NMod_OnActivityCreate,NMod_OnActivityFinish).
"use_api" : "true"
}
//Вы даже можете загружать больше библиотек ...
//,
//{
// "name" : "libmynmodlib2.so",
// "use_api" : false
//}
],
//Код версии:
//Default value is -1.
"version_code" : 1,
//Версия:
"version_name" : "1.0",
//Для какой версии Minecraft
"minecraft_version_name" : "1.11.0.1",
//Описание Nmod:
"description" : "My NMod Description",
//Что нового в этой версии? Напишите изменения в change_log.
"change_log" : "My NMod Change Log",
//NMod Banner
//Mod Banner - это изображение на главной странице.
//Заголовок баннера - это текстовое представление, лежащее под изображением. По умолчанию это имя NMOD.
"banner_title" : "My NMod is the Best!",
//Путь к файлу баннера в assets.
//Изображение должно быть размером 1024 (ширина) * 500 (высота)!
//NModAPI will find assets/my_banner.png in this case.
"banner_image_path" : "my_banner.png"
//Assest Text Edit API
//Текстовый редактор может редактировать текстовые файлы в файлах minecraft pe.
/*
,
"text_edit" :
[
{
//path - путь текстового файла в assets.
//Файл замены и файл по умолчанию должны определяться в assets nmod и в assets minecraft одновременно.
//В этом случае NModAPI будет читать assets/resource_packs/vanilla/texts/en_US.lang
"path" : "resource_packs/vanilla/texts/en_US.lang",
//Существует три вида режима редактирования текста: объединение, prepend, замена.
//Значение по умолчанию - замена.
//If you defines a different mode,THE TEXT EDIT WILL NOT WORK!
//MODE: append: append text after the source text.
//MODE: prepend: prepend text before the source text.
//MODE: replace: replace the source text with the new one(text defines in nmod assets).
//In this case,NModAPI will append the replacement texts after the default texts.
"mode" : "append"
},
{
"path" : "resource_packs/vanilla/texts/zh_CN.lang",
"mode" : "append"
}
]*/
//Assest Json Edit API
//Редактор Json может редактировать json-файлы в minecraft assets.
/*
,
"json_edit" :
[
{
//path - путь к файлу json в assets.
//Файл замены и файл по умолчанию должны определяться в assets nmod и в assets minecraft одновременно.
//В этом случае NModAPI будет читать resource_packs/vanilla/textures/item_texture.json
"path" : "resource_packs/vanilla/textures/item_texture.json",
//Существует два режима редактирования json: слияние, замена.
//Значение по умолчанию - замена.
//If you defines a different mode,THE TEXT EDIT WILL NOT WORK!
//MODE: merge: объединяет два json-файла.
//MODE: replace: замените источник json на новый (json определяет в ресурсах nmod).
//В этом случае NModAPI объединит два json-файла в один.
"mode" : "merge"
}
//Вы даже можете отредактировать json...
//,
//{
// "path" : "File Path",
// "mode" : "replace"
//}
]
*/
}
- Способ 1: Упаковка в apk.
Если вы упакуете nmod в файл apk, его можно установить менеджером пакетов Android и прочитать NModAPI.
В этом случае nmod_manifest.json следует поместить в активы. (assets/nmod_manifest.json). Библиотеки должны быть упакованы в lib/CPU_ARCH/.
Советы: NModAPI читает только два вида CPU_ARCH: armeabi-v7a и x86.
Советы: NMod, установленный диспетчером Android Package, может автоматически обновляться, если вы устанавливаете новую версию nmod. Так что упаковка в apk в основном используется для разработки NMods.
Предупреждение: package_name определяется в nmod_manifest.json, которое должно соответствовать пакету в AndroidManifest.xml! - Способ 2: Упаковка в файл.
Не нравится установка apk? Вы можете упаковать свой NMOD в файл!
Этот файл может быть (*.apk, *.zip, *.nmod, *.mcnmod).
В этом случае nmod_manifest.json можно поместить в активы dir или root dir (assets/nmod_manifest.json или nmod_manifest.json).
Предупреждение: НЕ помещайте два nmod_manifest.json в разные каталоги!
Советы: NMod, упакованный в файл, не может автоматически обновляться. Поэтому он в основном используется для публикации NMOD.
- Просмотрите наши примеры NMod!
https://github.com/TimScriptov/NMOD-Examples - Просмотр исходного кода NModAPI!
https://github.com/TimScriptov/ModdedPE