feat: c++ pragma 방식 => protocol buffer로 직렬화 수정 및 클라이언트 python gui 앱으로 변경

This commit is contained in:
bumpsoo 2026-02-08 14:59:16 +09:00
parent a88b22b177
commit cd192d4ec4
14 changed files with 305 additions and 371 deletions

View file

@ -1,6 +1,7 @@
#include "PacketHandler.h"
#include "DatabaseManager.h"
#include "Logger.h"
#include "Protocol.pb.h"
#include "SessionManager.h"
#include "SwordLogic.h"
#include <boost/asio/use_awaitable.hpp>
@ -17,27 +18,25 @@ PacketHandler::HandlePacket(std::shared_ptr<Session> session,
} break;
case PacketID::CS_Login: {
if (packet.payload.size() < sizeof(PKT_CS_Login)) {
Logger::Log("로그인 패킷 크기가 올바르지 않습니다.");
Protocol::CS_Login pkt;
if (!pkt.ParseFromArray(packet.payload.data(), packet.payload.size())) {
Logger::Log("로그인 패킷 파싱 실패");
co_return;
}
const PKT_CS_Login *loginPkt =
reinterpret_cast<const PKT_CS_Login *>(packet.payload.data());
std::string nickname(loginPkt->nickname);
std::string nickname = pkt.nickname();
auto userData = co_await DatabaseManager::GetInstance().LoadUser(nickname);
// 골드와 검 레벨 설정 (닉네임은 TryJoin에서 설정)
session->SetGold(userData.gold);
session->SetSwordLevel(userData.swordLevel);
PKT_SC_LoginResult loginResult;
Protocol::SC_LoginResult loginResult;
// 중복 체크
if (!SessionManager::GetInstance().TryJoin(session, userData.nickname)) {
Logger::Log("중복 로그인 거부: ", nickname);
loginResult.result = 0;
loginResult.set_success(false);
session->SendPacket(PacketID::SC_LoginResult, loginResult);
co_return;
}
@ -46,7 +45,7 @@ PacketHandler::HandlePacket(std::shared_ptr<Session> session,
" (Gold: ", session->GetGold(),
", Level: ", session->GetSwordLevel(), ")");
loginResult.result = 1;
loginResult.set_success(true);
session->SendPacket(PacketID::SC_LoginResult, loginResult);
} break;
@ -55,14 +54,14 @@ PacketHandler::HandlePacket(std::shared_ptr<Session> session,
uint64_t cost = SwordLogic::GetUpgradeCost(currentLevel);
uint64_t currentGold = session->GetGold();
PKT_SC_UpgradeResult res;
Protocol::SC_UpgradeResult res;
if (currentGold < cost) {
// 골드 부족
res.result = 2;
res.set_result(2);
} else {
session->SetGold(currentGold - cost);
uint8_t result = SwordLogic::TryUpgrade(currentLevel);
res.result = result;
res.set_result(result);
// 성공
if (result == 1) {
@ -76,8 +75,8 @@ PacketHandler::HandlePacket(std::shared_ptr<Session> session,
session->GetNickname(), session->GetGold(), session->GetSwordLevel());
}
res.currentLevel = session->GetSwordLevel();
res.currentGold = session->GetGold();
res.set_current_level(session->GetSwordLevel());
res.set_current_gold(session->GetGold());
// 결과 패킷 전송
session->SendPacket(PacketID::SC_UpgradeResult, res);
@ -86,9 +85,9 @@ PacketHandler::HandlePacket(std::shared_ptr<Session> session,
if (currentGold >= cost) {
uint32_t attemptedLevel = currentLevel + 1;
std::string resultText;
if (res.result == 1) {
if (res.result() == 1) {
resultText = "를 달성했습니다!";
} else if (res.result == 0) {
} else if (res.result() == 0) {
resultText = " 시도 중 검이 파괴되었습니다!";
} else {
resultText = " 달성에 실패했습니다!";
@ -105,8 +104,9 @@ PacketHandler::HandlePacket(std::shared_ptr<Session> session,
std::vector<uint8_t> chatPayload(chatMsg.begin(), chatMsg.end());
SessionManager::GetInstance().Broadcast(chatHeader, chatPayload);
Logger::Log("강화 시도 [", session->GetNickname(), "]: ", (int)res.result,
" (레벨: ", currentLevel, "->", res.currentLevel, ")");
Logger::Log("강화 시도 [", session->GetNickname(),
"]: ", (int)res.result(), " (레벨: ", currentLevel, "->",
res.current_level(), ")");
}
} break;
@ -121,9 +121,9 @@ PacketHandler::HandlePacket(std::shared_ptr<Session> session,
co_await DatabaseManager::GetInstance().SaveUser(
session->GetNickname(), session->GetGold(), session->GetSwordLevel());
PKT_SC_SellResult res;
res.earnedGold = price;
res.totalGold = newGold;
Protocol::SC_SellResult res;
res.set_earned_gold(price);
res.set_total_gold(newGold);
session->SendPacket(PacketID::SC_SellResult, res);