package speedytools.common.network; import net.minecraft.util.ChatComponentText; import net.minecraft.util.IChatComponent; import net.minecraftforge.fml.common.network.ByteBufUtils; 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 io.netty.buffer.ByteBuf; import speedytools.SpeedyToolsMod; import speedytools.common.utilities.ErrorLog; /** * This class is used to inform the client and server of each other's status (primarily for cloning) */ public class Packet250CloneToolStatus extends Packet250Base { public static Packet250CloneToolStatus serverStatusChange(ServerStatus newStatus, byte newPercentage, IChatComponent newNameOfPlayerBeingServiced) { return new Packet250CloneToolStatus(ClientStatus.UNUSED, newStatus, newPercentage, newNameOfPlayerBeingServiced); } public static Packet250CloneToolStatus clientStatusChange(ClientStatus newStatus) { return new Packet250CloneToolStatus(newStatus, ServerStatus.UNUSED, (byte)100, new ChatComponentText("")); } private Packet250CloneToolStatus(ClientStatus newClientStatus, ServerStatus newServerStatus, byte newPercentage, IChatComponent newNameOfPlayerBeingServiced ) { super(); clientStatus = newClientStatus; serverStatus = newServerStatus; completionPercentage = newPercentage; nameOfPlayerBeingServiced = newNameOfPlayerBeingServiced; packetIsValid = true; } private static final byte NULL_BYTE_VALUE = Byte.MAX_VALUE; /** * Is this packet valid to be received and acted on by the given side? * @param whichSide * @return true if yes */ public boolean validForSide(Side whichSide) { checkInvariants(); return ( (clientStatus == ClientStatus.UNUSED && whichSide == Side.CLIENT) || (serverStatus == ServerStatus.UNUSED & whichSide == Side.SERVER) ); } public ServerStatus getServerStatus() { assert (serverStatus != null && serverStatus != ServerStatus.UNUSED); return serverStatus; } public ClientStatus getClientStatus() { assert (clientStatus != null && clientStatus != ClientStatus.UNUSED); return clientStatus; } public byte getCompletionPercentage() { assert (checkInvariants()); assert (serverStatus != null); return completionPercentage; } public IChatComponent getNameOfPlayerBeingServiced() { assert (serverStatus != null); return nameOfPlayerBeingServiced; } private boolean checkInvariants() { boolean valid; valid = (clientStatus == ClientStatus.UNUSED || serverStatus == ServerStatus.UNUSED); valid = valid && (clientStatus != ClientStatus.UNUSED || serverStatus != ServerStatus.UNUSED); valid = valid && (serverStatus == ServerStatus.IDLE || (completionPercentage >= 0 && completionPercentage <= 100) ); return valid; } public Packet250CloneToolStatus() // used by netty { super(); packetIsValid = false; } @Override protected void readFromBuffer(ByteBuf buf) { packetIsValid = false; try { clientStatus = ClientStatus.byteToCommand(buf.readByte()); serverStatus = ServerStatus.byteToCommand(buf.readByte()); completionPercentage = buf.readByte(); nameOfPlayerBeingServiced = new ChatComponentText(ByteBufUtils.readUTF8String(buf)); } catch (IndexOutOfBoundsException ioe) { ErrorLog.defaultLog().info("Exception while reading Packet250CloneToolStatus: " + ioe); return; } if (!checkInvariants()) return; packetIsValid = true; } @Override protected void writeToBuffer(ByteBuf buf) { if (!packetIsValid) return; buf.writeByte(clientStatus.getStatusID()); buf.writeByte(serverStatus.getStatusID()); buf.writeByte(completionPercentage); ByteBufUtils.writeUTF8String(buf, nameOfPlayerBeingServiced == null ? "" : nameOfPlayerBeingServiced.getUnformattedText()); } /** * Register the handler for this packet * @param packetHandlerRegistry * @param packetHandlerMethod * @param side */ public static void registerHandler(PacketHandlerRegistry packetHandlerRegistry, PacketHandlerMethod packetHandlerMethod, Side side) { switch (side) { case CLIENT: { clientSideHandler = packetHandlerMethod; break; } case SERVER: { serverSideHandler = packetHandlerMethod; break; } default: { assert false : "Tried to register Packet250CloneToolStatus on side " + side; } } packetHandlerRegistry.getSimpleNetworkWrapper().registerMessage(CommonMessageHandler.class, Packet250CloneToolStatus.class, Packet250Types.PACKET250_TOOL_STATUS_ID.getPacketTypeID(), side); } public interface PacketHandlerMethod { public boolean handlePacket(Packet250CloneToolStatus packet250CloneToolStatus, MessageContext ctx); } public static class CommonMessageHandler implements IMessageHandler<Packet250CloneToolStatus, IMessage> { /** * Called when a message is received of the appropriate type. You can optionally return a reply message, or null if no reply * is needed. * * @param message The message * @return an optional return message */ public IMessage onMessage(final Packet250CloneToolStatus message, final MessageContext ctx) { Runnable messageProcessor = null; switch (ctx.side) { case CLIENT: { if (clientSideHandler == null) { ErrorLog.defaultLog().severe("Packet250CloneToolStatus received but not registered on side " + ctx.side); } else { // System.out.println("Status received:" + message.getServerStatus() ); messageProcessor = new Runnable() { @Override public void run() { clientSideHandler.handlePacket(message, ctx); } }; } break; } case SERVER: { if (serverSideHandler == null) { ErrorLog.defaultLog().severe("Packet250CloneToolStatus received but not registered on side " + ctx.side); } else { messageProcessor = new Runnable() { @Override public void run() { serverSideHandler.handlePacket(message, ctx); } }; } break; } default: assert false : "Received message on invalid side: " + ctx.side; } if (messageProcessor != null) { boolean success = SpeedyToolsMod.proxy.enqueueMessageOnCorrectThread(ctx, messageProcessor); if (!success) { ErrorLog.defaultLog().severe("Packet250CloneToolStatus failed to handle Packet"); } } return null; } } private ClientStatus clientStatus; private ServerStatus serverStatus; private byte completionPercentage = 100; private IChatComponent nameOfPlayerBeingServiced; private static PacketHandlerMethod serverSideHandler; private static PacketHandlerMethod clientSideHandler; }