概要
Forge式記法のJSONファイルとGitHubを利用してMOD更新時の通知を追加する。
ソースコード
下の解説を読むだけでもだいたい分かる(はず)
package com.tntmodders.tutorial;
import net.minecraft.block.Block;
import net.minecraft.client.renderer.block.model.ModelResourceLocation;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.Item;
import net.minecraft.item.ItemBlock;
import net.minecraft.item.ItemStack;
import net.minecraft.util.ResourceLocation;
import net.minecraftforge.client.event.ModelRegistryEvent;
import net.minecraftforge.client.model.ModelLoader;
import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.event.RegistryEvent;
import net.minecraftforge.event.entity.player.EntityItemPickupEvent;
import net.minecraftforge.event.entity.player.PlayerContainerEvent;
import net.minecraftforge.fml.common.FMLCommonHandler;
import net.minecraftforge.fml.common.Mod;
import net.minecraftforge.fml.common.event.FMLConstructionEvent;
import net.minecraftforge.fml.common.event.FMLInitializationEvent;
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
import java.util.List;
@Mod(modid = "aluminiummod", version = "1.0", name = "AluminiumMod",
updateJSON = "https://raw.githubusercontent.com/TNTModders/aluminiummod/master/version/aluminiumVersionCheck" +
".json")
public class AluminiumMod {
public static final Item ALUMINIUM = new ItemAluminium();
public static final Block ALUMINIUM_BLOCK = new BlockAluminium();
private static final AluminiumRecipeHolder HOLDER = new AluminiumRecipeHolder();
@Mod.Instance("aluminiummod")
public static AluminiumMod aluminiumInstance;
@Mod.EventHandler
//この関数でMODファイル自体をイベントの発火先にする。
public void construct(FMLConstructionEvent event) {
MinecraftForge.EVENT_BUS.register(this);
}
//アイテムを登録するイベント。 旧preinitのタイミングで発火する。
@SubscribeEvent
public void registerItems(RegistryEvent.Register- event) {
event.getRegistry().register(ALUMINIUM);
event.getRegistry().register(new ItemBlock(ALUMINIUM_BLOCK).setRegistryName("aluminiummod", "aluminium_block"));
}
//ブロックを登録するイベント。 旧preinitのタイミングで発火する。
@SubscribeEvent
public void registerBlocks(RegistryEvent.Register event) {
event.getRegistry().register(ALUMINIUM_BLOCK);
}
//モデルを登録するイベント。SideOnlyによってクライアント側のみ呼ばれる。旧preinitのタイミングで発火する。
@SubscribeEvent
@SideOnly(Side.CLIENT)
public void registerModels(ModelRegistryEvent event) {
ModelLoader.setCustomModelResourceLocation(ALUMINIUM, 0, new ModelResourceLocation(new ResourceLocation
("aluminiummod", "aluminium"), "inventory"));
ModelLoader.setCustomModelResourceLocation(Item.getItemFromBlock(ALUMINIUM_BLOCK), 0, new
ModelResourceLocation(new ResourceLocation("aluminiummod", "aluminium_block"), "inventory"));
}
@Mod.EventHandler
public void init(FMLInitializationEvent event) {
HOLDER.register();
}
//アイテムを拾ったときのイベント。
@SubscribeEvent
public void onPickupItem(EntityItemPickupEvent event) {
this.aluminiumUnlockRecipes(event.getItem().getItem(), event.getEntityPlayer());
}
private void aluminiumUnlockRecipes(ItemStack stack, EntityPlayer player) {
if (FMLCommonHandler.instance().getSide().isClient()) {
Item item = stack.getItem();
int meta = stack.getMetadata();
ItemStack itemStack = new ItemStack(item, 1, meta);
//もしレシピを保持するリストに合致すれば
if (!AluminiumRecipeHolder.map.isEmpty() && AluminiumRecipeHolder.map.containsKey(itemStack)) {
List list = AluminiumRecipeHolder.map.get(itemStack);
//player.unlockRecipes(ResourceLocation[] locations)でレシピブックに追加する。
player.unlockRecipes(list.toArray(new ResourceLocation[list.size()]));
}
}
}
//コンテナを閉じたとき(チェストやプレイヤーインベントリなど)のイベント。
@SubscribeEvent
public void onCloseContainer(PlayerContainerEvent.Close event) {
for (ItemStack itemStack : event.getEntityPlayer().inventoryContainer.getInventory()) {
this.aluminiumUnlockRecipes(itemStack, event.getEntityPlayer());
}
}
}
アセット
{
//@MODアノテーションの引数 updateJSONにこれのリンクを渡す。
//MODのダウンロードページを設置する。
"homepage": "https://www.tntmodders.com/tutorial/",
//マインクラフトのバージョンごとにMODのバージョンとリリースログを記す。
"1.12.2": {
//バージョンの記法は基本数字で、1.2.34や3.34のように示す。
//もしα版などを示す場合は0.9.8-alpha.1のように示せば、forge側でどれが最新か判定する。
//ex.0.9.8-alpha.1 -> 0.9.8-alpha.2 -> 1.0
"1.1": "MOD更新通知のテストです。",
"1.0": "チュートリアルを公開しました。"
},
//最新のバージョンを示す。
//latestとrecommendedをマインクラフトのバージョンごとに記す。
"promos": {
"1.12.2-latest": "1.1",
"1.12.2-recommended": "1.1"
}
}
解説
AluminiumMod.java
@MODの引数に
updateJSON ="JSONを置いたURL"
を置く。
aluminiumVersionCheck.json
記入方法に関してはソースのとおりである。
もしリリースログの部分を改行したいのであれば下のようなコードになる。
"1.1": "MOD更新通知のテストです。\n改行するとこうなります。"
また、バージョン名の記法は以下のような法則に従うと良い。
- 0.で始まるバージョンは開発版である。
- 公開時は1.0若しくは1.0.0であると良い。
- 大きい桁にはメジャーリリース、小さい桁にはそのメジャーリリースの中のマイナーリリースを入れる。
ex. 1.0 → 1.1 → 2.0
- もし必要であれば三桁目にパッチリリースを加える。
ex. 1.0.0 → 1.0.1 → 1.1.0 → 2.0.0
- それ以上の情報を追加する場合、例えばα版やforgeのようにビルドナンバーを示す場合はハイフンの後ろに示す。
基本作るのはシステムMODではないと思うので、ビルドナンバーはおすすめ出来ない。
αなどは以下の順番で示せる。
alpha → alpha.<数字> → alpha.beta → beta → beta.<数字> → rc → 無印
ex. 1.0.0-alpha → 1.0.0-alpha.1 → 1.0.0-alpha.beta → 1.0.0-beta → 1.0.0-beta.2 → 1.0.0-beta.11 → 1.0.0-rc.1 → 1.0.0
GitHubのJSONを読み込む
ForgeはJSONファイルをGitHub若しくは自分のサーバーに置くことを推奨している。
今回は、GitHubにファイルをプッシュした後設定するまでを記載する。
- プッシュしたファイルをGitHub上で確認する。
- "Raw" より生データを開き、リンクを取得し、先述の引数に渡す。
- @MODに渡しているバージョンをJSONに記載したバージョンの中で古いもの(画像では1.0がよい)にして、起動しチェックする。
- 成功していれば以下の画像のようになる。
参考文献 : https://mcforge.readthedocs.io/en/latest/gettingstarted/autoupdate/#update-json-format
(英語のページです)
このページの閲覧数: 845