package dmillerw.menu.network.packet;
import io.netty.buffer.ByteBuf;
import net.minecraft.client.Minecraft;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.network.PacketBuffer;
import net.minecraftforge.fml.common.network.simpleimpl.IMessage;
import net.minecraftforge.fml.common.network.simpleimpl.IMessageHandler;
import net.minecraftforge.fml.common.network.simpleimpl.MessageContext;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
import java.io.IOException;
public abstract class Packet <REQ extends Packet<REQ>> implements IMessage, IMessageHandler<REQ, REQ> {
@Override
public REQ onMessage(REQ message, MessageContext ctx) {
if (ctx.side == Side.SERVER) {
runServer(message, ctx.getServerHandler().playerEntity);
} else {
runClient(message, getPlayerClient());
}
return null;
}
@SideOnly(Side.CLIENT)
private void runClient(final REQ packet, final EntityPlayer player) {
Minecraft.getMinecraft().addScheduledTask(new Runnable() {
@Override
public void run() {
packet.handleClientSide(player);
}
});
}
private void runServer(final REQ packet, final EntityPlayer player) {
player.getServer().addScheduledTask(new Runnable() {
@Override
public void run() {
packet.handleServerSide(player);
}
});
}
@SideOnly(Side.CLIENT)
protected EntityPlayer getPlayerClient() {
return Minecraft.getMinecraft().player;
}
@Override
public void fromBytes(ByteBuf buf) {
try {
fromBytes(new PacketBuffer(buf));
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void toBytes(ByteBuf buf) {
toBytes(new PacketBuffer(buf));
}
@SideOnly(Side.CLIENT)
protected abstract void handleClientSide(EntityPlayer player);
protected abstract void handleServerSide(EntityPlayer player);
protected abstract void toBytes(PacketBuffer buffer);
protected abstract void fromBytes(PacketBuffer buffer) throws IOException;
}