Jump to content

Westlifers

Members
  • Posts

    2
  • Joined

  • Last visited

Westlifers's Achievements

Tree Puncher

Tree Puncher (2/8)

0

Reputation

  1. 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".
  2. 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.
×
×
  • Create New...

Important Information

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