この記事は"Minecraft Forge Universal 13.19.0.xxx~"を前提MODとしています。 |
統計の追加
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 = SampleModStat.MOD_ID, name = SampleModStat.MOD_NAME, version = SampleModStat.VERSION) public class SampleModStat { 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 |