Commit 8eff9b60 authored by wind2009's avatar wind2009

Merge remote-tracking branch 'upstream/master'

parents 17fdc6e7 82542f13
...@@ -153,6 +153,10 @@ public: ...@@ -153,6 +153,10 @@ public:
static int DecodeUTF8(const char* src, wchar_t(&dst)[N]) { static int DecodeUTF8(const char* src, wchar_t(&dst)[N]) {
return DecodeUTF8String(src, dst, N); return DecodeUTF8String(src, dst, N);
} }
template<size_t N, typename T>
static void NullTerminate(T(&str)[N]) {
str[N - 1] = 0;
}
static int GetVal(const wchar_t* pstr) { static int GetVal(const wchar_t* pstr) {
unsigned int ret = 0; unsigned int ret = 0;
while(*pstr >= L'0' && *pstr <= L'9') { while(*pstr >= L'0' && *pstr <= L'9') {
......
...@@ -31,7 +31,6 @@ ...@@ -31,7 +31,6 @@
#include <arpa/inet.h> #include <arpa/inet.h>
#include <netdb.h> #include <netdb.h>
#include <unistd.h> #include <unistd.h>
#include <locale.h>
#define SD_BOTH 2 #define SD_BOTH 2
#define SOCKET int #define SOCKET int
......
...@@ -1757,7 +1757,7 @@ bool DeckBuilder::push_main(code_pointer pointer, int seq) { ...@@ -1757,7 +1757,7 @@ bool DeckBuilder::push_main(code_pointer pointer, int seq) {
if(pointer->second.type & (TYPE_FUSION | TYPE_SYNCHRO | TYPE_XYZ | TYPE_LINK)) if(pointer->second.type & (TYPE_FUSION | TYPE_SYNCHRO | TYPE_XYZ | TYPE_LINK))
return false; return false;
auto& container = deckManager.current_deck.main; auto& container = deckManager.current_deck.main;
int maxc = mainGame->is_siding ? DECK_MAX_SIZE + 4 : DECK_MAX_SIZE; int maxc = mainGame->is_siding ? DECK_MAX_SIZE + 5 : DECK_MAX_SIZE;
if((int)container.size() >= maxc) if((int)container.size() >= maxc)
return false; return false;
if(seq >= 0 && seq < (int)container.size()) if(seq >= 0 && seq < (int)container.size())
......
...@@ -178,7 +178,7 @@ int DeckManager::LoadDeck(Deck& deck, int* dbuf, int mainc, int sidec, bool is_p ...@@ -178,7 +178,7 @@ int DeckManager::LoadDeck(Deck& deck, int* dbuf, int mainc, int sidec, bool is_p
} }
if(cd.type & TYPE_TOKEN) if(cd.type & TYPE_TOKEN)
continue; continue;
if(deck.side.size() < YGOPRO_MAX_SIDE) if(deck.side.size() < SIDE_MAX_SIZE)
deck.side.push_back(dataManager.GetCodePointer(code)); deck.side.push_back(dataManager.GetCodePointer(code));
} }
return errorcode; return errorcode;
...@@ -252,6 +252,8 @@ bool DeckManager::LoadDeck(irr::gui::IGUIComboBox* cbCategory, irr::gui::IGUICom ...@@ -252,6 +252,8 @@ bool DeckManager::LoadDeck(irr::gui::IGUIComboBox* cbCategory, irr::gui::IGUICom
bool res = LoadDeck(filepath, is_packlist); bool res = LoadDeck(filepath, is_packlist);
if(res && mainGame->is_building) if(res && mainGame->is_building)
mainGame->deckBuilder.RefreshPackListScroll(); mainGame->deckBuilder.RefreshPackListScroll();
if (!res)
current_deck.clear();
return res; return res;
} }
FILE* DeckManager::OpenDeckFile(const wchar_t* file, const char* mode) { FILE* DeckManager::OpenDeckFile(const wchar_t* file, const char* mode) {
...@@ -290,8 +292,8 @@ bool DeckManager::LoadDeck(const wchar_t* file, bool is_packlist) { ...@@ -290,8 +292,8 @@ bool DeckManager::LoadDeck(const wchar_t* file, bool is_packlist) {
} }
if(!reader) if(!reader)
return false; return false;
size_t size = reader->getSize(); auto size = reader->getSize();
if(size >= 0x20000) { if(size >= (int)sizeof deckBuffer) {
reader->drop(); reader->drop();
return false; return false;
} }
...@@ -306,7 +308,7 @@ bool DeckManager::LoadDeck(std::istringstream* deckStream, bool is_packlist) { ...@@ -306,7 +308,7 @@ bool DeckManager::LoadDeck(std::istringstream* deckStream, bool is_packlist) {
int cardlist[300]; int cardlist[300];
bool is_side = false; bool is_side = false;
std::string linebuf; std::string linebuf;
while(std::getline(*deckStream, linebuf) && ct < 300) { while(std::getline(*deckStream, linebuf, '\n') && ct < 300) {
if(linebuf[0] == '!') { if(linebuf[0] == '!') {
is_side = true; is_side = true;
continue; continue;
......
...@@ -19,8 +19,6 @@ unsigned char DuelClient::selftype = 0; ...@@ -19,8 +19,6 @@ unsigned char DuelClient::selftype = 0;
bool DuelClient::is_host = false; bool DuelClient::is_host = false;
event_base* DuelClient::client_base = 0; event_base* DuelClient::client_base = 0;
bufferevent* DuelClient::client_bev = 0; bufferevent* DuelClient::client_bev = 0;
unsigned char DuelClient::duel_client_read[SIZE_NETWORK_BUFFER];
int DuelClient::read_len = 0;
unsigned char DuelClient::duel_client_write[SIZE_NETWORK_BUFFER]; unsigned char DuelClient::duel_client_write[SIZE_NETWORK_BUFFER];
bool DuelClient::is_closing = false; bool DuelClient::is_closing = false;
bool DuelClient::is_swapping = false; bool DuelClient::is_swapping = false;
...@@ -50,6 +48,7 @@ bool DuelClient::StartClient(unsigned int ip, unsigned short port, bool create_g ...@@ -50,6 +48,7 @@ bool DuelClient::StartClient(unsigned int ip, unsigned short port, bool create_g
sin.sin_addr.s_addr = htonl(ip); sin.sin_addr.s_addr = htonl(ip);
sin.sin_port = htons(port); sin.sin_port = htons(port);
client_bev = bufferevent_socket_new(client_base, -1, BEV_OPT_CLOSE_ON_FREE); client_bev = bufferevent_socket_new(client_base, -1, BEV_OPT_CLOSE_ON_FREE);
bufferevent_setwatermark(client_bev, EV_READ, 3, 0);
bufferevent_setcb(client_bev, ClientRead, NULL, ClientEvent, (void*)create_game); bufferevent_setcb(client_bev, ClientRead, NULL, ClientEvent, (void*)create_game);
if (bufferevent_socket_connect(client_bev, (sockaddr*)&sin, sizeof(sin)) < 0) { if (bufferevent_socket_connect(client_bev, (sockaddr*)&sin, sizeof(sin)) < 0) {
bufferevent_free(client_bev); bufferevent_free(client_bev);
...@@ -100,24 +99,23 @@ void DuelClient::StopClient(bool is_exiting) { ...@@ -100,24 +99,23 @@ void DuelClient::StopClient(bool is_exiting) {
void DuelClient::ClientRead(bufferevent* bev, void* ctx) { void DuelClient::ClientRead(bufferevent* bev, void* ctx) {
evbuffer* input = bufferevent_get_input(bev); evbuffer* input = bufferevent_get_input(bev);
int len = evbuffer_get_length(input); int len = evbuffer_get_length(input);
unsigned short packet_len = 0; unsigned char* duel_client_read = new unsigned char[std::min(len, SIZE_NETWORK_BUFFER)];
while(true) { unsigned short packet_len;
if(len < 2) while (len >= 2) {
return; evbuffer_copyout(input, &packet_len, sizeof packet_len);
evbuffer_copyout(input, &packet_len, 2);
if (packet_len + 2 > SIZE_NETWORK_BUFFER) { if (packet_len + 2 > SIZE_NETWORK_BUFFER) {
delete[] duel_client_read;
ClientEvent(bev, BEV_EVENT_ERROR, 0); ClientEvent(bev, BEV_EVENT_ERROR, 0);
return; return;
} }
if(len < packet_len + 2) if (len < packet_len + 2)
return; break;
if (packet_len < 1) int read_len = evbuffer_remove(input, duel_client_read, packet_len + 2);
return;
read_len = evbuffer_remove(input, duel_client_read, packet_len + 2);
if (read_len >= 3) if (read_len >= 3)
HandleSTOCPacketLan(&duel_client_read[2], read_len - 2); HandleSTOCPacketLan(&duel_client_read[2], read_len - 2);
len -= packet_len + 2; len -= packet_len + 2;
} }
delete[] duel_client_read;
} }
void DuelClient::ClientEvent(bufferevent *bev, short events, void *ctx) { void DuelClient::ClientEvent(bufferevent *bev, short events, void *ctx) {
if (events & BEV_EVENT_CONNECTED) { if (events & BEV_EVENT_CONNECTED) {
...@@ -823,10 +821,11 @@ void DuelClient::HandleSTOCPacketLan(unsigned char* data, int len) { ...@@ -823,10 +821,11 @@ void DuelClient::HandleSTOCPacketLan(unsigned char* data, int len) {
soundManager.PlaySoundEffect(SOUND_PLAYER_ENTER); soundManager.PlaySoundEffect(SOUND_PLAYER_ENTER);
STOC_HS_PlayerEnter packet; STOC_HS_PlayerEnter packet;
std::memcpy(&packet, pdata, STOC_HS_PlayerEnter_size); std::memcpy(&packet, pdata, STOC_HS_PlayerEnter_size);
const auto* pkt = &packet; auto pkt = &packet;
if(pkt->pos > 3) if(pkt->pos > 3)
break; break;
wchar_t name[20]; wchar_t name[20];
BufferIO::NullTerminate(pkt->name);
BufferIO::CopyWStr(pkt->name, name, 20); BufferIO::CopyWStr(pkt->name, name, 20);
if(mainGame->dInfo.isTag) { if(mainGame->dInfo.isTag) {
if(pkt->pos == 0) if(pkt->pos == 0)
...@@ -1515,7 +1514,7 @@ int DuelClient::ClientAnalyze(unsigned char* msg, unsigned int len) { ...@@ -1515,7 +1514,7 @@ int DuelClient::ClientAnalyze(unsigned char* msg, unsigned int len) {
wchar_t ynbuf[256]; wchar_t ynbuf[256];
myswprintf(ynbuf, dataManager.GetSysString(221), dataManager.FormatLocation(l, s), dataManager.GetName(code)); myswprintf(ynbuf, dataManager.GetSysString(221), dataManager.FormatLocation(l, s), dataManager.GetName(code));
myswprintf(textBuffer, L"%ls\n%ls\n%ls", event_string, ynbuf, dataManager.GetSysString(223)); myswprintf(textBuffer, L"%ls\n%ls\n%ls", event_string, ynbuf, dataManager.GetSysString(223));
} else if(desc < 2048) { } else if(desc <= MAX_STRING_ID) {
myswprintf(textBuffer, dataManager.GetSysString(desc), dataManager.GetName(code)); myswprintf(textBuffer, dataManager.GetSysString(desc), dataManager.GetName(code));
} else { } else {
myswprintf(textBuffer, dataManager.GetDesc(desc), dataManager.GetName(code)); myswprintf(textBuffer, dataManager.GetDesc(desc), dataManager.GetName(code));
......
...@@ -21,8 +21,6 @@ private: ...@@ -21,8 +21,6 @@ private:
static bool is_host; static bool is_host;
static event_base* client_base; static event_base* client_base;
static bufferevent* client_bev; static bufferevent* client_bev;
static unsigned char duel_client_read[SIZE_NETWORK_BUFFER];
static int read_len;
static unsigned char duel_client_write[SIZE_NETWORK_BUFFER]; static unsigned char duel_client_write[SIZE_NETWORK_BUFFER];
static bool is_closing; static bool is_closing;
static bool is_swapping; static bool is_swapping;
...@@ -56,13 +54,12 @@ public: ...@@ -56,13 +54,12 @@ public:
template<typename ST> template<typename ST>
static void SendPacketToServer(unsigned char proto, ST& st) { static void SendPacketToServer(unsigned char proto, ST& st) {
auto p = duel_client_write; auto p = duel_client_write;
int blen = sizeof(ST); if ((int)sizeof(ST) > MAX_DATA_SIZE)
if (blen > MAX_DATA_SIZE)
return; return;
BufferIO::WriteInt16(p, (short)(1 + blen)); BufferIO::WriteInt16(p, (short)(1 + sizeof(ST)));
BufferIO::WriteInt8(p, proto); BufferIO::WriteInt8(p, proto);
std::memcpy(p, &st, blen); std::memcpy(p, &st, sizeof(ST));
bufferevent_write(client_bev, duel_client_write, blen + 3); bufferevent_write(client_bev, duel_client_write, sizeof(ST) + 3);
} }
static void SendBufferToServer(unsigned char proto, void* buffer, size_t len) { static void SendBufferToServer(unsigned char proto, void* buffer, size_t len) {
auto p = duel_client_write; auto p = duel_client_write;
......
...@@ -2,6 +2,7 @@ ...@@ -2,6 +2,7 @@
#include "game.h" #include "game.h"
#include "data_manager.h" #include "data_manager.h"
#include <event2/thread.h> #include <event2/thread.h>
#include <locale.h>
#include <memory> #include <memory>
#ifdef __APPLE__ #ifdef __APPLE__
#import <CoreFoundation/CoreFoundation.h> #import <CoreFoundation/CoreFoundation.h>
......
...@@ -9,8 +9,6 @@ event_base* NetServer::net_evbase = 0; ...@@ -9,8 +9,6 @@ event_base* NetServer::net_evbase = 0;
event* NetServer::broadcast_ev = 0; event* NetServer::broadcast_ev = 0;
evconnlistener* NetServer::listener = 0; evconnlistener* NetServer::listener = 0;
DuelMode* NetServer::duel_mode = 0; DuelMode* NetServer::duel_mode = 0;
unsigned char NetServer::net_server_read[SIZE_NETWORK_BUFFER];
int NetServer::read_len = 0;
unsigned char NetServer::net_server_write[SIZE_NETWORK_BUFFER]; unsigned char NetServer::net_server_write[SIZE_NETWORK_BUFFER];
unsigned short NetServer::last_sent = 0; unsigned short NetServer::last_sent = 0;
...@@ -192,6 +190,7 @@ void NetServer::ServerAccept(evconnlistener* listener, evutil_socket_t fd, socka ...@@ -192,6 +190,7 @@ void NetServer::ServerAccept(evconnlistener* listener, evutil_socket_t fd, socka
dp.type = 0xff; dp.type = 0xff;
dp.bev = bev; dp.bev = bev;
users[bev] = dp; users[bev] = dp;
bufferevent_setwatermark(bev, EV_READ, 3, 0);
bufferevent_setcb(bev, ServerEchoRead, NULL, ServerEchoEvent, NULL); bufferevent_setcb(bev, ServerEchoRead, NULL, ServerEchoEvent, NULL);
bufferevent_enable(bev, EV_READ); bufferevent_enable(bev, EV_READ);
} }
...@@ -206,24 +205,23 @@ void NetServer::ServerAcceptError(evconnlistener* listener, void* ctx) { ...@@ -206,24 +205,23 @@ void NetServer::ServerAcceptError(evconnlistener* listener, void* ctx) {
void NetServer::ServerEchoRead(bufferevent *bev, void *ctx) { void NetServer::ServerEchoRead(bufferevent *bev, void *ctx) {
evbuffer* input = bufferevent_get_input(bev); evbuffer* input = bufferevent_get_input(bev);
int len = evbuffer_get_length(input); int len = evbuffer_get_length(input);
unsigned short packet_len = 0; unsigned char* net_server_read = new unsigned char[std::min(len, SIZE_NETWORK_BUFFER)];
while(true) { unsigned short packet_len;
if(len < 2) while (len >= 2) {
return; evbuffer_copyout(input, &packet_len, sizeof packet_len);
evbuffer_copyout(input, &packet_len, 2);
if (packet_len + 2 > SIZE_NETWORK_BUFFER) { if (packet_len + 2 > SIZE_NETWORK_BUFFER) {
delete[] net_server_read;
ServerEchoEvent(bev, BEV_EVENT_ERROR, 0); ServerEchoEvent(bev, BEV_EVENT_ERROR, 0);
return; return;
} }
if (len < packet_len + 2) if (len < packet_len + 2)
return; break;
if (packet_len < 1) int read_len = evbuffer_remove(input, net_server_read, packet_len + 2);
return;
read_len = evbuffer_remove(input, net_server_read, packet_len + 2);
if (read_len >= 3) if (read_len >= 3)
HandleCTOSPacket(&users[bev], &net_server_read[2], read_len - 2); HandleCTOSPacket(&users[bev], &net_server_read[2], read_len - 2);
len -= packet_len + 2; len -= packet_len + 2;
} }
delete[] net_server_read;
} }
void NetServer::ServerEchoEvent(bufferevent* bev, short events, void* ctx) { void NetServer::ServerEchoEvent(bufferevent* bev, short events, void* ctx) {
if (events & (BEV_EVENT_EOF | BEV_EVENT_ERROR)) { if (events & (BEV_EVENT_EOF | BEV_EVENT_ERROR)) {
...@@ -336,7 +334,8 @@ void NetServer::HandleCTOSPacket(DuelPlayer* dp, unsigned char* data, int len) { ...@@ -336,7 +334,8 @@ void NetServer::HandleCTOSPacket(DuelPlayer* dp, unsigned char* data, int len) {
return; return;
CTOS_PlayerInfo packet; CTOS_PlayerInfo packet;
std::memcpy(&packet, pdata, sizeof packet); std::memcpy(&packet, pdata, sizeof packet);
const auto* pkt = &packet; auto pkt = &packet;
BufferIO::NullTerminate(pkt->name);
BufferIO::CopyWStr(pkt->name, dp->name, 20); BufferIO::CopyWStr(pkt->name, dp->name, 20);
break; break;
} }
...@@ -358,10 +357,10 @@ void NetServer::HandleCTOSPacket(DuelPlayer* dp, unsigned char* data, int len) { ...@@ -358,10 +357,10 @@ void NetServer::HandleCTOSPacket(DuelPlayer* dp, unsigned char* data, int len) {
duel_mode = new TagDuel(); duel_mode = new TagDuel();
duel_mode->etimer = event_new(net_evbase, 0, EV_TIMEOUT | EV_PERSIST, TagDuel::TagTimer, duel_mode); duel_mode->etimer = event_new(net_evbase, 0, EV_TIMEOUT | EV_PERSIST, TagDuel::TagTimer, duel_mode);
} }
if(pkt->info.rule > 5) if(pkt->info.rule > CURRENT_RULE)
pkt->info.rule = 5; pkt->info.rule = CURRENT_RULE;
if(pkt->info.mode > 2) if(pkt->info.mode > MODE_TAG)
pkt->info.mode = 0; pkt->info.mode = MODE_SINGLE;
unsigned int hash = 1; unsigned int hash = 1;
for(auto lfit = deckManager._lfList.begin(); lfit != deckManager._lfList.end(); ++lfit) { for(auto lfit = deckManager._lfList.begin(); lfit != deckManager._lfList.end(); ++lfit) {
if(pkt->info.lflist == lfit->hash) { if(pkt->info.lflist == lfit->hash) {
...@@ -371,8 +370,9 @@ void NetServer::HandleCTOSPacket(DuelPlayer* dp, unsigned char* data, int len) { ...@@ -371,8 +370,9 @@ void NetServer::HandleCTOSPacket(DuelPlayer* dp, unsigned char* data, int len) {
} }
if(hash == 1) if(hash == 1)
pkt->info.lflist = deckManager._lfList[0].hash; pkt->info.lflist = deckManager._lfList[0].hash;
std::memcpy(pdata, &packet, sizeof packet);
duel_mode->host_info = pkt->info; duel_mode->host_info = pkt->info;
BufferIO::NullTerminate(pkt->name);
BufferIO::NullTerminate(pkt->pass);
BufferIO::CopyWStr(pkt->name, duel_mode->name, 20); BufferIO::CopyWStr(pkt->name, duel_mode->name, 20);
BufferIO::CopyWStr(pkt->pass, duel_mode->pass, 20); BufferIO::CopyWStr(pkt->pass, duel_mode->pass, 20);
duel_mode->JoinGame(dp, 0, true); duel_mode->JoinGame(dp, 0, true);
......
...@@ -20,8 +20,6 @@ private: ...@@ -20,8 +20,6 @@ private:
static event* broadcast_ev; static event* broadcast_ev;
static evconnlistener* listener; static evconnlistener* listener;
static DuelMode* duel_mode; static DuelMode* duel_mode;
static unsigned char net_server_read[SIZE_NETWORK_BUFFER];
static int read_len;
static unsigned char net_server_write[SIZE_NETWORK_BUFFER]; static unsigned char net_server_write[SIZE_NETWORK_BUFFER];
static unsigned short last_sent; static unsigned short last_sent;
...@@ -59,15 +57,14 @@ public: ...@@ -59,15 +57,14 @@ public:
template<typename ST> template<typename ST>
static void SendPacketToPlayer(DuelPlayer* dp, unsigned char proto, ST& st) { static void SendPacketToPlayer(DuelPlayer* dp, unsigned char proto, ST& st) {
auto p = net_server_write; auto p = net_server_write;
int blen = sizeof(ST); if ((int)sizeof(ST) > MAX_DATA_SIZE)
if (blen > MAX_DATA_SIZE)
return; return;
BufferIO::WriteInt16(p, (short)(1 + blen)); BufferIO::WriteInt16(p, (short)(1 + sizeof(ST)));
BufferIO::WriteInt8(p, proto); BufferIO::WriteInt8(p, proto);
std::memcpy(p, &st, blen); std::memcpy(p, &st, sizeof(ST));
last_sent = blen + 3; last_sent = sizeof(ST) + 3;
if (dp) if (dp)
bufferevent_write(dp->bev, net_server_write, blen + 3); bufferevent_write(dp->bev, net_server_write, sizeof(ST) + 3);
} }
static void SendBufferToPlayer(DuelPlayer* dp, unsigned char proto, void* buffer, size_t len) { static void SendBufferToPlayer(DuelPlayer* dp, unsigned char proto, void* buffer, size_t len) {
auto p = net_server_write; auto p = net_server_write;
......
...@@ -50,7 +50,7 @@ void SingleDuel::JoinGame(DuelPlayer* dp, unsigned char* pdata, bool is_creater) ...@@ -50,7 +50,7 @@ void SingleDuel::JoinGame(DuelPlayer* dp, unsigned char* pdata, bool is_creater)
} }
CTOS_JoinGame packet; CTOS_JoinGame packet;
std::memcpy(&packet, pdata, sizeof packet); std::memcpy(&packet, pdata, sizeof packet);
const auto* pkt = &packet; auto pkt = &packet;
if(pkt->version != PRO_VERSION) { if(pkt->version != PRO_VERSION) {
STOC_ErrorMsg scem; STOC_ErrorMsg scem;
scem.msg = ERRMSG_VERERROR; scem.msg = ERRMSG_VERERROR;
...@@ -60,6 +60,7 @@ void SingleDuel::JoinGame(DuelPlayer* dp, unsigned char* pdata, bool is_creater) ...@@ -60,6 +60,7 @@ void SingleDuel::JoinGame(DuelPlayer* dp, unsigned char* pdata, bool is_creater)
return; return;
} }
wchar_t jpass[20]; wchar_t jpass[20];
BufferIO::NullTerminate(pkt->pass);
BufferIO::CopyWStr(pkt->pass, jpass, 20); BufferIO::CopyWStr(pkt->pass, jpass, 20);
#ifdef YGOPRO_SERVER_MODE #ifdef YGOPRO_SERVER_MODE
if(!wcscmp(jpass, L"the Big Brother") && !cache_recorder) { if(!wcscmp(jpass, L"the Big Brother") && !cache_recorder) {
...@@ -1785,7 +1786,7 @@ int SingleDuel::Analyze(unsigned char* msgbuffer, unsigned int len) { ...@@ -1785,7 +1786,7 @@ int SingleDuel::Analyze(unsigned char* msgbuffer, unsigned int len) {
return 0; return 0;
} }
void SingleDuel::GetResponse(DuelPlayer* dp, unsigned char* pdata, unsigned int len) { void SingleDuel::GetResponse(DuelPlayer* dp, unsigned char* pdata, unsigned int len) {
byte resb[SIZE_RETURN_VALUE]; byte resb[SIZE_RETURN_VALUE]{};
if (len > SIZE_RETURN_VALUE) if (len > SIZE_RETURN_VALUE)
len = SIZE_RETURN_VALUE; len = SIZE_RETURN_VALUE;
std::memcpy(resb, pdata, len); std::memcpy(resb, pdata, len);
......
...@@ -54,7 +54,7 @@ void TagDuel::JoinGame(DuelPlayer* dp, unsigned char* pdata, bool is_creater) { ...@@ -54,7 +54,7 @@ void TagDuel::JoinGame(DuelPlayer* dp, unsigned char* pdata, bool is_creater) {
} }
CTOS_JoinGame packet; CTOS_JoinGame packet;
std::memcpy(&packet, pdata, sizeof packet); std::memcpy(&packet, pdata, sizeof packet);
const auto* pkt = &packet; auto pkt = &packet;
if(pkt->version != PRO_VERSION) { if(pkt->version != PRO_VERSION) {
STOC_ErrorMsg scem; STOC_ErrorMsg scem;
scem.msg = ERRMSG_VERERROR; scem.msg = ERRMSG_VERERROR;
...@@ -64,6 +64,7 @@ void TagDuel::JoinGame(DuelPlayer* dp, unsigned char* pdata, bool is_creater) { ...@@ -64,6 +64,7 @@ void TagDuel::JoinGame(DuelPlayer* dp, unsigned char* pdata, bool is_creater) {
return; return;
} }
wchar_t jpass[20]; wchar_t jpass[20];
BufferIO::NullTerminate(pkt->pass);
BufferIO::CopyWStr(pkt->pass, jpass, 20); BufferIO::CopyWStr(pkt->pass, jpass, 20);
#ifdef YGOPRO_SERVER_MODE #ifdef YGOPRO_SERVER_MODE
if(!wcscmp(jpass, L"the Big Brother") && !cache_recorder) { if(!wcscmp(jpass, L"the Big Brother") && !cache_recorder) {
...@@ -1888,7 +1889,7 @@ int TagDuel::Analyze(unsigned char* msgbuffer, unsigned int len) { ...@@ -1888,7 +1889,7 @@ int TagDuel::Analyze(unsigned char* msgbuffer, unsigned int len) {
return 0; return 0;
} }
void TagDuel::GetResponse(DuelPlayer* dp, unsigned char* pdata, unsigned int len) { void TagDuel::GetResponse(DuelPlayer* dp, unsigned char* pdata, unsigned int len) {
byte resb[SIZE_RETURN_VALUE]; byte resb[SIZE_RETURN_VALUE]{};
if (len > SIZE_RETURN_VALUE) if (len > SIZE_RETURN_VALUE)
len = SIZE_RETURN_VALUE; len = SIZE_RETURN_VALUE;
std::memcpy(resb, pdata, len); std::memcpy(resb, pdata, len);
......
This diff is collapsed.
...@@ -1222,3 +1222,5 @@ ...@@ -1222,3 +1222,5 @@
!setname 0x1b1 白森林 白き森 !setname 0x1b1 白森林 白き森
!setname 0x1b2 欢聚友伴 マルチャミー !setname 0x1b2 欢聚友伴 マルチャミー
!setname 0x1b3 徽记 エンブレーマ !setname 0x1b3 徽记 エンブレーマ
!setname 0x1b4 时空 タキオン
!setname 0x1b5 蓝泪 青い涙
#config file #config file
#nickname & gamename should be less than 20 characters #nickname & gamename should be less than 20 characters
use_d3d = 0 use_d3d = 0
use_image_scale = 1 use_image_scale = 1
antialias = 2 antialias = 2
errorlog = 3 errorlog = 3
nickname = Player nickname = Player
gamename = Game gamename = Game
lastcategory = 未分类卡组 lastcategory = 未分类卡组
lastdeck = new lastdeck = new
textfont = ./fonts/textFont.ttf 14 textfont = ./fonts/textFont.ttf 14
numfont = ./fonts/numFont.ttf numfont = ./fonts/numFont.ttf
serverport = 7911 serverport = 7911
lasthost = 127.0.0.1 lasthost = 127.0.0.1
lastport = 7911 lastport = 7911
automonsterpos = 0 automonsterpos = 0
autospellpos = 0 autospellpos = 0
randompos = 0 randompos = 0
autochain = 0 autochain = 0
waitchain = 0 waitchain = 0
showchain = 0 showchain = 0
mute_opponent = 0 mute_opponent = 0
mute_spectators = 0 mute_spectators = 0
use_lflist = 1 use_lflist = 1
default_lflist = 0 default_lflist = 0
default_rule = 0 default_rule = 0
hide_setname = 0 hide_setname = 0
hide_hint_button = 0 hide_hint_button = 0
#control_mode = 0: Key A/S/D/R Chain Buttons. control_mode = 1: MouseLeft/MouseRight/NULL/F9 Without Chain Buttons #control_mode = 0: Key A/S/D/R Chain Buttons. control_mode = 1: MouseLeft/MouseRight/NULL/F9 Without Chain Buttons
control_mode = 0 control_mode = 0
draw_field_spell = 1 draw_field_spell = 1
separate_clear_button = 1 separate_clear_button = 1
#auto_search_limit >= 0: Start search automatically when the user enters N chars #auto_search_limit >= 0: Start search automatically when the user enters N chars
auto_search_limit = -1 auto_search_limit = -1
#search_multiple_keywords = 0: Disable. 1: Search mutiple keywords with separator " ". 2: with separator "+" #search_multiple_keywords = 0: Disable. 1: Search mutiple keywords with separator " ". 2: with separator "+"
search_multiple_keywords = 1 search_multiple_keywords = 1
ignore_deck_changes = 0 ignore_deck_changes = 0
default_ot = 1 default_ot = 1
enable_bot_mode = 0 enable_bot_mode = 0
bot_deck_path = ./botdeck bot_deck_path = ./botdeck
quick_animation = 0 quick_animation = 0
auto_save_replay = 0 auto_save_replay = 0
draw_single_chain = 0 draw_single_chain = 0
hide_player_name = 0 hide_player_name = 0
prefer_expansion_script = 0 prefer_expansion_script = 0
window_maximized = 0 window_maximized = 0
window_width = 1280 window_width = 1280
window_height = 800 window_height = 800
resize_popup_menu = 0 resize_popup_menu = 0
enable_sound = 1 enable_sound = 1
enable_music = 1 enable_music = 1
#Volume of sound and music, between 0 and 100 #Volume of sound and music, between 0 and 100
sound_volume = 50 sound_volume = 50
music_volume = 50 music_volume = 50
music_mode = 1 music_mode = 1
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