Jump to content

Recommended Posts

Posted

Hi, I'm new to modding, and I'm trying to validate wether a string is in a list. However, the list is in ServerLevel's capability and I can't validata it directly on client.

Later I came up with this idea: whenever I need this list, I may send a packet from client to sever, and inside the handler I send another packet to client, which synchronize the list to client. (I came up with this while watching this vedio: 

 

The problem is: packet from client to server works perfectly(I've done this several times before so I got some experience) BUT packet from server to client doesn't work. 

Packet from client to server: 

public class RequestSyncLevelDataS2CPacket {

    public RequestSyncLevelDataS2CPacket() {

    }

    public RequestSyncLevelDataS2CPacket(FriendlyByteBuf buf) {

    }

    public void toBytes(FriendlyByteBuf buf) {

    }

    public void handle(Supplier<NetworkEvent.Context> ctx) {
        ctx.get().enqueueWork(() -> {
            System.out.println("sent");
            ModMessages.sendToPlayer(new SyncLevelDataS2CPacket(), ctx.get().getSender());
        });
    }
}

Packet from server to client:

public class SyncLevelDataS2CPacket {

    public SyncLevelDataS2CPacket() {

    }

    public SyncLevelDataS2CPacket(FriendlyByteBuf buf) {

    }

    public void toBytes(FriendlyByteBuf buf) {

    }

    public boolean handle(Supplier<NetworkEvent.Context> ctx) {
        ctx.get().enqueueWork(() -> {
            ServerLevel level = ctx.get().getSender().getLevel();
            System.out.println("hiiiiiiiiiii");
            level.getCapability(LevelCapabilityProvider.LEVEL_CAPABILITY).ifPresent(cap -> {
                System.out.println("set");
                ClientLevelData.setMap(cap.getClassMap());
            });
        });
        ctx.get().setPacketHandled(true);
        return true;
    }
}

AND below is my ClientLevelData, where I store the map(this map has the list I want)

public class ClientLevelData {
    private static Map<String, List<String>> map;

    public static void setMap(Map<String, List<String>> map) {
        ClientLevelData.map = map;
    }

    public static Map<String, List<String>> getMap() {
        return map;
    }
}

I do registered these packets like this:

net.messageBuilder(SyncLevelDataS2CPacket.class, id(), NetworkDirection.PLAY_TO_CLIENT)
                .decoder(SyncLevelDataS2CPacket::new)
                .encoder(SyncLevelDataS2CPacket::toBytes)
                .consumerMainThread(SyncLevelDataS2CPacket::handle)
                .add();

net.messageBuilder(RequestSyncLevelDataS2CPacket.class, id(), NetworkDirection.PLAY_TO_SERVER)
                .decoder(RequestSyncLevelDataS2CPacket::new)
                .encoder(RequestSyncLevelDataS2CPacket::toBytes)
                .consumerMainThread(RequestSyncLevelDataS2CPacket::handle)
                .add();

other packets all work perfectly. and I tried not using RequestSyncLevelDataS2CPacket, and found that whatever way of sending SyncLevelDataS2CPacket will fail. I get no print from it. I'm really confused.

Posted

ADD:

I found that this packet is actually sent but ctx.get().enqueueWork didn't work. The program stucks there: 
 

    public boolean handle(Supplier<NetworkEvent.Context> ctx) {
        System.out.println("h232323");
        ctx.get().enqueueWork(() -> {
            ServerLevel level = Objects.requireNonNull(ctx.get().getSender()).getLevel();
            System.out.println("hiiiiiiiiiii");
            level.getCapability(LevelCapabilityProvider.LEVEL_CAPABILITY).ifPresent(cap -> {
                System.out.println("set");
                ClientLevelData.setMap(cap.getClassMap());
            });
        });
        System.out.println("11111");
        ctx.get().setPacketHandled(true);
        return true;
    }

will only print "h232323". 

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



×
×
  • Create New...

Important Information

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