Posted May 5, 20178 yr Hello, I have been trying to get achievements to work but I just can't seem to get them to trigger. I have registered them and they are showing up in the achievement page I have created and registered, so my suspicion is that the problem lies in my event handler. My event handler class looks like this: public class AchievementEventHandler { @Mod.EventHandler public void onEditorOpened(AchievementEvent.EditorOpenedEvent event) { event.player.addStat(CompilerMod.achievementOpenEditor, 1); } @Mod.EventHandler public void onEditorSaved(AchievementEvent.EditorSavedEvent event) { event.player.addStat(CompilerMod.achievementSaveFirst, 1); //If compiler errors event.player.addStat(CompilerMod.achievementError, 1); } @Mod.EventHandler public void onRobotChat(AchievementEvent.RobotChatEvent event) { event.player.addStat(CompilerMod.achievementRobotChat, 1); } @Mod.EventHandler public void onRobotBroadcast(AchievementEvent.RobotBroadcastEvent event) { event.player.addStat(CompilerMod.achievementBroadcastMessage, 1); //If channel has listeners event.player.addStat(CompilerMod.achievementCoodination, 1); } @Mod.EventHandler public void onRobotAction(AchievementEvent.RobotActionEvent event) { if(event.robotAction.equals("explode")) event.player.addStat(CompilerMod.achievementRobotExplode, 1); if(event.robotAction.equals("attack")) event.player.addStat(CompilerMod.achievementRobotAttackOther, 1); } @Mod.EventHandler public void onRobotPlaceBlock(AchievementEvent.RobotPlaceBlockEvent event) { //Check how blocks are placed event.player.addStat(CompilerMod.achievementBuildHouse, 1); } } And the events are set up as follows: public class AchievementEvent extends Event { public final EntityPlayer player; private AchievementEvent(EntityPlayer player){ this.player = player; } public static class EditorOpenedEvent extends AchievementEvent { public EditorOpenedEvent(EntityPlayer player) { super(player); } } public static class EditorSavedEvent extends AchievementEvent { public EditorSavedEvent(EntityPlayer player) { super(player); } } public static class RobotChatEvent extends AchievementEvent { public String chatMessage; public RobotChatEvent(EntityPlayer owner, String chatMessage) { super(owner); this.chatMessage = chatMessage; } } public static class RobotBroadcastEvent extends AchievementEvent { public String message; public String channel; public RobotBroadcastEvent(EntityPlayer owner, String message, String channel) { super(owner); this.message = message; this.channel = channel; } } public static class RobotActionEvent extends AchievementEvent { //This could be changed to an enum public String robotAction; public RobotActionEvent(EntityPlayer owner, String robotAction) { super(owner); this.robotAction = robotAction; } } public static class RobotPlaceBlockEvent extends AchievementEvent { //This could be changed to an enum public Block block; public RobotPlaceBlockEvent(EntityPlayer owner, Block block) { super(owner); this.block = block; } } } But when I attempt to raise an event, nothing happens. Here is an example of a trigger I tried to set up: public GuiProgramEditor() { super(); //TEMP ACHIEVEMENT TEST MinecraftForge.EVENT_BUS.post(new AchievementEvent.EditorOpenedEvent(Minecraft.getMinecraft().player)); } Which is located in a GUI constructor. And finally, the registrations @Mod.EventHandler public void init(FMLInitializationEvent event) { Proxy.registerModels(); achievementOpenEditor = new Achievement("", "Opened editor", 0, 0, Items.BOOK, null); achievementSaveFirst = new Achievement("", "Saved first script", 2, 0, Items.ITEM_FRAME, achievementOpenEditor); achievementRobotChat = new Achievement("", "First words", 2, 2, Items.GHAST_TEAR, achievementSaveFirst); achievementRobotExplode = new Achievement("", "Boom", 4,4, Items.TNT_MINECART, achievementSaveFirst).setSpecial(); achievementRobotAttackOther = new Achievement("", "Ouch", 2,4, Items.DIAMOND_SWORD, achievementSaveFirst); achievementBroadcastMessage = new Achievement("", "Robot phone home", 3, 0, Items.WRITABLE_BOOK, achievementSaveFirst); achievementCoodination = new Achievement("", "Hello? This is home", 3, 2, Items.WRITTEN_BOOK, achievementBroadcastMessage); achievementBuildHouse = new Achievement("", "Nice house", 4,4, Items.COMMAND_BLOCK_MINECART, achievementSaveFirst); achievementError = new Achievement("", "ERROR", 5,5, Items.BOOK, achievementSaveFirst).setSpecial(); educodeAchievementPage = new AchievementPage("EduCode", achievementOpenEditor, achievementSaveFirst, achievementRobotChat, achievementRobotExplode, achievementRobotAttackOther, achievementBroadcastMessage, achievementCoodination, achievementBuildHouse, achievementError); AchievementPage.registerAchievementPage(educodeAchievementPage); } Can someone point out to me what I am doing wrong? I have followed countless tutorials about the achievement system, but none of them seem to touch the subject of custom events. And as a last note, where do I need to put my en_US.lang file, because none of the directories I've tried yet has worked for me Thanks in advance EDIT: This is on Forge 13.20.0.2228 for Minecraft 1.11.2 Edited May 5, 20178 yr by Hisha
May 5, 20178 yr @Mod.EventHandler is only for FML lifecycle events (that extend net.minecraftforge.fml.common.event.FMLEvent) and only works in your @Mod class. @SubscribeEvent is for regular events (that extend net.minecraftforge.fml.common.eventhandler.Event) and works in any class that's been registered to the appropriate event bus. Events are explained in more detail here. EntityPlayer#addStat does nothing when called on a client player, you need to call it on a server player (from the logical server). If you call the one-argument overload of EntityPlayer#addStat, it will call the two-argument overload with a second argument of 1 (like you're doing now). 46 minutes ago, Hisha said: And as a last note, where do I need to put my en_US.lang file, because none of the directories I've tried yet has worked for me In your mod's pack.mcmeta file, is "pack_format" set to 3? If it is, Minecraft will only load resources with lowercase names, including lang files. Rename en_US.lang to en_us.lang. If it's set to 2 or not set at all (either because you don't have a pack.mcmeta file or because it doesn't contain a "pack" section), FML will use the LegacyV2Adapter IResourcePack wrapper for your mod's resources. This will still only load resources with lowercase names, except lang files. Lang files will only be loaded with the mixed case names used in earlier versions (e.g. en_US.lang). Please don't PM me to ask for help. Asking your question in a public thread preserves it for people who are having the same problem in the future.
May 5, 20178 yr Author Thank you very much, I got it to give me the achievements now.. Well. All of them at once for some reason, but I guess that's on my end Where do I find the pack.mcmeta file if I have it? Or where should I make it?
May 5, 20178 yr 37 minutes ago, Hisha said: Where do I find the pack.mcmeta file if I have it? Or where should I make it? It belongs in src/main/resources. It was only added to the MDK in Forge 1.11.2-13.20.0.2291 and you started with the MDK of Forge 1.11.2-13.20.0.2228 or earlier, so you won't have one unless you've created it. If you don't have one, download the latest MDK, copy it from there into your mod's workspace, edit the "description" property to say something like "<Your Mod> Resources" (this isn't actually displayed in-game for mod resource packs, but may be used by other mods or external tools) and delete the "_comment" property (this just explains the purpose of the file in the MDK). Please don't PM me to ask for help. Asking your question in a public thread preserves it for people who are having the same problem in the future.
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.