更新通知の追加

概要

Forge式記法のJSONファイルとGitHubを利用してMOD更新時の通知を追加する。

 

ソースコード

AluminiumMod.java

下の解説を読むだけでもだいたい分かる(はず)
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());
        }
    }
}

 

アセット

aluminiumVersionCheck.json

{
  //@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改行するとこうなります。"

 

また、バージョン名の記法は以下のような法則に従うと良い。

  1. 0.で始まるバージョンは開発版である。
  2. 公開時は1.0若しくは1.0.0であると良い。
  3. 大きい桁にはメジャーリリース、小さい桁にはそのメジャーリリースの中のマイナーリリースを入れる。
    ex. 1.0 → 1.1 → 2.0
  4. もし必要であれば三桁目にパッチリリースを加える。
    ex. 1.0.0 → 1.0.1 → 1.1.0 → 2.0.0
  5. それ以上の情報を追加する場合、例えばα版や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にファイルをプッシュした後設定するまでを記載する。

  1. プッシュしたファイルをGitHub上で確認する。notifaction_cap01
  2. "Raw" より生データを開き、リンクを取得し、先述の引数に渡す。
  3. @MODに渡しているバージョンをJSONに記載したバージョンの中で古いもの(画像では1.0がよい)にして、起動しチェックする。
  4. 成功していれば以下の画像のようになる。notifaction_cap02

 

参考文献 : https://mcforge.readthedocs.io/en/latest/gettingstarted/autoupdate/#update-json-format
(英語のページです)

 

コメントはこちらです。(スパム対策の為コメントは手動承認になっています。未承認のコメントは表示されないので連投はお控え下さい。)

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください