Jump to content

Recommended Posts

Posted
Posted

I changed to use the ByteBufUtils, but since the NBT code is actually never called — the offending packet only uses int data — the stream should never be opened for the NBT read/write, meaning it isn't the cause of the leak.

Posted

Hi

 

When I got this error message, it was because I was sending packets from the client but I hadn't registered a corresponding handler for that packet type on the server.  So the packets weren't being delivered.

 

The way I figured that out was to put a breakpoint in the forge code and look at what the 'this' packet was.

FMLProxyPacket::
processPacket()
                if (internalChannel.writeInbound(this))
                {
                    badPackets.add(this.channel);                                                // BREAKPOINT HERE, AND INSPECT this
                    if (badPackets.size() % packetCountWarning == 0)
                    {
                        FMLLog.severe("Detected ongoing potential memory leak. %d packets have leaked. Top offenders", badPackets.size());
                        int i = 0;
                        for (Entry<String> s  : Multisets.copyHighestCountFirst(badPackets).entrySet())

 

-TGG

Posted

Yeah, I would have thought so.

 

Except - now that I look more closely, perhaps it's not

 

<MessageIronNote.class, MessageIronNote.class> from INSTANCE.registerMessage(MessageIronNote.class, MessageIronNote.class, id++, Side.SERVER);

 

might not be the same as

 

<MessageIronNote, IMessage> from MessageIronNote extends MessageGeneric implements IMessageHandler<MessageIronNote, IMessage>

 

The templates on SimpleNetworkWrapper  caused me serious head damage for a while, still not 100% sure I understand how it works.  Maybe this is a similar problem.

 

-TGG

 

Posted

I don't know if a IMessage can be its own IMessageHandler (I think I saw a pull for this get rejected on github).

 

Rather than having your MessageIronNote class implement IMessageHandler directly, try having a static nested class implement it instead.

public final class MyMessage implements IMessage
{
    //IMessage code
    ...
    
    public static final class Handler implements IMessageHandler<MyMessage, IMessage>
    {
        //Handler code
        ...
    }
}

And registering like this:

INSTANCE.registerMessage(MyMessage.Handler.class, MyMessage.class, id++, Side.SERVER);

BEFORE ASKING FOR HELP READ THE EAQ!

 

I'll help if I can. Apologies if I do something obviously stupid. :D

 

If you don't know basic Java yet, go and follow these tutorials.

Posted

Okay I just discovered my problem and it was the Side.SERVER, it is being sent from the server so it should be Side.CLIENT. though I swear I was getting a crash I'm no longer getting when I used Side.CLIENT. Thank you all for your help! :)

 

  On 10/5/2014 at 7:58 AM, TheGreyGhost said:

Yeah, I would have thought so.

 

Except - now that I look more closely, perhaps it's not

 

<MessageIronNote.class, MessageIronNote.class> from INSTANCE.registerMessage(MessageIronNote.class, MessageIronNote.class, id++, Side.SERVER);

 

might not be the same as

 

<MessageIronNote, IMessage> from MessageIronNote extends MessageGeneric implements IMessageHandler<MessageIronNote, IMessage>

 

The templates on SimpleNetworkWrapper  caused me serious head damage for a while, still not 100% sure I understand how it works.  Maybe this is a similar problem.

 

-TGG

Yeah in the realm of Generics they're definitely the same, MessageIronNote extends MessageGeneric which implements IMessage, so that would be valid. But you do give a good point that I should make things look a little more consistent, thanks.

 

  Quote

I don't know if a IMessage can be its own IMessageHandler (I think I saw a pull for this get rejected on github).

 

Rather than having your MessageIronNote class implement IMessageHandler directly, try having a static nested class implement it instead.

public final class MyMessage implements IMessage
{
    //IMessage code
    ...
    
    public static final class Handler implements IMessageHandler<MyMessage, IMessage>
    {
        //Handler code
        ...
    }
}

And registering like this:

INSTANCE.registerMessage(MyMessage.Handler.class, MyMessage.class, id++, Side.SERVER);

Yeah I was suggested this change on IRC, while not actually a problem having them together, it might be worth splitting them for me, since I have developed MessageGeneric to be able to handle any packet I ever want to send.

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

    • Make a test with another Launcher like the Curseforge Launcher, MultiMC or AT Launcher
    • can anyone help me i am opening forge and add modpacks and then it says unable to update native luancher and i redownlaod java and the luancher it self?
    • The problem occurs also in 1.20.1 Forge, but with an "Error executing task on client" instead. I have "Sinytra Connector" installed. On 1.21.5 Fabric, there is no problem. When this happens, the chat message before the death screen appears gets sent, with an extra dash added.
    • Well, as usual, it was user error. Naming mismatch in sounds.json.  Please delete this post if you find it necessary. 
    • Hello Forge community.  I'm running into an issue with a mod I'm working on.  To preface, I can call /playsound modId:name music @a and I can hear the sound I registered being played in game. Great!  However, I cannot get it to trigger via my mod code.    Registration: public static final RegistryObject<SoundEvent> A_WORLD_OF_MADNESS = SOUND_EVENTS.register("a_world_of_madness", () -> new SoundEvent(new ResourceLocation("tetheredsouls", "a_world_of_madness")));   Playback: Minecraft mc = Minecraft.getInstance(); if (!(mc.player instanceof LocalPlayer) || mc.level == null) return; LocalPlayer player = (LocalPlayer) mc.player; BlockPos pos = player.blockPosition(); SoundEvent track = ModSounds.A_WORLD_OF_MADNESS.get(); System.out.println(track); System.out.println(pos); System.out.println(player); // play exactly like the tutorial: client-only, at the player's position try { mc.level.playLocalSound( player.getX(), player.getY(), player.getZ(), track, SoundSource.MUSIC, // Or MASTER if needed 1f, 1f, false ); System.out.println("[DEBUG] playSound success: " + track.getLocation()); } catch (Exception e) { System.err.println("[ERROR] Failed to play sound: " + track.getLocation()); e.printStackTrace(); } Sounds.json:   { "theme_of_laura": { "category": "music", "sounds": [ { "name": "tetheredsouls:a_world_of_madness", "stream": true } ] } } Things I have tried: - multiple .ogg files. Short .ogg files (5 seconds, <100KB).  - default minecraft sounds imported from import net.minecraft.sounds.SoundEvents; These work given my code. No idea why these are different.  - playSound() method, as well as several others in past iterations that did not work   I would be forever grateful if somebody could point me in the right direction. I've looked at several mod github repositories and found extremely similar code to what I'm doing. I've also found several threads in this forum that did not solve my issue. I just cannot figure out what I'm doing differently, and why I'm able to queue sounds manually with playsound but the code won't play it (despite confirming the code is being run with the debug statements.)
  • Topics

×
×
  • Create New...

Important Information

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