blob: dcdda101469369c36c8a00ed861a6d25e94b0be2 (
plain) (
tree)
|
|
#include "Network.hpp"
Network::Network(std::string address, unsigned short port) {
try {
socket = new Socket(address, port);
stream = new StreamSocket(socket);
} catch (std::exception &e) {
LOG(FATAL)<<e.what();
}
}
Network::~Network() {
delete stream;
delete socket;
}
std::shared_ptr<Packet> Network::ReceivePacket(ConnectionState state) {
int packetSize = stream->ReadVarInt();
auto packetData = stream->ReadByteArray(packetSize);
StreamBuffer streamBuffer(packetData.data(), packetData.size());
int packetId = streamBuffer.ReadVarInt();
auto packet = ReceivePacketByPacketId(packetId, state, streamBuffer);
return packet;
}
void Network::SendPacket(Packet &packet) {
StreamCounter packetSize;
packetSize.WriteVarInt(packet.GetPacketId());
packet.ToStream(&packetSize);
stream->WriteVarInt(packetSize.GetCountedSize());
stream->WriteVarInt(packet.GetPacketId());
packet.ToStream(stream);
}
std::shared_ptr<Packet> Network::ReceivePacketByPacketId(int packetId, ConnectionState state, StreamInput &stream) {
std::shared_ptr<Packet> packet(nullptr);
switch (state) {
case Handshaking:
switch (packetId) {
case PacketNameHandshakingCB::Handshake:
packet = std::make_shared<PacketHandshake>();
break;
}
case Login:
switch (packetId) {
case PacketNameLoginCB::LoginSuccess:
packet = std::make_shared<PacketLoginSuccess>();
break;
}
break;
case Play:
packet = ParsePacketPlay((PacketNamePlayCB) packetId);
break;
case Status:
break;
}
if (packet.get() != nullptr)
packet->FromStream(&stream);
return packet;
}
std::shared_ptr<Packet> Network::ParsePacketPlay(PacketNamePlayCB id) {
switch (id) {
case SpawnObject:
break;
case SpawnExperienceOrb:
break;
case SpawnGlobalEntity:
break;
case SpawnMob:
break;
case SpawnPainting:
break;
case SpawnPlayer:
break;
case AnimationCB:
break;
case Statistics:
break;
case BlockBreakAnimation:
break;
case UpdateBlockEntity:
break;
case BlockAction:
break;
case BlockChange:
break;
case BossBar:
break;
case ServerDifficulty:
break;
case TabCompleteCB:
break;
case ChatMessageCB:
break;
case MultiBlockChange:
break;
case ConfirmTransactionCB:
break;
case CloseWindowCB:
break;
case OpenWindow:
break;
case WindowItems:
break;
case WindowProperty:
break;
case SetSlot:
break;
case SetCooldown:
break;
case PluginMessageCB:
break;
case NamedSoundEffect:
break;
case DisconnectPlay:
return std::make_shared<PacketDisconnectPlay>();
case EntityStatus:
break;
case Explosion:
break;
case UnloadChunk:
break;
case ChangeGameState:
break;
case KeepAliveCB:
return std::make_shared<PacketKeepAliveCB>();
case ChunkData:
return std::make_shared<PacketChunkData>();
case Effect:
break;
case Particle:
break;
case JoinGame:
return std::make_shared<PacketJoinGame>();
case Map:
break;
case EntityRelativeMove:
break;
case EntityLookAndRelativeMove:
break;
case EntityLook:
break;
case Entity:
break;
case VehicleMove:
break;
case OpenSignEditor:
break;
case PlayerAbilitiesCB:
break;
case CombatEvent:
break;
case PlayerListItem:
break;
case PlayerPositionAndLookCB:
return std::make_shared<PacketPlayerPositionAndLookCB>();
case UseBed:
break;
case DestroyEntities:
break;
case RemoveEntityEffect:
break;
case ResourcePackSend:
break;
case Respawn:
break;
case EntityHeadLook:
break;
case WorldBorder:
break;
case Camera:
break;
case HeldItemChangeCB:
break;
case DisplayScoreboard:
break;
case EntityMetadata:
break;
case AttachEntity:
break;
case EntityVelocity:
break;
case EntityEquipment:
break;
case SetExperience:
break;
case UpdateHealth:
return std::make_shared<PacketUpdateHealth>();
case ScoreboardObjective:
break;
case SetPassengers:
break;
case Teams:
break;
case UpdateScore:
break;
case SpawnPosition:
return std::make_shared<PacketSpawnPosition>();
case TimeUpdate:
break;
case Title:
break;
case SoundEffect:
break;
case PlayerListHeaderAndFooter:
break;
case CollectItem:
break;
case EntityTeleport:
break;
case EntityProperties:
break;
case EntityEffect:
break;
case UnlockRecipes:
break;
case SelectAdvancementTab:
break;
case Advancements:
break;
}
return nullptr;
}
|