#include "Game.hpp" #include "../packet/PacketParser.hpp" #include "../packet/PacketBuilder.hpp" #include Game::Game() { m_display = new Display(1280, 720, "AltCraft", &m_world); m_nc = new NetworkClient("127.0.0.1", 25565, "HelloOne"); Packet &response = *m_nc->GetPacket(); if (response.GetId() != 0x02) { std::cout << response.GetId() << std::endl; throw 127; } PacketParser::Parse(response, Login); g_PlayerUuid = response.GetField(0).GetString(); g_PlayerName = response.GetField(1).GetString(); delete &response; m_networkState = ConnectionState::Play; std::cout << g_PlayerName << "'s UUID is " << g_PlayerUuid << std::endl; } Game::~Game() { std::cout << "Stopping game thread..." << std::endl; m_exit = true; m_gameThread.join(); std::cout << "Stopping graphics..." << std::endl; delete m_display; std::cout << "Stopping network..." << std::endl; delete m_nc; } void Game::MainLoop() { while (!m_exit) { ParsePackets(); if (m_display->IsClosed()) m_exit = true; } } void Game::ParsePackets() { Packet *packetPtr = m_nc->GetPacket(); if (!packetPtr) { using namespace std::chrono_literals; std::this_thread::sleep_for(16ms); return; } Packet packet = *packetPtr; delete packetPtr; PacketParser::Parse(packet); nlohmann::json json; //std::cout<<"Parsing packet: "<AddPacketToQueue(PacketBuilder::CPlay0x03(0)); m_nc->AddPacketToQueue(PacketBuilder::CPlay0x00(packet.GetField(6).GetVarInt())); std::cout << "Game is started! " << std::endl; std::cout << "PlayerPos is " << g_PlayerX << ", " << g_PlayerY << ", " << g_PlayerZ << "\tAngle: " << g_PlayerYaw << "," << g_PlayerPitch << std::endl; m_display->SetPlayerPos(g_PlayerX, g_PlayerY, g_PlayerZ); gameStartWaiter.notify_all(); break; case 0x1A: json = nlohmann::json::parse(packet.GetField(0).GetString()); std::cout << "Disconnect reason: " << json["text"].get() << std::endl; throw 119; break; case 0x20: m_world.ParseChunkData(packet); { std::vectorvec; for (auto &it:m_world.m_sections) { for (auto& it2:vec){ if (it2==it.first) std::cout< delta = clock.now() - timeOfPreviousSendedPpalPacket; if (delta.count() >= 50) { m_nc->AddPacketToQueue( PacketBuilder::CPlay0x0D(g_PlayerX, g_PlayerY, g_PlayerZ, g_PlayerYaw, g_PlayerPitch, true)); timeOfPreviousSendedPpalPacket = clock.now(); /*std::cout << "PlayerPos is " << g_PlayerX << "," << g_PlayerY << "," << g_PlayerZ << " " << g_PlayerYaw << "," << g_PlayerPitch << std::endl;*/ } } } void Game::Exec() { m_gameThread = std::thread(&Game::MainLoop, this); m_display->MainLoop(); }