Commit fa14238e authored by argon.sun's avatar argon.sun

host finding done.

parent 2007e1b6
...@@ -24,7 +24,8 @@ wchar_t DuelClient::event_string[256]; ...@@ -24,7 +24,8 @@ wchar_t DuelClient::event_string[256];
mtrandom DuelClient::rnd; mtrandom DuelClient::rnd;
bool DuelClient::is_refreshing = false; bool DuelClient::is_refreshing = false;
std::vector<HostInfo> DuelClient::hosts; std::vector<HostPacket> DuelClient::hosts;
std::set<int> DuelClient::remotes;
event* DuelClient::resp_event = 0; event* DuelClient::resp_event = 0;
bool DuelClient::StartClient(unsigned int ip, unsigned short port, bool create_game) { bool DuelClient::StartClient(unsigned int ip, unsigned short port, bool create_game) {
...@@ -2283,8 +2284,8 @@ void DuelClient::BeginRefreshHost() { ...@@ -2283,8 +2284,8 @@ void DuelClient::BeginRefreshHost() {
if(is_refreshing) if(is_refreshing)
return; return;
is_refreshing = true; is_refreshing = true;
mainGame->gMutex.Lock();
mainGame->lstHostList->clear(); mainGame->lstHostList->clear();
remotes.clear();
hosts.clear(); hosts.clear();
event_base* broadev = event_base_new(); event_base* broadev = event_base_new();
char hname[256]; char hname[256];
...@@ -2292,7 +2293,7 @@ void DuelClient::BeginRefreshHost() { ...@@ -2292,7 +2293,7 @@ void DuelClient::BeginRefreshHost() {
hostent* host = gethostbyname(hname); hostent* host = gethostbyname(hname);
if(!host) if(!host)
return; return;
SOCKET reply = socket(AF_INET, SOCK_DGRAM, 0); SOCKET reply = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
sockaddr_in reply_addr; sockaddr_in reply_addr;
memset(&reply_addr, 0, sizeof(reply_addr)); memset(&reply_addr, 0, sizeof(reply_addr));
reply_addr.sin_family = AF_INET; reply_addr.sin_family = AF_INET;
...@@ -2305,6 +2306,7 @@ void DuelClient::BeginRefreshHost() { ...@@ -2305,6 +2306,7 @@ void DuelClient::BeginRefreshHost() {
timeval timeout = {5, 0}; timeval timeout = {5, 0};
resp_event = event_new(broadev, reply, EV_TIMEOUT | EV_READ | EV_PERSIST, BroadcastReply, broadev); resp_event = event_new(broadev, reply, EV_TIMEOUT | EV_READ | EV_PERSIST, BroadcastReply, broadev);
event_add(resp_event, &timeout); event_add(resp_event, &timeout);
Thread::NewThread(RefreshThread, broadev);
//send request //send request
SOCKADDR_IN local; SOCKADDR_IN local;
local.sin_family = AF_INET; local.sin_family = AF_INET;
...@@ -2332,7 +2334,6 @@ void DuelClient::BeginRefreshHost() { ...@@ -2332,7 +2334,6 @@ void DuelClient::BeginRefreshHost() {
sendto(sSend, (const char*)&hReq, sizeof(HostRequest), 0, (sockaddr*)&sockTo, sizeof(sockaddr)); sendto(sSend, (const char*)&hReq, sizeof(HostRequest), 0, (sockaddr*)&sockTo, sizeof(sockaddr));
closesocket(sSend); closesocket(sSend);
} }
Thread::NewThread(RefreshThread, broadev);
} }
int DuelClient::RefreshThread(void* arg) { int DuelClient::RefreshThread(void* arg) {
event_base* broadev = (event_base*)arg; event_base* broadev = (event_base*)arg;
...@@ -2352,9 +2353,30 @@ void DuelClient::BroadcastReply(evutil_socket_t fd, short events, void* arg) { ...@@ -2352,9 +2353,30 @@ void DuelClient::BroadcastReply(evutil_socket_t fd, short events, void* arg) {
int sz = sizeof(sockaddr_in); int sz = sizeof(sockaddr_in);
char buf[256]; char buf[256];
int ret = recvfrom(fd, buf, 256, 0, (sockaddr*)&bc_addr, &sz); int ret = recvfrom(fd, buf, 256, 0, (sockaddr*)&bc_addr, &sz);
int ipaddr = bc_addr.sin_addr.s_addr;
HostPacket* pHP = (HostPacket*)buf; HostPacket* pHP = (HostPacket*)buf;
if(pHP->identifier == NETWORK_SERVER_ID && pHP->version == PRO_VERSION) { if(pHP->identifier == NETWORK_SERVER_ID && pHP->version == PRO_VERSION && remotes.find(ipaddr) == remotes.end() ) {
mainGame->gMutex.Lock(); mainGame->gMutex.Lock();
remotes.insert(ipaddr);
pHP->ipaddr = ipaddr;
hosts.push_back(*pHP);
std::wstring hoststr;
hoststr.append(L"[");
hoststr.append(deckManager.GetLFListName(pHP->host.lflist));
hoststr.append(L"][");
hoststr.append(dataManager.GetSysString(pHP->host.rule + 1240));
hoststr.append(L"][");
hoststr.append(dataManager.GetSysString(pHP->host.mode + 1244));
hoststr.append(L"][");
if(pHP->host.draw_count == 1 && pHP->host.start_hand == 5 && pHP->host.start_lp == 8000
&& !pHP->host.no_check_deck && !pHP->host.no_shuffle_deck && ! pHP->host.enable_priority)
hoststr.append(dataManager.GetSysString(1280));
else hoststr.append(dataManager.GetSysString(1281));
hoststr.append(L"]");
wchar_t gamename[20];
BufferIO::CopyWStr(pHP->name, gamename, 20);
hoststr.append(gamename);
mainGame->lstHostList->addItem(hoststr.c_str());
mainGame->gMutex.Unlock(); mainGame->gMutex.Unlock();
} }
} }
......
...@@ -3,6 +3,7 @@ ...@@ -3,6 +3,7 @@
#include "config.h" #include "config.h"
#include <vector> #include <vector>
#include <set>
#include <event2/event.h> #include <event2/event.h>
#include <event2/listener.h> #include <event2/listener.h>
#include <event2/bufferevent.h> #include <event2/bufferevent.h>
...@@ -67,8 +68,9 @@ public: ...@@ -67,8 +68,9 @@ public:
protected: protected:
static bool is_refreshing; static bool is_refreshing;
static event* resp_event; static event* resp_event;
static std::set<int> remotes;
public: public:
static std::vector<HostInfo> hosts; static std::vector<HostPacket> hosts;
static void BeginRefreshHost(); static void BeginRefreshHost();
static int RefreshThread(void* arg); static int RefreshThread(void* arg);
static void BroadcastReply(evutil_socket_t fd, short events, void* arg); static void BroadcastReply(evutil_socket_t fd, short events, void* arg);
......
...@@ -52,6 +52,7 @@ bool MenuHandler::OnEvent(const irr::SEvent& event) { ...@@ -52,6 +52,7 @@ bool MenuHandler::OnEvent(const irr::SEvent& event) {
break; break;
} }
case BUTTON_LAN_REFRESH: { case BUTTON_LAN_REFRESH: {
DuelClient::BeginRefreshHost();
break; break;
} }
case BUTTON_CREATE_HOST: { case BUTTON_CREATE_HOST: {
...@@ -187,6 +188,19 @@ bool MenuHandler::OnEvent(const irr::SEvent& event) { ...@@ -187,6 +188,19 @@ bool MenuHandler::OnEvent(const irr::SEvent& event) {
} }
case irr::gui::EGET_LISTBOX_CHANGED: { case irr::gui::EGET_LISTBOX_CHANGED: {
switch(id) { switch(id) {
case LISTBOX_LAN_HOST: {
int sel = mainGame->lstHostList->getSelected();
if(sel == -1)
break;
int addr = DuelClient::hosts[sel].ipaddr;
int port = DuelClient::hosts[sel].port;
wchar_t buf[20];
myswprintf(buf, L"%d.%d.%d.%d", addr & 0xff, (addr >> 8) & 0xff, (addr >> 16) & 0xff, (addr >> 24) & 0xff);
mainGame->ebJoinIP->setText(buf);
myswprintf(buf, L"%d", port);
mainGame->ebJoinPort->setText(buf);
break;
}
case LISTBOX_REPLAY_LIST: { case LISTBOX_REPLAY_LIST: {
break; break;
} }
......
...@@ -38,7 +38,7 @@ bool NetServer::StartServer(unsigned short port) { ...@@ -38,7 +38,7 @@ bool NetServer::StartServer(unsigned short port) {
bool NetServer::StartBroadcast() { bool NetServer::StartBroadcast() {
if(!net_evbase) if(!net_evbase)
return false; return false;
SOCKET udp = socket(AF_INET, SOCK_DGRAM, 0); SOCKET udp = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
BOOL opt = TRUE; BOOL opt = TRUE;
setsockopt(udp, SOL_SOCKET, SO_BROADCAST, (const char*)&opt, sizeof(BOOL)); setsockopt(udp, SOL_SOCKET, SO_BROADCAST, (const char*)&opt, sizeof(BOOL));
sockaddr_in addr; sockaddr_in addr;
...@@ -77,14 +77,21 @@ void NetServer::BroadcastEvent(evutil_socket_t fd, short events, void* arg) { ...@@ -77,14 +77,21 @@ void NetServer::BroadcastEvent(evutil_socket_t fd, short events, void* arg) {
int sz = sizeof(sockaddr_in); int sz = sizeof(sockaddr_in);
char buf[256]; char buf[256];
int ret = recvfrom(fd, buf, 256, 0, (sockaddr*)&bc_addr, &sz); int ret = recvfrom(fd, buf, 256, 0, (sockaddr*)&bc_addr, &sz);
if(ret == -1)
return;
HostRequest* pHR = (HostRequest*)buf; HostRequest* pHR = (HostRequest*)buf;
if(pHR->identifier == NETWORK_CLIENT_ID) { if(pHR->identifier == NETWORK_CLIENT_ID) {
SOCKADDR_IN sockTo;
sockTo.sin_addr.s_addr = bc_addr.sin_addr.s_addr;
sockTo.sin_family = AF_INET;
sockTo.sin_port = htons(7921);
HostPacket hp; HostPacket hp;
hp.identifier = NETWORK_SERVER_ID; hp.identifier = NETWORK_SERVER_ID;
hp.port = server_port; hp.port = server_port;
hp.version = PRO_VERSION; hp.version = PRO_VERSION;
hp.host = duel_mode->host_info; hp.host = duel_mode->host_info;
sendto(fd, (const char*)&hp, sizeof(HostPacket), 0, (sockaddr*)&bc_addr, sizeof(bc_addr)); BufferIO::CopyWStr(duel_mode->name, hp.name, 20);
sendto(fd, (const char*)&hp, sizeof(HostPacket), 0, (sockaddr*)&sockTo, sizeof(sockTo));
} }
} }
void NetServer::ServerAccept(evconnlistener* listener, evutil_socket_t fd, sockaddr* address, int socklen, void* ctx) { void NetServer::ServerAccept(evconnlistener* listener, evutil_socket_t fd, sockaddr* address, int socklen, void* ctx) {
......
...@@ -26,6 +26,8 @@ struct HostPacket { ...@@ -26,6 +26,8 @@ struct HostPacket {
unsigned short identifier; unsigned short identifier;
unsigned short version; unsigned short version;
unsigned short port; unsigned short port;
unsigned int ipaddr;
unsigned short name[20];
HostInfo host; HostInfo host;
}; };
struct HostRequest { struct HostRequest {
......
...@@ -195,7 +195,7 @@ void SingleDuel::PlayerReady(DuelPlayer* dp, bool is_ready) { ...@@ -195,7 +195,7 @@ void SingleDuel::PlayerReady(DuelPlayer* dp, bool is_ready) {
if(is_ready) { if(is_ready) {
bool allow_ocg = host_info.rule == 0 || host_info.rule == 2; bool allow_ocg = host_info.rule == 0 || host_info.rule == 2;
bool allow_tcg = host_info.rule == 1 || host_info.rule == 2; bool allow_tcg = host_info.rule == 1 || host_info.rule == 2;
int res = deckManager.CheckLFList(pdeck[dp->type], host_info.lflist, allow_ocg, allow_tcg); int res = host_info.no_check_deck ? true : deckManager.CheckLFList(pdeck[dp->type], host_info.lflist, allow_ocg, allow_tcg);
if(res) { if(res) {
STOC_HS_PlayerChange scpc; STOC_HS_PlayerChange scpc;
scpc.status = (dp->type << 4) | PLAYERCHANGE_NOTREADY; scpc.status = (dp->type << 4) | PLAYERCHANGE_NOTREADY;
...@@ -311,17 +311,19 @@ void SingleDuel::TPResult(DuelPlayer* dp, unsigned char tp) { ...@@ -311,17 +311,19 @@ void SingleDuel::TPResult(DuelPlayer* dp, unsigned char tp) {
rnd.reset(seed); rnd.reset(seed);
last_replay.WriteData(players[0], 40, false); last_replay.WriteData(players[0], 40, false);
last_replay.WriteData(players[1], 40, false); last_replay.WriteData(players[1], 40, false);
for(int i = 0; i < pdeck[0].main.size(); ++i) { if(!host_info.no_shuffle_deck) {
int swap = rnd.real() * pdeck[0].main.size(); for(int i = 0; i < pdeck[0].main.size(); ++i) {
auto tmp = pdeck[0].main[i]; int swap = rnd.real() * pdeck[0].main.size();
pdeck[0].main[i] = pdeck[0].main[swap]; auto tmp = pdeck[0].main[i];
pdeck[0].main[swap] = tmp; pdeck[0].main[i] = pdeck[0].main[swap];
} pdeck[0].main[swap] = tmp;
for(int i = 0; i < pdeck[1].main.size(); ++i) { }
int swap = rnd.real() * pdeck[1].main.size(); for(int i = 0; i < pdeck[1].main.size(); ++i) {
auto tmp = pdeck[1].main[i]; int swap = rnd.real() * pdeck[1].main.size();
pdeck[1].main[i] = pdeck[1].main[swap]; auto tmp = pdeck[1].main[i];
pdeck[1].main[swap] = tmp; pdeck[1].main[i] = pdeck[1].main[swap];
pdeck[1].main[swap] = tmp;
}
} }
set_card_reader((card_reader)DataManager::CardReader); set_card_reader((card_reader)DataManager::CardReader);
set_message_handler((message_handler)SingleDuel::MessageHandler); set_message_handler((message_handler)SingleDuel::MessageHandler);
......
...@@ -251,6 +251,8 @@ ...@@ -251,6 +251,8 @@
!system 1275 ↑随机选择位置 !system 1275 ↑随机选择位置
!system 1276 自动排列连锁顺序 !system 1276 自动排列连锁顺序
!system 1277 没有可连锁的卡时延迟回应 !system 1277 没有可连锁的卡时延迟回应
!system 1280 标准对战
!system 1281 自定义
!system 1300 禁限卡表: !system 1300 禁限卡表:
!system 1301 卡组列表: !system 1301 卡组列表:
!system 1302 保存 !system 1302 保存
......
...@@ -7,5 +7,5 @@ lastdeck = tgagent ...@@ -7,5 +7,5 @@ lastdeck = tgagent
textfont = c:/windows/fonts/simsun.ttc textfont = c:/windows/fonts/simsun.ttc
numfont = c:/windows/fonts/arialbd.ttf numfont = c:/windows/fonts/arialbd.ttf
serverport = 7911 serverport = 7911
lastip = 127.0.0.1 lastip = 192.168.2.100
lastport = 7911 lastport = 7911
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