My mistake, I didn't properly read your post (it's late here!).
So yes, you have to use the packets with capabilities. This time, if I correctly read your post you don't know where you should recieve the packet.
I've never really done what you want to do, but I have some basics.
You need to follow this in the documation. The principle is to create a class that gathers everything you need for the network
A fast example :
public class Packet
{
private float temperature;
public Packet(int temperature_)
{
this.temperature = temperature_;
}
// "responsible for encoding the message"
public static void encode(Packet packet, PacketBuffer buffer)
{
buffer.writeInt(packet.temperature);
}
// "responsible for decoding the message"
public static Packet decode(PacketBuffer buffer)
{
int temperature = buffer.readInt();
Packet instance = new Packet(temperature);
return instance;
}
// What's INSTANCE ? Check Getting Started in the doc
public static void registerMessage()
{
INSTANCE.messageBuilder(Packet.class, 0)
.encoder(Packet::encode)
.decoder(Packet::decode)
.consumer(Packet::handle)
.add(); // "Registering Packets" section
}
// "responsible for handling the message"
public static void handle(Packet msg, Supplier<NetworkEvent.Context> ctx) {
ctx.get().enqueueWork(() -> {
// Work that needs to be threadsafe (most work)
EntityPlayerMP sender = ctx.get().getSender(); // the client that sent this packet
// do stuff
});
ctx.get().setPacketHandled(true);
}
}
}
There's probably some things missing, but this should help.
EDIT : Oh, I forgot! You need to call registerMessage() in the setup function of your mod.