Jump to content
  • Home
  • Files
  • Docs
Topics
  • All Content

  • This Topic
  • This Forum

  • Advanced Search
  • Existing user? Sign In  

    Sign In



    • Not recommended on shared computers


    • Forgot your password?

  • Sign Up
  • All Activity
  • Home
  • Mod Developer Central
  • Modder Support
  • Server->Client packets aren't working [1.16.3]
Currently Supported: 1.16.X (Latest) and 1.15.X (LTS)
Sign in to follow this  
Followers 0
Turtledove

Server->Client packets aren't working [1.16.3]

By Turtledove, January 21 in Modder Support

  • Reply to this topic
  • Start new topic

Recommended Posts

Turtledove    4

Turtledove

Turtledove    4

  • Creeper Killer
  • Turtledove
  • Members
  • 4
  • 135 posts
Posted January 21 (edited)

The following is my packet registry. The Client->Server packets work just fine, it's just the Server->Client ones where the context sender is null. so I'm certain I'm just missing something stupid:

 

public final class PacketRegistry
{
        /**
         * The ID for the next packet registration.
         */
        private static final String PROTOCOL_VERSION = Integer.toString(1);

        private byte nextPacketID = 0;
        /**
         * The internal network wrapper.
         */
        private static final SimpleChannel wrapper = NetworkRegistry.ChannelBuilder
                .named(new ResourceLocation(Withernauts.MODID, "main_channel"))
                .clientAcceptedVersions(PROTOCOL_VERSION::equals)
                .serverAcceptedVersions(PROTOCOL_VERSION::equals)
                .networkProtocolVersion(() -> PROTOCOL_VERSION)
                .simpleChannel();

        public void registerPackets()
        {
            //register packets going to the client
            registerServerToClient(MotionPlayerPacket.class,  MotionPlayerPacket::encode, MotionPlayerPacket::decode, MotionPlayerPacket::handle);
            registerServerToClient(PlayerLoadingPacket.class,  PlayerLoadingPacket::encode, PlayerLoadingPacket::decode, PlayerLoadingPacket::handle);
            //register packets going to the server
            registerClientToServer(CrouchSyncPacket.class, CrouchSyncPacket::encode, CrouchSyncPacket::decode, CrouchSyncPacket::handle);
            registerClientToServer(RunSyncPacket.class, RunSyncPacket::encode, RunSyncPacket::decode, RunSyncPacket::handle);
            registerClientToServer(AttackSyncPacket.class, AttackSyncPacket::encode, AttackSyncPacket::decode, AttackSyncPacket::handle);
            registerClientToServer(CombatActionPacket.class, CombatActionPacket::encode, CombatActionPacket::decode, CombatActionPacket::handle);
            registerClientToServer(ManaSyncPacket.class, ManaSyncPacket::encode, ManaSyncPacket::decode, ManaSyncPacket::handle);
            registerClientToServer(StaminaSyncPacket.class, StaminaSyncPacket::encode, StaminaSyncPacket::decode, StaminaSyncPacket::handle);
        }

        @SuppressWarnings({"unchecked", "rawtypes"})
        protected <MESSAGE> void registerServerToClient(Class<MESSAGE> type, BiConsumer<MESSAGE, PacketBuffer> encoder, Function<PacketBuffer, MESSAGE> decoder,
                                                    BiConsumer<MESSAGE, Supplier<NetworkEvent.Context>> consumer)
        {
            this.wrapper.registerMessage(nextPacketID++, type, encoder, decoder, consumer, Optional.of(NetworkDirection.PLAY_TO_CLIENT));
        }
        @SuppressWarnings({"unchecked", "rawtypes"})
        protected <MESSAGE> void registerClientToServer(Class<MESSAGE> type, BiConsumer<MESSAGE, PacketBuffer> encoder, Function<PacketBuffer, MESSAGE> decoder,
                                                    BiConsumer<MESSAGE, Supplier<NetworkEvent.Context>> consumer)
        {
            this.wrapper.registerMessage(nextPacketID++, type, encoder, decoder, consumer, Optional.of(NetworkDirection.PLAY_TO_SERVER));
        }

        /**
         * Sends the given packet to every client.
         *
         * @param message the packet to send.
         */
        public<MESSAGE> void sendToAll(MESSAGE message) {
            this.wrapper.send(PacketDistributor.ALL.noArg(), message);
        }

        /**
         * Sends the given packet to the given player.
         *
         * @param message the packet to send.
         * @param player  the player to send the packet to.
         */
        public<MESSAGE> void sendTo(MESSAGE message, ServerPlayerEntity player)
        {
            if (player.connection != null)
                this.wrapper.sendTo(message, player.connection.getNetworkManager(), NetworkDirection.PLAY_TO_CLIENT);
        }

        /**
         * Sends the given packet to all players around the given target point.
         *
         * @param message the packet to send.
         * @param point   the target point.
         */
        public<MESSAGE> void sendToAllAround(MESSAGE message, PacketDistributor.TargetPoint point)
        {
            this.wrapper.send(PacketDistributor.NEAR.with(()->point), message);
        }
        /**
         * Sends the given packet to the server.
         *
         * @param message the packet to send.
         */
        public<MESSAGE> void sendToServer(MESSAGE message)
        {
            this.wrapper.sendToServer(message);
        }

        public<MESSAGE> void sendToAllTracking(MESSAGE message, Entity entity) {
            this.wrapper.send(PacketDistributor.TRACKING_ENTITY.with(() -> entity), message);
        }
}

 

This class is called in the FMLCommonSetupEvent event hook within my main file.

 

