package de.take_weiland.mods.commons.net; import cpw.mods.fml.relauncher.Side; import de.take_weiland.mods.commons.internal.FMLPacketHandlerImpl; import net.minecraft.entity.Entity; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.Container; import net.minecraft.network.packet.Packet; import net.minecraft.tileentity.TileEntity; import net.minecraft.world.World; import net.minecraft.world.chunk.Chunk; import java.io.IOException; /** * <p>An abstract base class for simpler Packet handling. Make a subclass of this for every type of Packet you have.</p> * <p>Register your packet classes with {@link de.take_weiland.mods.commons.net.Network#newChannel(String)}.</p> * <p>To send a packet, use the Methods implemented from {@link de.take_weiland.mods.commons.net.SimplePacket} like this: * <code><pre> * new ExamplePacket("whatever").sendToServer(); * new OtherPacket(someObject).sendToPlayer(somePlayer).sendToPlayer(otherPlayer); * </pre></code></p> * <p>Add the {@link de.take_weiland.mods.commons.net.PacketDirection} annotation to your packet class to specify a valid * direction this packet can be send.</p> */ public abstract class ModPacket implements SimplePacket { /** * <p>Write your packet data to the stream. A stream containing the same data will be passed to * {@link #read(MCDataInput, EntityPlayer, Side)} when the * packet is received.</p> * @param out the stream */ public abstract void write(MCDataOutput out); /** * <p>Read your packet data from the stream. The stream contains the data written in {@link #write(MCDataOutput)}.</p> * <p>On the server, the player is the player sending the packet, on the client it is the client player (receiving the packet).</p> * @param in the stream * @param player the context player * @param side the logical side receiving the packet * @throws IOException if an IOException occurs while reading the data * @throws ProtocolException if the data received violates the protocol */ public abstract void read(MCDataInput in, EntityPlayer player, Side side) throws IOException, ProtocolException; /** * <p>Execute this packet's action. This method is called when the packet is received, after the data has been read * with {@link #read(MCDataInput, EntityPlayer, Side)}.</p> * @param player the context player (see {@link #read(MCDataInput, EntityPlayer, Side)} * @param side the logical side receiving the packet * @throws ProtocolException if the data received violates the protocol */ public abstract void execute(EntityPlayer player, Side side) throws ProtocolException; /** * <p>An estimate of the size of this packet's data in bytes. Used to pre-size the byte buffer that this packet is * written to.</p> * @return an estimated size */ public int expectedSize() { return 32; } // private implementation private Packet mcPacket; private Packet build() { return mcPacket == null ? (mcPacket = FMLPacketHandlerImpl.makePacketForModPacket(this)) : mcPacket; } @Override public final SimplePacket sendTo(PacketTarget target) { target.send(build()); return this; } @Override public final SimplePacket sendToServer() { Packets.sendToServer(build()); return this; } @Override public final SimplePacket sendTo(EntityPlayer player) { Packets.sendTo(build(), player); return this; } @Override public final SimplePacket sendTo(Iterable<? extends EntityPlayer> players) { Packets.sendTo(build(), players); return this; } @Override public final SimplePacket sendToAll() { Packets.sendToAll(build()); return this; } @Override public final SimplePacket sendToAllIn(World world) { Packets.sendToAllIn(build(), world); return this; } @Override public final SimplePacket sendToAllNear(Entity entity, double radius) { Packets.sendToAllNear(build(), entity, radius); return this; } @Override public final SimplePacket sendToAllNear(TileEntity te, double radius) { Packets.sendToAllNear(build(), te, radius); return this; } @Override public final SimplePacket sendToAllNear(World world, double x, double y, double z, double radius) { Packets.sendToAllNear(build(), world, x, y, z, radius); return this; } @Override public final SimplePacket sendToAllTracking(Entity entity) { Packets.sendToAllTracking(build(), entity); return this; } @Override public final SimplePacket sendToAllAssociated(Entity entity) { Packets.sendToAllAssociated(build(), entity); return this; } @Override public final SimplePacket sendToAllTrackingChunk(World world, int chunkX, int chunkZ) { Packets.sendToAllTrackingChunk(build(), world, chunkX, chunkZ); return this; } @Override public final SimplePacket sendToAllTracking(Chunk chunk) { Packets.sendToAllTracking(build(), chunk); return this; } @Override public final SimplePacket sendToAllTracking(TileEntity te) { Packets.sendToAllTracking(build(), te); return this; } @Override public final SimplePacket sendToViewing(Container container) { Packets.sendToViewing(build(), container); return this; } }