この記事は"Minecraft Forge Universal 13.19.0.xxx~"を前提MODとしています。 |
実績の追加
Achievement
「net.minecraft.stats.Achievement」は、「net.minecraft.stats.StatBase」のサブクラスで、実績の名称(例えば、「所持品の確認」)や実績ツリー(Minecraft Wiki/実績#インターフェース)内の位置などを格納するクラスです。
Forgeは、ある実績のまとまりを「ページ」として、SwingのCardLayoutのように切り替える機能を追加しています。この機能によって、例えばModごとに(あるいはModの主要な目標ごとに)新しいページを追加することで、一つのページのまとまりが失われるのを防ぐことができるでしょう。この「ページ」は、「net.minecraftforge.common.AchievementPage」を使って表現します。「AchievementPage」のコンストラクタの第一引数は、「AchievementPage」の名前です。バニラの「ページ」の名前は、「Minecraft」となっています。ローカライズ機能は用意されていないので、欲しい方は継承等で対応しましょう。
プレイヤーに実績を獲得させるときは、「net.minecraft.entity.player.EntityPlayer#addStat」を呼び出します。この第一引数はStatBase型を取り、「Achievement」を渡します。「EntityPlayer#addStat」には、第二引数としてint型の「amount」を取るものもありますが、これは「統計」の操作に関与します。「統計」は「Achievement」と同じく「StatBase」のサブクラスである「net.minecrfat.stats.StatBasic」で表現します。こちらも扱ってみたい方は、1.11の統計追加を参照するとよいでしょう。
前提条件などでバニラの実績を扱いたいときは、「net.minecraft.stats.AchievementList」にバニラのAchievementのstaticなインスタンスがあります。
落下実績の追加
プレイヤーが一定距離を落下した際に追加実績を得るようにするサンプルです。
15mの落下でHard Landing(難着陸)、30mの落下でHigh Flyer(高く飛ぶ者、野心家)を獲得します。
ソースコード
SampleMod.java
package samplemod; import net.minecraft.block.Block; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.Items; import net.minecraft.stats.Achievement; import net.minecraftforge.common.AchievementPage; import net.minecraftforge.event.entity.living.LivingFallEvent; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.common.event.FMLPreInitializationEvent; 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 Achievement achievement_fall_15m = new Achievement("achievement." + MOD_ID + ":fall_15m", MOD_ID + ".fall_15m", 0, 0, Items.FEATHER, null).registerStat(); public static final Achievement achievement_fall_30m = new Achievement("achievement." + MOD_ID + ":fall_30m", MOD_ID + ".fall_30m", 2, 0, Items.ELYTRA, achievement_fall_15m).registerStat(); public static final AchievementPage achievement_page_fall = new AchievementPage("Sample Mod", achievement_fall_15m, achievement_fall_30m ); @Mod.EventHandler public void preInit(FMLPreInitializationEvent event) { AchievementPage.registerAchievementPage(achievement_page_fall); } @Mod.EventBusSubscriber public static class Handler { @SubscribeEvent public static void onFall(LivingFallEvent event) { if (event.getEntity() instanceof EntityPlayer) { EntityPlayer player = (EntityPlayer) event.getEntity(); float d = event.getDistance(); if (15f <= d) { player.addStat(achievement_fall_15m); } if (30f <= d) { player.addStat(achievement_fall_30m); } } } } }
assets/samplemod/lang/en_US.lang
# Sample Mod Translation File [en_US] achievement.samplemod.fall_15m=Hard Landing achievement.samplemod.fall_15m.desc=Experience 15m Fall achievement.samplemod.fall_30m=High Flyer achievement.samplemod.fall_30m.desc=Experience 30m Fall