I found a very stupid way to save my (Screen) data for each block instead of using (ContainerScreen)
public class Mp3Gui extends Screen {
...
public class BlockMp3 extends BlockBase {
@Override
public ActionResultType onBlockActivated(BlockState state, World worldIn, BlockPos pos, PlayerEntity player, Hand handIn, BlockRayTraceResult hit) {
if (!worldIn.isRemote){
Mp3TileEntity t = (Mp3TileEntity) worldIn.getTileEntity(pos);
System.out.println("server send Gui packet");
MySimpleNetworkHandler.INSTANCE.send(PacketDistributor.PLAYER.with(() -> (ServerPlayerEntity)player), new GuiDataPacket(my gui data);
return ActionResultType.SUCCESS;
} else {
f(worldIn,pos);
}
return ActionResultType.SUCCESS;
}
//Use this to cheat the inspection
@OnlyIn(Dist.CLIENT)
private static void f(World worldIn, BlockPos pos){
System.out.println("client open gui");
Mp3Gui mp3Gui = new Mp3Gui((Mp3TileEntity) worldIn.getTileEntity(pos));
Minecraft.getInstance().displayGuiScreen(mp3Gui);
}
and in dataPacket
public class GuiDataPacket {
public static void handle(GuiDataPacket msg, Supplier<NetworkEvent.Context> ctx) {
ctx.get().enqueueWork(() -> {
World world;
try {
//clint to server
ServerPlayerEntity sender = ctx.get().getSender();
//at client it will produce null pointer exception
world = sender.world;
} catch (NullPointerException e){
//server to client
world = getClientWorld();
}
if (!world.isRemote) {
System.out.println("server receive gui packet");
if (world.getTileEntity(msg.blockPos) instanceof Mp3TileEntity) {
Mp3TileEntity mp3TileEntity = ((Mp3TileEntity) world.getTileEntity(msg.blockPos));
set my tile entity
}
}
if (world.isRemote){
System.out.println("client receive gui packet");
if (world.getTileEntity(msg.blockPos) instanceof Mp3TileEntity) {
Mp3TileEntity mp3TileEntity = ((Mp3TileEntity) world.getTileEntity(msg.blockPos));
set my tile entity
}
}
});
ctx.get().setPacketHandled(true);
}
//Use this to cheat the inspection
@OnlyIn(Dist.CLIENT)
private static World getClientWorld(){
return Minecraft.getInstance().world;
}
it does work.