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.