tmp
This commit is contained in:
parent
a88b22b177
commit
263bb3e3af
10 changed files with 374 additions and 117 deletions
|
|
@ -1,4 +1,6 @@
|
|||
#include "Client.h"
|
||||
#include "Protocol.pb.h"
|
||||
#include <google/protobuf/message.h>
|
||||
#include <iostream>
|
||||
#include <thread>
|
||||
|
||||
|
|
@ -9,16 +11,20 @@ BaseClient::BaseClient(boost::asio::io_context &io_context,
|
|||
boost::asio::connect(socket_, resolver.resolve(host, port));
|
||||
}
|
||||
|
||||
void BaseClient::SendPacket(PacketID id, const void *payload,
|
||||
size_t payloadSize) {
|
||||
void BaseClient::SendPacket(PacketID id, const google::protobuf::Message *pkt) {
|
||||
uint16_t payloadSize = 0;
|
||||
if (pkt) {
|
||||
payloadSize = static_cast<uint16_t>(pkt->ByteSizeLong());
|
||||
}
|
||||
|
||||
PacketHeader header;
|
||||
header.id = static_cast<uint16_t>(id);
|
||||
header.size = static_cast<uint16_t>(payloadSize);
|
||||
header.size = payloadSize;
|
||||
|
||||
std::vector<uint8_t> buffer(sizeof(PacketHeader) + payloadSize);
|
||||
std::memcpy(buffer.data(), &header, sizeof(PacketHeader));
|
||||
if (payload && payloadSize > 0) {
|
||||
std::memcpy(buffer.data() + sizeof(PacketHeader), payload, payloadSize);
|
||||
if (pkt) {
|
||||
pkt->SerializeToArray(buffer.data() + sizeof(PacketHeader), payloadSize);
|
||||
}
|
||||
|
||||
boost::asio::write(socket_, boost::asio::buffer(buffer));
|
||||
|
|
@ -34,11 +40,9 @@ bool BaseClient::ReceiveHeader(PacketHeader &header) {
|
|||
}
|
||||
|
||||
bool BaseClient::Login(const std::string &nickname) {
|
||||
PKT_CS_Login loginPkt;
|
||||
std::memset(loginPkt.nickname, 0, sizeof(loginPkt.nickname));
|
||||
std::strncpy(loginPkt.nickname, nickname.c_str(),
|
||||
sizeof(loginPkt.nickname) - 1);
|
||||
SendPacket(PacketID::CS_Login, &loginPkt, sizeof(loginPkt));
|
||||
Protocol::CS_Login loginPkt;
|
||||
loginPkt.set_nickname(nickname);
|
||||
SendPacket(PacketID::CS_Login, &loginPkt);
|
||||
std::cout << "로그인 요청 보냄: " << nickname << std::endl;
|
||||
|
||||
// 로그인 결과 대기
|
||||
|
|
@ -49,20 +53,20 @@ bool BaseClient::Login(const std::string &nickname) {
|
|||
return false;
|
||||
}
|
||||
|
||||
PKT_SC_LoginResult res;
|
||||
if (!ReceivePayload(res)) {
|
||||
std::cerr << "로그인 응답 수신 실패" << std::endl;
|
||||
Protocol::SC_LoginResult res;
|
||||
std::vector<uint8_t> payload(header.size);
|
||||
boost::asio::read(socket_, boost::asio::buffer(payload.data(), header.size));
|
||||
if (!res.ParseFromArray(payload.data(), header.size)) {
|
||||
std::cerr << "로그인 응답 파싱 실패" << std::endl;
|
||||
return false;
|
||||
}
|
||||
|
||||
if (res.result == 1) {
|
||||
if (res.success()) {
|
||||
std::cout << "로그인 성공!" << std::endl;
|
||||
return true;
|
||||
} else if (res.result == 0) {
|
||||
std::cerr << "로그인 실패: 이미 접속 중인 유저입니다." << std::endl;
|
||||
return false;
|
||||
} else {
|
||||
std::cerr << "로그인 실패: 알 수 없는 오류" << std::endl;
|
||||
std::cerr << "로그인 실패: 이미 접속 중인 유저거나 오류가 발생했습니다."
|
||||
<< std::endl;
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
|
@ -99,10 +103,10 @@ void BaseClient::HandlePacket(const PacketHeader &header) {
|
|||
std::cout << "\n" << buffer.data() << std::endl;
|
||||
} break;
|
||||
case PacketID::SC_UpgradeResult:
|
||||
HandleUpgradeResult();
|
||||
HandleUpgradeResult(header);
|
||||
break;
|
||||
case PacketID::SC_SellResult:
|
||||
HandleSellResult();
|
||||
HandleSellResult(header);
|
||||
break;
|
||||
default:
|
||||
// 처리하지 않는 패킷은 페이로드만 건너뜀
|
||||
|
|
@ -115,22 +119,26 @@ void BaseClient::HandlePacket(const PacketHeader &header) {
|
|||
}
|
||||
}
|
||||
|
||||
void BaseClient::HandleUpgradeResult() {
|
||||
PKT_SC_UpgradeResult res;
|
||||
if (ReceivePayload(res)) {
|
||||
currentLevel_ = res.currentLevel;
|
||||
currentGold_ = res.currentGold;
|
||||
void BaseClient::HandleUpgradeResult(const PacketHeader &header) {
|
||||
Protocol::SC_UpgradeResult res;
|
||||
std::vector<uint8_t> payload(header.size);
|
||||
boost::asio::read(socket_, boost::asio::buffer(payload.data(), header.size));
|
||||
if (res.ParseFromArray(payload.data(), header.size)) {
|
||||
currentLevel_ = res.current_level();
|
||||
currentGold_ = res.current_gold();
|
||||
// 강화 결과 출력은 채팅으로
|
||||
}
|
||||
}
|
||||
|
||||
void BaseClient::HandleSellResult() {
|
||||
PKT_SC_SellResult res;
|
||||
if (ReceivePayload(res)) {
|
||||
void BaseClient::HandleSellResult(const PacketHeader &header) {
|
||||
Protocol::SC_SellResult res;
|
||||
std::vector<uint8_t> payload(header.size);
|
||||
boost::asio::read(socket_, boost::asio::buffer(payload.data(), header.size));
|
||||
if (res.ParseFromArray(payload.data(), header.size)) {
|
||||
currentLevel_ = 0;
|
||||
currentGold_ = res.totalGold;
|
||||
currentGold_ = res.total_gold();
|
||||
// 판매 결과는 본인에게만
|
||||
std::cout << "\n>> 판매 완료: " << res.earnedGold << " 골드 획득!"
|
||||
std::cout << "\n>> 판매 완료: " << res.earned_gold() << " 골드 획득!"
|
||||
<< std::endl;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue