提供: Minecraft Modding Wiki
2017年3月28日 (火) 22:50時点におけるSwallow794 (トーク | 投稿記録)による版 (サンプルのクラス名修正)
(差分) ← 古い版 | 最新版 (差分) | 新しい版 → (差分)
移動先: 案内検索

この記事は"Minecraft Forge Universal 13.19.0.xxx~"を前提MODとしています。

Wood pickaxe.png
初心者向けのチュートリアルです。
C player.png
Playerに関係のあるチュートリアルです。


統計の追加[編集]

StatBasic[編集]

「net.minecraft.stats.StatBasic」は、「net.minecraft.stats.StatBase」のサブクラスで、統計の名称(例えば、「ゲームを終了した回数」)や表示書式(例えば、日を表す「d」や距離を表す「m」「cm」といった単位を付ける処理)を格納するクラスです。

StatBasicのコンストラクタは2種類あり、一方には表示書式のインターフェース「net.minecraft.stats.IStatType」のインスタンスを渡すことができます。もう一方では、整数を扱うデフォルトの表示書式「StatBase#simpleStatType」が使用されます。

StatBasicのコンストラクタの第一引数には、統計を特定する固有のIDをString型で渡します。第二引数には、インターフェース「net.minecraft.util.text.ITextComponent」を実装したクラスのインスタンスを渡します。ここには「net.minecraft.util.text.TextComponentTranslation」を使うことで、ローカライズしたテキストを表示できるでしょう。

Modで追加するStatBasicのインスタンスは、「StatBasic#registerStat」を呼び出すことでゲーム内に統計として追加することができます。バニラの統計を扱うときは、「net.minecraft.stats.StatList」にあるStatBasicのstaticなインスタンスを使用します。

統計の値を操作するときは、「net.minecraft.entity.player.EntityPlayer#addStat」を呼び出します。この関数の第一引数はStatBase型を取り、「StatBasic」を渡します。第二引数「amount」には、統計の値を操作する(増加させる)量を指定します。

player.addStat(STAT_SAMPLE); // player.addStat(STAT_SAMPLE, 1); が呼ばれる

player.addStat(STAT_SAMPLE_2, 10);

「EntityPlayer#addStat」は「実績」の獲得にも使用されます。「実績」は「StatBasic」と同じく「StatBase」のサブクラスである「net.minecraft.stats.Achievement」で表現します。こちらも扱ってみたい方は、1.11の実績追加を参照するとよいでしょう。

統計の操作は、一度ワールドに入り直さないと反映されないかもしれません(バニラの仕様かバグ?)。

メソッド名 操作
initIndependentStat 不明。サーバーから「独立した」統計として設定するという意味?

isIndependentがtrueになり、「net.minecraft.client.entity.EntityPlayerSP#addStat」を呼び出したとき、スーパークラスの「#addStat」呼び出しをスキップしなくなるが、「EntityPlayerSP」のスーパークラス「net.minecraft.client.entity.AbstractClientPlayer」では再実装されておらず、その上の「EntityPlayer」では空実装になっているので、未実装要素で意味はないと思われる。

registerStat インスタンスを統計としてゲームに登録する。

弓矢で自分を攻撃した統計の追加[編集]

弓矢を使って自分で自分を攻撃するたびに1ずつ増える統計を追加します。

SampleMod.java

package samplemod;

import net.minecraft.entity.Entity;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.stats.StatBasic;
import net.minecraft.util.DamageSource;
import net.minecraft.util.EntityDamageSourceIndirect;
import net.minecraft.util.text.TextComponentTranslation;
import net.minecraftforge.event.entity.living.LivingHurtEvent;
import net.minecraftforge.fml.common.Mod;
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;

@Mod(modid = SampleMod.MOD_ID, name = SampleMod.MOD_NAME, version = SampleMod.VERSION)
public class SampleMod {
    public static final String MOD_ID = "samplemod";
    public static final String MOD_NAME = "Sample Mod";
    public static final String VERSION = "0.1.0";


    public static final StatBasic stat_self_injury_with_arrow = (StatBasic) new StatBasic(
            "stat." + MOD_ID + ".self_injury_with_arrow",
            new TextComponentTranslation("stat." + MOD_ID + ".self_injury_with_arrow")
    ).registerStat();

    @Mod.EventBusSubscriber
    public static class Handler {
        @SubscribeEvent
        public static void onHurt(LivingHurtEvent event) {
            DamageSource source = event.getSource();

            if (source instanceof EntityDamageSourceIndirect) {
                EntityDamageSourceIndirect indirect = (EntityDamageSourceIndirect) source;
                Entity hurtEntity = event.getEntity();
                Entity indirectEntity = indirect.getEntity();

                if (hurtEntity == indirectEntity && hurtEntity instanceof EntityPlayer) {
                    EntityPlayer player = (EntityPlayer) hurtEntity;

                    player.addStat(stat_self_injury_with_arrow, 1); // player.addStat(stat_self_injury_with_arrow); でも同じ
                }

            }

        }
    }

}


バニラの統計[編集]

統計追加の参考用に、バニラの統計リストを引用します。これは、1.11.2時点のものです。

General[編集]

英語名 日本語名 対応フィールド
Games Quit ゲームを終了した回数
Times Played ゲームプレイ時間
Since Last Death 最後に死亡してからの経過時間
Sneak Time スニークした時間
Distance Walked 歩いた距離
Distance Crouched スニークした距離
Distance Sprinted ダッシュした距離
Distance Swum 泳いだ距離
Distance Fallen 落下した距離
Distance Climbed 登った距離
Distance Flown 空中を移動した距離
Distance Dove 水中歩行した距離
Distance by Minecart トロッコで移動した距離
Distance by Boat ボートで移動した距離
Distance by Pig ブタで移動した距離
Distance by Horse 馬で移動した距離
Distance by Elytra エリトラで飛行した距離
Jumps ジャンプした回数
Items Dropped アイテムを落とした回数
Damage Dealt 与えたダメージ
Damage Taken 受けたダメージ
Number of Deaths 死亡回数
Mob Kills Mobを倒した回数
Animals Bred 動物を繁殖させた回数
Player Kills プレイヤーを倒した回数
Fish Caught 魚を釣った回数
Talked to Villagers 村人と会話した回数
Traded with Villagers 村人と取引した回数
Cake Slices Eaten ケーキの一切れを食べた回数
Cauldrons Filled 大釜を水で満たした回数
Water Taken from Cauldron 大釜から水を取った回数
Armor Pieces Cleaned 防具を脱色した回数
Banners Cleaned 旗を脱色した回数
Interactions with Brewing Stand 醸造台を使った回数
Interactions with Beacon ビーコンを使った回数
Droppers Searched ドロッパーの中身を見た回数
Hoppers Searched ホッパーの中身を見た回数
Dispensers Searched ディスペンサーの中身を見た回数
Note Blocks Played 音符ブロックを鳴らした回数
Note Blocks Tuned 音符ブロックの音階を変えた回数
Plants Potted 植物を植木鉢に植えた回数
Trapped Chests Triggered トラップチェストを反応させた回数
Ender Chests Opened エンダーチェストを開いた回数
Items Enchanted アイテムをエンチャントした回数
Records Played レコードを再生した回数
Interactions with Furnace かまどを使用した回数
Interactions with Crafting Table 作業台を使用した回数
Chests Opened チェストを開いた回数
Times Slept in a Bed ベッドで寝た回数
Shulker Boxes Opened シュルカーボックスを開いた回数

ゲーム内の「統計」に表示されない項目

英語名 対応フィールド
Minutes Played
Worlds Created
Saves Loaded
Multiplayer Joins
Dropped
Picked Up
Treasure Fished
Junk Fished