Files
DbMinecraft/packets.cpp
2020-07-29 18:43:16 +02:00

277 lines
9.5 KiB
C++

#include "packets.h"
#include <QtGlobal>
#include "mcdatastream.h"
packets::handshaking::serverbound::Handshake::Handshake(McDataStream &stream)
{
protocolVersion = stream.readVar<qint32>();
serverAddress = stream.readVar<QString>();
stream >> serverPort;
const auto socketState = stream.readVar<qint32>();
Q_ASSERT(socketState == 1 || socketState == 2);
nextState = SocketState(socketState);
}
packets::status::serverbound::Request::Request(McDataStream &stream)
{
Q_UNUSED(stream);
}
packets::status::serverbound::Ping::Ping(McDataStream &stream)
{
stream >> payload;
}
void packets::status::clientbound::Response::serialize(McDataStream &stream)
{
QByteArray buffer;
McDataStream tempStream(&buffer, QIODevice::WriteOnly);
tempStream.writeVar<qint32>(qint32(PacketType::Response));
tempStream.writeVar<QString>(jsonResponse);
stream.writeVar<qint32>(buffer.length());
stream.writeRawData(buffer.constData(), buffer.length());
}
void packets::status::clientbound::Pong::serialize(McDataStream &stream)
{
QByteArray buffer;
McDataStream tempStream(&buffer, QIODevice::WriteOnly);
tempStream.writeVar<qint32>(qint32(PacketType::Pong));
tempStream << payload;
stream.writeVar<qint32>(buffer.length());
stream.writeRawData(buffer.constData(), buffer.length());
}
packets::login::serverbound::Login::Login(McDataStream &stream)
{
name = stream.readVar<QString>();
}
void packets::login::clientbound::LoginSuccess::serialize(McDataStream &stream)
{
QByteArray buffer;
McDataStream tempStream(&buffer, QIODevice::WriteOnly);
tempStream.writeVar<qint32>(qint32(PacketType::LoginSuccess));
//tempStream.writeUuid(uuid);
tempStream.writeVar<QString>(uuid);
tempStream.writeVar<QString>(username);
stream.writeVar<qint32>(buffer.length());
stream.writeRawData(buffer.constData(), buffer.length());
}
packets::play::serverbound::ChatMessage::ChatMessage(McDataStream &stream)
{
message = stream.readVar<QString>();
}
packets::play::serverbound::ClientSettings::ClientSettings(McDataStream &stream)
{
locale = stream.readVar<QString>();
stream >> viewDistance;
chatMode = stream.readVar<qint32>();
stream >> chatColors
>> displayedSkinParts;
mainHand = stream.readVar<qint32>();
}
packets::play::serverbound::InteractEntity::InteractEntity(McDataStream &stream)
{
entityId = stream.readVar<qint32>();
type = Type(stream.readVar<qint32>());
switch (type)
{
case InteractAt:
targetX = stream.readFloat();
targetY = stream.readFloat();
targetZ = stream.readFloat();
[[fallthrough]];
case Interact:
hand = Hand(stream.readVar<qint32>());
}
}
packets::play::serverbound::PluginMessage::PluginMessage(McDataStream &stream)
{
channel = stream.readVar<QString>();
//TODO read to end of buffer
}
void packets::play::clientbound::SpawnMob::serialize(McDataStream &stream)
{
QByteArray buffer;
McDataStream tempStream(&buffer, QIODevice::WriteOnly);
tempStream.writeVar<qint32>(qint32(PacketType::SpawnMob));
tempStream.writeVar<qint32>(entityId);
tempStream.writeUuid(uuid);
tempStream.writeVar<qint32>(type);
tempStream.writeDouble(x);
tempStream.writeDouble(y);
tempStream.writeDouble(z);
tempStream << yaw << pitch << headPitch << velocityX << velocityY << velocityZ;
stream.writeVar<qint32>(buffer.length());
stream.writeRawData(buffer.constData(), buffer.length());
}
void packets::play::clientbound::ServerDifficulty::serialize(McDataStream &stream)
{
QByteArray buffer;
McDataStream tempStream(&buffer, QIODevice::WriteOnly);
tempStream.writeVar<qint32>(qint32(PacketType::ServerDifficulty));
tempStream << difficulty;
stream.writeVar<qint32>(buffer.length());
stream.writeRawData(buffer.constData(), buffer.length());
}
void packets::play::clientbound::ChatMessage::serialize(McDataStream &stream)
{
QByteArray buffer;
McDataStream tempStream(&buffer, QIODevice::WriteOnly);
tempStream.writeVar<qint32>(qint32(PacketType::ChatMessage));
tempStream.writeVar<QString>(jsonData);
tempStream << qint8(position);
stream.writeVar<qint32>(buffer.length());
stream.writeRawData(buffer.constData(), buffer.length());
}
void packets::play::clientbound::OpenWindow::serialize(McDataStream &stream)
{
QByteArray buffer;
McDataStream tempStream(&buffer, QIODevice::WriteOnly);
tempStream.writeVar<qint32>(qint32(PacketType::OpenWindow));
tempStream << windowId;
tempStream.writeVar<QString>(windowType);
tempStream.writeVar<QString>(windowTitle);
tempStream << numberOfSlots;
if (entityId.has_value())
tempStream << *entityId;
stream.writeVar<qint32>(buffer.length());
stream.writeRawData(buffer.constData(), buffer.length());
}
void packets::play::clientbound::PluginMessage::serialize(McDataStream &stream)
{
QByteArray buffer;
McDataStream tempStream(&buffer, QIODevice::WriteOnly);
tempStream.writeVar<qint32>(qint32(PacketType::PluginMessage));
tempStream.writeVar<QString>(channel);
buffer.append(data);
stream.writeVar<qint32>(buffer.length());
stream.writeRawData(buffer.constData(), buffer.length());
}
void packets::play::clientbound::Disconnect::serialize(McDataStream &stream)
{
QByteArray buffer;
McDataStream tempStream(&buffer, QIODevice::WriteOnly);
tempStream.writeVar<qint32>(qint32(PacketType::Disconnect));
tempStream.writeVar<QString>(reason);
stream.writeVar<qint32>(buffer.length());
stream.writeRawData(buffer.constData(), buffer.length());
}
void packets::play::clientbound::JoinGame::serialize(McDataStream &stream)
{
QByteArray buffer;
McDataStream tempStream(&buffer, QIODevice::WriteOnly);
tempStream.writeVar<qint32>(qint32(PacketType::JoinGame));
tempStream << entityid
<< quint8(gamemode)
<< qint32(dimension)
<< difficulty
<< maxPlayers;
tempStream.writeVar<QString>(levelType);
tempStream << reducedDebugInfo;
stream.writeVar<qint32>(buffer.length());
stream.writeRawData(buffer.constData(), buffer.length());
}
void packets::play::clientbound::PlayerAbilities::serialize(McDataStream &stream)
{
QByteArray buffer;
McDataStream tempStream(&buffer, QIODevice::WriteOnly);
tempStream.writeVar<qint32>(qint32(PacketType::PlayerAbilities));
tempStream << flags;
tempStream.writeFloat(flyingSpeed);
tempStream.writeFloat(fieldOfViewModifier);
stream.writeVar<qint32>(buffer.length());
stream.writeRawData(buffer.constData(), buffer.length());
}
void packets::play::clientbound::PlayerPositionAndLook::serialize(McDataStream &stream)
{
QByteArray buffer;
McDataStream tempStream(&buffer, QIODevice::WriteOnly);
tempStream.writeVar<qint32>(qint32(PacketType::PlayerPositionAndLook));
tempStream.writeDouble(x);
tempStream.writeDouble(y);
tempStream.writeDouble(z);
tempStream.writeFloat(yaw);
tempStream.writeFloat(pitch);
tempStream << flags;
tempStream.writeVar<qint32>(teleportId);
stream.writeVar<qint32>(buffer.length());
stream.writeRawData(buffer.constData(), buffer.length());
}
void packets::play::clientbound::SetExperience::serialize(McDataStream &stream)
{
QByteArray buffer;
McDataStream tempStream(&buffer, QIODevice::WriteOnly);
tempStream.writeVar<qint32>(qint32(PacketType::SetExperience));
tempStream.writeFloat(experienceBar);
tempStream.writeVar<qint32>(level);
tempStream.writeVar<qint32>(totalExperience);
stream.writeVar<qint32>(buffer.length());
stream.writeRawData(buffer.constData(), buffer.length());
}
void packets::play::clientbound::UpdateHealth::serialize(McDataStream &stream)
{
QByteArray buffer;
McDataStream tempStream(&buffer, QIODevice::WriteOnly);
tempStream.writeVar<qint32>(qint32(PacketType::UpdateHealth));
tempStream.writeFloat(health);
tempStream.writeVar<qint32>(food);
tempStream.writeFloat(foodSaturation);
stream.writeVar<qint32>(buffer.length());
stream.writeRawData(buffer.constData(), buffer.length());
}
void packets::play::clientbound::SpawnPosition::serialize(McDataStream &stream)
{
QByteArray buffer;
McDataStream tempStream(&buffer, QIODevice::WriteOnly);
tempStream.writeVar<qint32>(qint32(PacketType::SpawnPosition));
tempStream.writePosition(location);
stream.writeVar<qint32>(buffer.length());
stream.writeRawData(buffer.constData(), buffer.length());
}
void packets::play::clientbound::KeepAlive::serialize(McDataStream &stream)
{
QByteArray buffer;
McDataStream tempStream(&buffer, QIODevice::WriteOnly);
tempStream.writeVar<qint32>(qint32(PacketType::KeepAlive));
tempStream << keepAliveId;
stream.writeVar<qint32>(buffer.length());
stream.writeRawData(buffer.constData(), buffer.length());
}
void packets::play::clientbound::ChunkData::serialize(McDataStream &stream)
{
QByteArray buffer;
McDataStream tempStream(&buffer, QIODevice::WriteOnly);
tempStream.writeVar<qint32>(qint32(PacketType::ChunkData));
tempStream << chunkX << chunkY << fullChunk;
tempStream.writeVar<qint32>(primaryBitMask);
tempStream.writeVar<qint32>(data.size());
tempStream.writeRawData(data.constData(), data.size());
tempStream.writeVar<qint32>(blockEntities.size());
for (const auto &blockEntitiy : blockEntities)
tempStream.writeRawData(blockEntitiy.constData(), blockEntitiy.size());
stream.writeVar<qint32>(buffer.length());
stream.writeRawData(buffer.constData(), buffer.length());
}