1package com.runehive.net.packet;
3import com.runehive.net.codec.AccessType;
4import com.runehive.net.codec.ByteModification;
5import com.runehive.net.codec.ByteOrder;
6import io.netty.buffer.ByteBuf;
7import io.netty.buffer.DefaultByteBufHolder;
8import io.netty.buffer.PooledByteBufAllocator;
10import static com.google.common.base.Preconditions.checkState;
21 private static final int[]
BIT_MASK =
new int[32];
24 for (
int i = 0; i <
BIT_MASK.length; i++) {
37 return new PacketBuilder(PooledByteBufAllocator.DEFAULT.buffer(initialCapacity, maxCapacity));
41 return new PacketBuilder(PooledByteBufAllocator.DEFAULT.buffer(capacity));
83 content().writeByte((
byte) value);
93 checkState(amount >= 1 && amount <= 32,
"Number of bits must be between 1 and 32 inclusive.");
98 int requiredSpace = bytePos -
content().writerIndex() + 1;
99 requiredSpace += (amount + 7) / 8;
100 if (
content().writableBytes() < requiredSpace) {
103 for (; amount > bitOffset; bitOffset = 8) {
104 byte tmp =
content().getByte(bytePos);
106 tmp |= (value >> (amount - bitOffset)) &
BIT_MASK[bitOffset];
107 content().setByte(bytePos++, tmp);
110 if (amount == bitOffset) {
111 byte tmp =
content().getByte(bytePos);
114 content().setByte(bytePos, tmp);
116 byte tmp =
content().getByte(bytePos);
117 tmp &= ~(
BIT_MASK[amount] << (bitOffset - amount));
118 tmp |= (value &
BIT_MASK[amount]) << (bitOffset - amount);
119 content().setByte(bytePos, tmp);
125 content().writeBytes(from, 0, size);
130 for (
int i = 0; i < from.writerIndex(); i++) {
137 for (
int i = data.length - 1; i >= 0; i--) {
217 throw new UnsupportedOperationException(
"Middle-endian long " +
"is not implemented!");
220 throw new UnsupportedOperationException(
"Inverse-middle-endian long is not implemented!");
259 throw new IllegalArgumentException(
"Middle-endian short is " +
"impossible!");
261 throw new IllegalArgumentException(
"Inverse-middle-endian " +
"short is impossible!");
273 for (
final byte value :
string.getBytes()) {
290 StringBuilder builder =
new StringBuilder();
291 while (
content().isReadable() && (temp =
content().readByte()) != 10) {
292 builder.append((
char) temp);
294 return builder.toString();
298 this.
content().writeBytes(buffer);
308 content().writeBytes(bytes, offset, length);
Represents a single game packet.
static PacketBuilder wrap(ByteBuf buf)
PacketBuilder writeBytesReverse(byte[] data)
GamePacket toPacket(int opcode)
PacketBuilder writeBytes(byte[] from, int size)
PacketBuilder initializeAccess(AccessType type)
PacketBuilder writeInt(int value, ByteModification type, ByteOrder order)
static PacketBuilder alloc()
PacketBuilder writeLong(long value)
PacketBuilder writeShort(int value)
PacketBuilder writeShort(int value, ByteModification type)
PacketBuilder writeInt(int value, ByteModification type)
PacketBuilder writeInt(int value, ByteOrder order)
PacketBuilder writeBit(boolean flag)
PacketBuilder writeLong(long value, ByteModification type, ByteOrder order)
PacketBuilder writeShort(int value, ByteOrder order)
PacketBuilder writeInt(int value)
PacketBuilder writeBytes(ByteBuf from)
PacketBuilder writeBits(int amount, int value)
static final int[] BIT_MASK
PacketBuilder(ByteBuf buffer)
PacketBuilder writeByte(int value)
PacketBuilder writeLong(long value, ByteOrder order)
PacketBuilder writeByteArray(byte[] bytes, int offset, int length)
PacketBuilder writeByteArray(byte[] bytes)
PacketBuilder writeByte(int value, ByteModification type)
static PacketBuilder alloc(int initialCapacity, int maxCapacity)
static PacketBuilder alloc(int capacity)
PacketBuilder writeShort(int value, ByteModification type, ByteOrder order)
GamePacket toPacket(int opcode, PacketType type)
PacketBuilder writeString(String string)
PacketBuilder writeLong(long value, ByteModification type)
PacketBuilder writeBuffer(ByteBuf buffer)
static final int DEFAULT_CAPACITY
Represents the different forms data can be written in.
Represents RuneScape's custom value types.
Represents the order in which bytes are written.
Represents a type of packet.
FIXED
A fixed size packet where the size never changes.