content: package emu.grasscutter.net.packet;
  
  import java.io.ByteArrayOutputStream;
  import java.io.IOException;
  
  public class PacketWriter {
  	// Little endian
  	private final ByteArrayOutputStream baos;
  	
  	public PacketWriter() {
  		this.baos = new ByteArrayOutputStream(128);
  	}
  
  	public byte[] build() {
  		return baos.toByteArray();
  	}
  
  	// Writers
  	
  	public void writeEmpty(int i) {
  		while (i > 0) {
  			baos.write(0);
  			i--;
  		}
  	}
  	
  	public void writeMax(int i) {
  		while (i > 0) {
  			baos.write(0xFF);
  			i--;
  		}
  	}
  	
  	public void writeInt8(byte b) {
          baos.write(b);
      }
  
  	public void writeInt8(int i) {
  		baos.write((byte) i);
  	}
  	
  	public void writeBoolean(boolean b) {
          baos.write(b ? 1 : 0);
      }
  	
  	public void writeUint8(byte b) {
  		// Unsigned byte
          baos.write(b & 0xFF);
      }
  	
  	public void writeUint8(int i) {
  
  		baos.write((byte) i & 0xFF);
  	}
  	
  	public void writeUint16(int i) {
  		// Unsigned short
          baos.write((byte) (i & 0xFF));
          baos.write((byte) ((i >>> 8) & 0xFF));
      }
  	
  	public void writeUint24(int i) {
  		// 24 bit integer
          baos.write((byte) (i & 0xFF));
          baos.write((byte) ((i >>> 8) & 0xFF));
          baos.write((byte) ((i >>> 16) & 0xFF));
      }
  	
  	public void writeInt16(int i) {
  		// Signed short
          baos.write((byte) i);
          baos.write((byte) (i >>> 8));
      }
  
      public void writeUint32(int i) {
      	// Unsigned int
          baos.write((byte) (i & 0xFF));
          baos.write((byte) ((i >>> 8) & 0xFF));
          baos.write((byte) ((i >>> 16) & 0xFF));
          baos.write((byte) ((i >>> 24) & 0xFF));
      }
      
      public void writeInt32(int i) {
      	// Signed int
          baos.write((byte) i);
          baos.write((byte) (i >>> 8));
          baos.write((byte) (i >>> 16));
          baos.write((byte) (i >>> 24));
      }
      
      public void writeUint32(long i) {
      	// Unsigned int (long)
          baos.write((byte) (i & 0xFF));
          baos.write((byte) ((i >>> 8) & 0xFF));
          baos.write((byte) ((i >>> 16) & 0xFF));
          baos.write((byte) ((i >>> 24) & 0xFF));
      }
      
      public void writeFloat(float f){
      	this.writeUint32(Float.floatToRawIntBits(f));
      }
  
      public void writeUint64(long l) {
          baos.write((byte) (l & 0xFF));
          baos.write((byte) ((l >>> 8) & 0xFF));
          baos.write((byte) ((l >>> 16) & 0xFF));
          baos.write((byte) ((l >>> 24) & 0xFF));
          baos.write((byte) ((l >>> 32) & 0xFF));
          baos.write((byte) ((l >>> 40) & 0xFF));
          baos.write((byte) ((l >>> 48) & 0xFF));
          baos.write((byte) ((l >>> 56) & 0xFF));
      }
      
      public void writeDouble(double d){
      	long l = Double.doubleToLongBits(d);
      	this.writeUint64(l);
      }
      
      public void writeString16(String s) {
  		if (s == null) {
  			this.writeUint16(0);
  			return;
  		}
  
      	this.writeUint16(s.length() * 2);
      	for (int i = 0; i < s.length(); i++) {
      		char c = s.charAt(i);
      		this.writeUint16((short) c);
      	}
      }
      
      public void writeString8(String s) {
  		if (s == null) {
  			this.writeUint16(0);
  			return;
  		}
  
  		this.writeUint16(s.length());
      	for (int i = 0; i < s.length(); i++) {
      		char c = s.charAt(i);
      		this.writeUint8((byte) c);
      	}
      }
      
      public void writeDirectString8(String s, int expectedSize) {
  		if (s == null) {
  			return;
  		}
  
  		for (int i = 0; i < expectedSize; i++) {
      		char c = i < s.length() ? s.charAt(i) : 0;
      		this.writeUint8((byte) c);
      	}
      }
      
      public void writeBytes(byte[] bytes) {
      	try {
  			baos.write(bytes);
  		} catch (IOException e) {
  			// TODO Auto-generated catch block
  			e.printStackTrace();
  		}
      }
  
  	public void writeBytes(int[] bytes) {
  		byte[] b = new byte[bytes.length];
  		for (int i = 0; i < bytes.length; i++)
  			b[i] = (byte)bytes[i];
  
  		try {
  			baos.write(b);
  		} catch (IOException e) {
  			// TODO Auto-generated catch block
  			e.printStackTrace();
  		}
  	}
  }
  