Commit 56c313c6 authored by salix5's avatar salix5 Committed by GitHub

Use vector in DuelClient::SendUpdateDeck (#2952)

parent 21c52f9c
......@@ -4,6 +4,7 @@
#include <cstdint>
#include <cstring>
#include <cwchar>
#include <vector>
class BufferIO {
public:
......@@ -15,11 +16,21 @@ public:
return ret;
}
template<typename T>
static void Write(unsigned char*& p, T value) {
static void Write(unsigned char*& p, const T& value) {
std::memcpy(p, &value, sizeof(T));
p += sizeof(T);
}
static void VectorWriteBlock(std::vector<unsigned char>& buffer, const void* src, size_t size) {
const auto len = buffer.size();
buffer.resize(len + size);
std::memcpy(buffer.data() + len, src, size);
}
template<typename T>
static void VectorWrite(std::vector<unsigned char>& buffer, const T& value) {
VectorWriteBlock(buffer, &value, sizeof(T));
}
// for compatibility
[[deprecated]]
static int32_t ReadInt32(unsigned char*& p) {
......
......@@ -702,17 +702,7 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) {
break;
}
mainGame->ClearCardInfo();
unsigned char deckbuf[1024]{};
auto pdeck = deckbuf;
BufferIO::Write<int32_t>(pdeck, static_cast<int32_t>(deckManager.current_deck.main.size() + deckManager.current_deck.extra.size()));
BufferIO::Write<int32_t>(pdeck, static_cast<int32_t>(deckManager.current_deck.side.size()));
for(size_t i = 0; i < deckManager.current_deck.main.size(); ++i)
BufferIO::Write<uint32_t>(pdeck, deckManager.current_deck.main[i]->first);
for(size_t i = 0; i < deckManager.current_deck.extra.size(); ++i)
BufferIO::Write<uint32_t>(pdeck, deckManager.current_deck.extra[i]->first);
for(size_t i = 0; i < deckManager.current_deck.side.size(); ++i)
BufferIO::Write<uint32_t>(pdeck, deckManager.current_deck.side[i]->first);
DuelClient::SendBufferToServer(CTOS_UPDATE_DECK, deckbuf, pdeck - deckbuf);
DuelClient::SendUpdateDeck(deckManager.current_deck);
break;
}
case BUTTON_SIDE_RELOAD: {
......
......@@ -4067,6 +4067,19 @@ void DuelClient::SendResponse() {
SendBufferToServer(CTOS_RESPONSE, response_buf, response_len);
}
}
void DuelClient::SendUpdateDeck(const Deck& deck) {
std::vector<unsigned char> deckbuf;
deckbuf.reserve(1024);
BufferIO::VectorWrite<int32_t>(deckbuf, static_cast<int32_t>(deck.main.size() + deck.extra.size()));
BufferIO::VectorWrite<int32_t>(deckbuf, static_cast<int32_t>(deck.side.size()));
for (const auto& card: deck.main)
BufferIO::VectorWrite<uint32_t>(deckbuf, card->first);
for (const auto& card: deck.extra)
BufferIO::VectorWrite<uint32_t>(deckbuf, card->first);
for (const auto& card: deck.side)
BufferIO::VectorWrite<uint32_t>(deckbuf, card->first);
SendBufferToServer(CTOS_UPDATE_DECK, deckbuf.data(), deckbuf.size());
}
void DuelClient::BeginRefreshHost() {
if(is_refreshing)
return;
......
......@@ -5,6 +5,7 @@
#include <set>
#include <random>
#include "config.h"
#include "deck_manager.h"
#include "network.h"
namespace ygo {
......@@ -48,6 +49,7 @@ public:
static void SetResponseI(int32_t respI);
static void SetResponseB(void* respB, size_t len);
static void SendResponse();
static void SendUpdateDeck(const Deck& deck);
static void SendPacketToServer(unsigned char proto) {
auto p = duel_client_write;
BufferIO::Write<uint16_t>(p, 1);
......
......@@ -15,17 +15,7 @@ namespace ygo {
void UpdateDeck() {
BufferIO::CopyWideString(mainGame->cbCategorySelect->getText(), mainGame->gameConf.lastcategory);
BufferIO::CopyWideString(mainGame->cbDeckSelect->getText(), mainGame->gameConf.lastdeck);
unsigned char deckbuf[1024]{};
auto pdeck = deckbuf;
BufferIO::Write<int32_t>(pdeck, static_cast<int32_t>(deckManager.current_deck.main.size() + deckManager.current_deck.extra.size()));
BufferIO::Write<int32_t>(pdeck, static_cast<int32_t>(deckManager.current_deck.side.size()));
for(size_t i = 0; i < deckManager.current_deck.main.size(); ++i)
BufferIO::Write<uint32_t>(pdeck, deckManager.current_deck.main[i]->first);
for(size_t i = 0; i < deckManager.current_deck.extra.size(); ++i)
BufferIO::Write<uint32_t>(pdeck, deckManager.current_deck.extra[i]->first);
for(size_t i = 0; i < deckManager.current_deck.side.size(); ++i)
BufferIO::Write<uint32_t>(pdeck, deckManager.current_deck.side[i]->first);
DuelClient::SendBufferToServer(CTOS_UPDATE_DECK, deckbuf, pdeck - deckbuf);
DuelClient::SendUpdateDeck(deckManager.current_deck);
}
bool MenuHandler::OnEvent(const irr::SEvent& event) {
if(mainGame->dField.OnCommonEvent(event))
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment