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

    • 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"
    • Today I tried downloading 1.16.5 forge (the recommended version) and when installing I selected "download client". At the end just before appeared "These libraries failed to download. Try again." and at the bottom there were "org.apache.logging.log4j:log4j-api:2.15.0 ; org.apache.logging.log4j:log4j-core:2.15.0 and org.apache.logging.log4j:log4j-slf4j18-impl2.15.0" I tried the newest version and the same thing appeared
    • I think the problem is the server doesn't have enough ram, but I need to be sure before buying more. The modpack I use is Craft of exile 2 and the server has 4gb ram. When I try to turn it on I get a bunch of warns and at the end it just says "[Multicraft] Skipped 564 lines due to rate limit (160/s)" Is there a way to increase the rate limit? One time it did start, but without half of the mods. The modpack works perfectly fine on my computer even if I have the launch ram limit to 4gb.
    • Nevermind, RedstoneWireBlock.java had what I needed. Surprised I didn't try looking there until now.
    • I tried to open my Minecraft world normally and got the error "Errors in currently selected data pacts prevented the world from loading." Trying to start in safe mode gives the error "This world contains invalid or corrupted save data." My recent log is too large to make a Pastebin link. Any help would be much appreciated. 
  • Topics

×
×
  • Create New...

Important Information

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