This is a Server->Client packet that isn't working:

 

public class PlayerLoadingPacket
{
    private final int currentMana, maxMana, currentStamina, maxStamina;
    private final boolean staminaPunish;
    public PlayerLoadingPacket(int cMana, int mMana, int cStamina, int mStamina, boolean sPunish)
    {
        currentMana = cMana;
        maxMana = mMana;
        currentStamina = cStamina;
        maxStamina = mStamina;
        staminaPunish = sPunish;
    }
    public static void encode(PlayerLoadingPacket pkt, PacketBuffer buf)
    {
        buf.writeInt(pkt.currentMana);
        buf.writeInt(pkt.maxMana);
        buf.writeInt(pkt.currentStamina);
        buf.writeInt(pkt.maxStamina);
        buf.writeBoolean(pkt.staminaPunish);
    }
    public static PlayerLoadingPacket decode(PacketBuffer buf)
    {
        int cM = buf.readInt();
        int mM = buf.readInt();
        int cS = buf.readInt();
        int mS = buf.readInt();
        boolean sS = buf.readBoolean();

        return new PlayerLoadingPacket(cM, mM, cS, mS, sS);
    }
    public static void handle(PlayerLoadingPacket message, Supplier<NetworkEvent.Context> context)
    {
        NetworkEvent.Context ctx = context.get();
        ctx.enqueueWork(()->
                {
                    if (ctx.getSender()!= null)
                    {
                        EntityPlayer entityPlayer = new EntityPlayer(ctx.getSender());
                        entityPlayer.getPlayerCapability().setMana(message.currentMana);
                        entityPlayer.getPlayerCapability().setMaxMana(message.maxMana);
                        entityPlayer.getPlayerCapability().setStamina(message.currentStamina);
                        entityPlayer.getPlayerCapability().setMaxStamina(message.maxStamina);
                        entityPlayer.getPlayerCapability().setStaminaPunished(message.staminaPunish);
                        System.out.print("MANA: ");
                        System.out.print(entityPlayer.getPlayerCapability().getCurrentMana());
                        System.out.printf("%n");
                    }
                }
        );
        ctx.setPacketHandled(true);
    }
}

 

Edited January 21 by Turtledove
  • Quote

Share this post


Link to post
Share on other sites

Turtledove    4

Turtledove

Turtledove    4

  • Creeper Killer
  • Turtledove
  • Members
  • 4
  • 135 posts
Posted January 21

Solved it myself: when handle() is called it's (in the context of server->client) called on the logical client, ctx.getSender() is going to return null. So just use Minecraft.instance.player.

  • Quote

Share this post


Link to post
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.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  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.

    • Insert image from URL
×
  • Desktop
  • Tablet
  • Phone
Sign in to follow this  
Followers 0
Go To Topic Listing



  • Recently Browsing

    No registered users viewing this page.

  • Posts

    • Rakaldo
      Forge not showing in the lanucher

      By Rakaldo · Posted 1 minute ago

      I have downloaded forge but it still wont show up in the launcher https://prnt.sc/10c4blb (btw its 1.16.4)
    • GhostGamesFSM
      1.16 Ore generation.

      By GhostGamesFSM · Posted 15 minutes ago

      sorry for the txt, but thanks for the comment. I don't have a BiomeLoadingEvent, but I just have to see how I do that. When I have that I send you a message if that works.
    • HOTSAUCEMAN
      help with loading my world

      By HOTSAUCEMAN · Posted 16 minutes ago

      just ran it again to get more updated logs  debug-1.log.gz
    • HOTSAUCEMAN
      help with loading my world

      By HOTSAUCEMAN · Posted 20 minutes ago

      when loading into my world it says its loading, and then changes to a dirt background with no text; i've looked at multiple threads, forums and videos but i can't find any issue similar to mine (at least on a similar version)  debug-1.log.gz
    • Beethoven92
      [1.16.5] Beacon Overwrite (Screen Error)

      By Beethoven92 · Posted 27 minutes ago

      I apologize...i misread the part where you say that your custom beacon inventory actually opens fine! Yeah, the proximity check is doing its job, the problem seems to be that when pressing the confirm button you are sending a vanilla CUpdateBeaconPacket, then handled by the server, which will check if your open container is a BeaconContainer. It would be helpful to see the complete code you have, please post a link to your repository
  • Topics

    • GhostGamesFSM
      2
      1.16 Ore generation.

      By GhostGamesFSM
      Started 17 hours ago

    • HOTSAUCEMAN
      1
      help with loading my world

      By HOTSAUCEMAN
      Started 15 minutes ago

    • Nyko
      3
      [1.16.5] Beacon Overwrite (Screen Error)

      By Nyko
      Started Yesterday at 07:22 AM

    • samjviana
      5
      [1.16.5] How to make EnchantedBook go to Custom ItemGroup

      By samjviana
      Started Sunday at 10:00 PM

    • DrigglyEast
      0
      Fatally Missing Registry Entries

      By DrigglyEast
      Started 2 hours ago

  • Who's Online (See full list)

    • EdekaKuchen
    • alexro871
    • GhostGamesFSM
    • Beethoven92
    • IntentScarab
    • CookieLukas
    • Tavi007
    • HOTSAUCEMAN
    • zlappedx3
  • All Activity
  • Home
  • Mod Developer Central
  • Modder Support
  • Server->Client packets aren't working [1.16.3]
  • Theme

Copyright © 2019 ForgeDevelopment LLC · Ads by Longitude Ads LLC Powered by Invision Community