Jump to content

How do I trigger achievements?


Hisha

Recommended Posts

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 by Hisha
Link to comment
Share on other sites

@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).

  • Like 1

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.

Link to comment
Share on other sites

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 :P

 

Where do I find the pack.mcmeta file if I have it? Or where should I make it?

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

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.

Guest
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Announcements



  • Recently Browsing

    • No registered users viewing this page.
  • Posts

    • I had been using a mobile wallet to store around $200,000 worth of Bitcoin, and everything was going smoothly until my phone was stolen. At first, I wasn’t too worried. I thought I had written down the backup phrase somewhere safe, so I figured I could easily recover my funds. But after tearing my home apart, checking every drawer, notebook, and folder I could think of, I came to a horrible realization—I hadn’t been as careful as I thought. The backup phrase was nowhere to be found. Panic started to set in. Losing access to that much Bitcoin was like watching years of hard work and financial progress vanish right before my eyes. It wasn’t just about the money; it felt like my future had been snatched away in an instant. I couldn’t believe I had been so careless. It was a nightmare that I wouldn’t wish on anyone. Desperate to find a solution, I started searching online for recovery options. That’s when I came across Cyber Constable Intelligence, recommended by someone in a cryptocurrency forum. At first, I was hesitant—there are so many scams in the crypto space, and the last thing I wanted was to get ripped off while trying to recover my funds. But the positive reviews gave me a glimmer of hope, so I decided to reach out. From the moment I contacted Cyber Constable Intelligence on Email at support (AT) cyberconstableintelligence.com, they made me feel understood and reassured. They didn’t make me feel stupid for my mistake, which was something I really appreciated. They explained the recovery process clearly and thoroughly, and they reassured me that they had successfully handled cases like mine before. Even though I was still anxious—after all, this was $200,000 on the line—I felt like I was in good hands. The next few days were tense, but then I received the news I had been praying for: Cyber Constable Intelligence had managed to recover my Bitcoin. I honestly didn’t believe it until I logged in and saw my balance restored. It was like a second chance at life. The relief was overwhelming. If you’ve lost access to your wallet, no matter how hopeless the situation may seem, I can’t recommend Cyber Constable Intelligence enough. They turned my nightmare into a success story, and I’m forever grateful for their expertise and professionalism. Here's Their info below What Sapp Info: 1. (2. 5.  2.  ) 3.  7.  8.  (7. 6. 1. 1.) Website Info : www. cyber constable intelligence   com
    • So I'm creating yet another minecraft modpack and stumbled upon error I've never encoutered.. I tried to troubleshoot it myself and it always worked but this time I didn't manage.. Here is minecraft crash report: https://pastebin.com/EVqzdDKg I can't find how or from where to post debug.log  I'm sorry, can someone help me? (as a disclaimer - i've tried already reinstalling minecraft and java)
    • It works without mods, I've ran it through the launcher by itself and runs perfectly fine, when I open it through Forge I can get through to the launcher but when I go to open the world it loads then gives me the error code 1. Is there anymore info that could help diagnose it?
    • Also had the issue. GLAD TO TELL YOU I HAVE THE FIX! Create: Applied Kinetic literally says "Replace all inscriber recipes with Create's sequenced assembly recipe". When I turned off this mod it worked fine. I also didn't use that mod of the pack i played so it didn't matter for me.
    • Right now im trying to make an own mod for minecraft for the version 1.16.5 with forge but whatever i do it still doesnt fix the error this is my build.gradle : buildscript { repositories { maven { url = "https://maven.minecraftforge.net" } mavenCentral() } dependencies { classpath 'net.minecraftforge.gradle:ForgeGradle:5.1.+' } } apply plugin: 'net.minecraftforge.gradle' apply plugin: 'java' group = 'com.example' // Modify to your package name version = '1.0' archivesBaseName = 'flippermod' java { toolchain { languageVersion = JavaLanguageVersion.of(8) } } minecraft { version = "1.16.5-36.2.42" // Ensure this matches your Forge version mappings channel: 'official', version: '1.16.5' runs { client { workingDirectory project.file('run') property 'forge.logging.markers', 'SCAN,REGISTRIES,REGISTRYDUMP' property 'forge.logging.console.level', 'debug' mods { flipper_mod { sourceSets.main.output } } } } } repositories { maven { url = "https://maven.minecraftforge.net/" } mavenCentral() } dependencies { minecraft "net.minecraftforge:forge:1.16.5-36.2.42" } and this one is my settings.gradle:  pluginManagement { repositories { gradlePluginPortal() maven { name = 'MinecraftForge' url = 'https://maven.minecraftforge.net/' } } } plugins { id 'org.gradle.toolchains.foojay-resolver-convention' version '0.7.0' } rootProject.name = 'flippermod' this one is the mods.tml    modLoader="javafml" loaderVersion="[36,)" modId="flippermod" version="1.0.0" displayName="Flippermod" and the last one is the gradle-wrapper.properties distributionUrl=https\://services.gradle.org/distributions/gradle-7.6-bin.zip dc :"code_slivki"
  • Topics

×
×
  • Create New...

Important Information

By using this site, you agree to our Terms of Use.