Commit 2007e1b6 authored by argon.sun's avatar argon.sun

host finding

parent feb083ea
...@@ -23,6 +23,10 @@ int DuelClient::select_hint = 0; ...@@ -23,6 +23,10 @@ int DuelClient::select_hint = 0;
wchar_t DuelClient::event_string[256]; wchar_t DuelClient::event_string[256];
mtrandom DuelClient::rnd; mtrandom DuelClient::rnd;
bool DuelClient::is_refreshing = false;
std::vector<HostInfo> DuelClient::hosts;
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) {
if(connect_state) if(connect_state)
return false; return false;
...@@ -254,7 +258,7 @@ void DuelClient::HandleSTOCPacketLan(char* data, unsigned int len) { ...@@ -254,7 +258,7 @@ void DuelClient::HandleSTOCPacketLan(char* data, unsigned int len) {
else if (mainGame->wLanWindow->isVisible()) else if (mainGame->wLanWindow->isVisible())
mainGame->HideElement(mainGame->wLanWindow); mainGame->HideElement(mainGame->wLanWindow);
mainGame->gMutex.Unlock(); mainGame->gMutex.Unlock();
mainGame->WaitFrameSignal(10); mainGame->WaitFrameSignal(11);
mainGame->ShowElement(mainGame->wHostSingle); mainGame->ShowElement(mainGame->wHostSingle);
mainGame->WaitFrameSignal(10); mainGame->WaitFrameSignal(10);
break; break;
...@@ -2275,5 +2279,84 @@ void DuelClient::SetResponseB(unsigned char* respB, unsigned char len) { ...@@ -2275,5 +2279,84 @@ void DuelClient::SetResponseB(unsigned char* respB, unsigned char len) {
void DuelClient::SendResponse() { void DuelClient::SendResponse() {
SendBufferToServer(CTOS_RESPONSE, response_buf, response_len); SendBufferToServer(CTOS_RESPONSE, response_buf, response_len);
} }
void DuelClient::BeginRefreshHost() {
if(is_refreshing)
return;
is_refreshing = true;
mainGame->gMutex.Lock();
mainGame->lstHostList->clear();
hosts.clear();
event_base* broadev = event_base_new();
char hname[256];
gethostname(hname, 256);
hostent* host = gethostbyname(hname);
if(!host)
return;
SOCKET reply = socket(AF_INET, SOCK_DGRAM, 0);
sockaddr_in reply_addr;
memset(&reply_addr, 0, sizeof(reply_addr));
reply_addr.sin_family = AF_INET;
reply_addr.sin_port = htons(7921);
reply_addr.sin_addr.s_addr = 0;
if(bind(reply, (sockaddr*)&reply_addr, sizeof(reply_addr)) == SOCKET_ERROR) {
closesocket(reply);
return;
}
timeval timeout = {5, 0};
resp_event = event_new(broadev, reply, EV_TIMEOUT | EV_READ | EV_PERSIST, BroadcastReply, broadev);
event_add(resp_event, &timeout);
//send request
SOCKADDR_IN local;
local.sin_family = AF_INET;
local.sin_port = htons(7922);
SOCKADDR_IN sockTo;
sockTo.sin_addr.s_addr = htonl(INADDR_BROADCAST);
sockTo.sin_family = AF_INET;
sockTo.sin_port = htons(7920);
HostRequest hReq;
hReq.identifier = NETWORK_CLIENT_ID;
for(int i = 0; i < 8; ++i) {
if(host->h_addr_list[i] == 0)
break;
int local_addr = *(unsigned int*)host->h_addr_list[i];
local.sin_addr.s_addr = local_addr;
SOCKET sSend = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
if(sSend == INVALID_SOCKET)
break;
BOOL opt = TRUE;
setsockopt(sSend, SOL_SOCKET, SO_BROADCAST, (const char*)&opt, sizeof(BOOL));
if(bind(sSend, (sockaddr*)&local, sizeof(sockaddr)) == SOCKET_ERROR) {
closesocket(sSend);
break;
}
sendto(sSend, (const char*)&hReq, sizeof(HostRequest), 0, (sockaddr*)&sockTo, sizeof(sockaddr));
closesocket(sSend);
}
Thread::NewThread(RefreshThread, broadev);
}
int DuelClient::RefreshThread(void* arg) {
event_base* broadev = (event_base*)arg;
event_base_dispatch(broadev);
evutil_socket_t fd;
event_get_assignment(resp_event, 0, &fd, 0, 0, 0);
evutil_closesocket(fd);
event_free(resp_event);
event_base_free(broadev);
is_refreshing = false;
}
void DuelClient::BroadcastReply(evutil_socket_t fd, short events, void* arg) {
if(events & EV_TIMEOUT) {
event_base_loopbreak((event_base*)arg);
} else if(events & EV_READ) {
sockaddr_in bc_addr;
int sz = sizeof(sockaddr_in);
char buf[256];
int ret = recvfrom(fd, buf, 256, 0, (sockaddr*)&bc_addr, &sz);
HostPacket* pHP = (HostPacket*)buf;
if(pHP->identifier == NETWORK_SERVER_ID && pHP->version == PRO_VERSION) {
mainGame->gMutex.Lock();
mainGame->gMutex.Unlock();
}
}
}
} }
...@@ -2,6 +2,7 @@ ...@@ -2,6 +2,7 @@
#define DUELCLIENT_H #define DUELCLIENT_H
#include "config.h" #include "config.h"
#include <vector>
#include <event2/event.h> #include <event2/event.h>
#include <event2/listener.h> #include <event2/listener.h>
#include <event2/bufferevent.h> #include <event2/bufferevent.h>
...@@ -62,6 +63,15 @@ public: ...@@ -62,6 +63,15 @@ public:
memcpy(p, buffer, len); memcpy(p, buffer, len);
bufferevent_write(client_bev, duel_client_write, len + 3); bufferevent_write(client_bev, duel_client_write, len + 3);
} }
protected:
static bool is_refreshing;
static event* resp_event;
public:
static std::vector<HostInfo> hosts;
static void BeginRefreshHost();
static int RefreshThread(void* arg);
static void BroadcastReply(evutil_socket_t fd, short events, void* arg);
}; };
} }
......
...@@ -77,8 +77,9 @@ bool Game::Initialize() { ...@@ -77,8 +77,9 @@ bool Game::Initialize() {
env->addStaticText(dataManager.GetSysString(1220), rect<s32>(10, 30, 220, 50), false, false, wLanWindow); env->addStaticText(dataManager.GetSysString(1220), rect<s32>(10, 30, 220, 50), false, false, wLanWindow);
ebNickName = env->addEditBox(gameConf.nickname, rect<s32>(110, 25, 450, 50), true, wLanWindow); ebNickName = env->addEditBox(gameConf.nickname, rect<s32>(110, 25, 450, 50), true, wLanWindow);
ebNickName->setTextAlignment(irr::gui::EGUIA_UPPERLEFT, irr::gui::EGUIA_CENTER); ebNickName->setTextAlignment(irr::gui::EGUIA_UPPERLEFT, irr::gui::EGUIA_CENTER);
lstHostList = env->addListBox(rect<s32>(10, 60, 570, 350), wLanWindow, LISTBOX_LAN_HOST, true); lstHostList = env->addListBox(rect<s32>(10, 60, 570, 320), wLanWindow, LISTBOX_LAN_HOST, true);
lstHostList->setItemHeight(18); lstHostList->setItemHeight(18);
btnLanRefresh = env->addButton(rect<s32>(240, 325, 340, 350), wLanWindow, BUTTON_LAN_REFRESH, dataManager.GetSysString(1217));
env->addStaticText(dataManager.GetSysString(1221), rect<s32>(10, 360, 220, 380), false, false, wLanWindow); env->addStaticText(dataManager.GetSysString(1221), rect<s32>(10, 360, 220, 380), false, false, wLanWindow);
ebJoinIP = env->addEditBox(gameConf.lastip, rect<s32>(110, 355, 250, 380), true, wLanWindow); ebJoinIP = env->addEditBox(gameConf.lastip, rect<s32>(110, 355, 250, 380), true, wLanWindow);
ebJoinIP->setTextAlignment(irr::gui::EGUIA_CENTER, irr::gui::EGUIA_CENTER); ebJoinIP->setTextAlignment(irr::gui::EGUIA_CENTER, irr::gui::EGUIA_CENTER);
......
...@@ -155,6 +155,7 @@ public: ...@@ -155,6 +155,7 @@ public:
irr::gui::IGUIWindow* wLanWindow; irr::gui::IGUIWindow* wLanWindow;
irr::gui::IGUIEditBox* ebNickName; irr::gui::IGUIEditBox* ebNickName;
irr::gui::IGUIListBox* lstHostList; irr::gui::IGUIListBox* lstHostList;
irr::gui::IGUIButton* btnLanRefresh;
irr::gui::IGUIEditBox* ebJoinIP; irr::gui::IGUIEditBox* ebJoinIP;
irr::gui::IGUIEditBox* ebJoinPort; irr::gui::IGUIEditBox* ebJoinPort;
irr::gui::IGUIEditBox* ebJoinPass; irr::gui::IGUIEditBox* ebJoinPass;
...@@ -335,6 +336,7 @@ extern Game* mainGame; ...@@ -335,6 +336,7 @@ extern Game* mainGame;
#define BUTTON_CREATE_HOST 113 #define BUTTON_CREATE_HOST 113
#define BUTTON_HOST_CONFIRM 114 #define BUTTON_HOST_CONFIRM 114
#define BUTTON_HOST_CANCEL 115 #define BUTTON_HOST_CANCEL 115
#define BUTTON_LAN_REFRESH 116
#define BUTTON_HS_DUELIST 120 #define BUTTON_HS_DUELIST 120
#define BUTTON_HS_OBSERVER 121 #define BUTTON_HS_OBSERVER 121
#define BUTTON_HS_START 122 #define BUTTON_HS_START 122
......
...@@ -51,6 +51,9 @@ bool MenuHandler::OnEvent(const irr::SEvent& event) { ...@@ -51,6 +51,9 @@ bool MenuHandler::OnEvent(const irr::SEvent& event) {
mainGame->HideElement(mainGame->wLanWindow, false, mainGame->wMainMenu); mainGame->HideElement(mainGame->wLanWindow, false, mainGame->wMainMenu);
break; break;
} }
case BUTTON_LAN_REFRESH: {
break;
}
case BUTTON_CREATE_HOST: { case BUTTON_CREATE_HOST: {
mainGame->btnHostConfirm->setEnabled(true); mainGame->btnHostConfirm->setEnabled(true);
mainGame->btnHostCancel->setEnabled(true); mainGame->btnHostCancel->setEnabled(true);
...@@ -154,7 +157,7 @@ bool MenuHandler::OnEvent(const irr::SEvent& event) { ...@@ -154,7 +157,7 @@ bool MenuHandler::OnEvent(const irr::SEvent& event) {
mainGame->wCardImg->setVisible(true); mainGame->wCardImg->setVisible(true);
mainGame->wDeckEdit->setVisible(true); mainGame->wDeckEdit->setVisible(true);
mainGame->wFilter->setVisible(true); mainGame->wFilter->setVisible(true);
mainGame->deckBuilder.filterList = deckManager._lfList[0].content;; mainGame->deckBuilder.filterList = deckManager._lfList[0].content;
mainGame->cbDBLFList->setSelected(0); mainGame->cbDBLFList->setSelected(0);
mainGame->cbCardType->setSelected(0); mainGame->cbCardType->setSelected(0);
mainGame->cbCardType2->setSelected(0); mainGame->cbCardType2->setSelected(0);
......
...@@ -3,7 +3,9 @@ ...@@ -3,7 +3,9 @@
namespace ygo { namespace ygo {
std::unordered_map<bufferevent*, DuelPlayer> NetServer::users; std::unordered_map<bufferevent*, DuelPlayer> NetServer::users;
unsigned short NetServer::server_port = 0;
event_base* NetServer::net_evbase = 0; event_base* NetServer::net_evbase = 0;
event* NetServer::broadcast_ev = 0;
evconnlistener* NetServer::listener = 0; evconnlistener* NetServer::listener = 0;
DuelMode* NetServer::duel_mode = 0; DuelMode* NetServer::duel_mode = 0;
char NetServer::net_server_read[0x2000]; char NetServer::net_server_read[0x2000];
...@@ -18,6 +20,7 @@ bool NetServer::StartServer(unsigned short port) { ...@@ -18,6 +20,7 @@ bool NetServer::StartServer(unsigned short port) {
return false; return false;
sockaddr_in sin; sockaddr_in sin;
memset(&sin, 0, sizeof(sin)); memset(&sin, 0, sizeof(sin));
server_port = port;
sin.sin_family = AF_INET; sin.sin_family = AF_INET;
sin.sin_addr.s_addr = htonl(INADDR_ANY); sin.sin_addr.s_addr = htonl(INADDR_ANY);
sin.sin_port = htons(port); sin.sin_port = htons(port);
...@@ -32,13 +35,57 @@ bool NetServer::StartServer(unsigned short port) { ...@@ -32,13 +35,57 @@ bool NetServer::StartServer(unsigned short port) {
Thread::NewThread(ServerThread, net_evbase); Thread::NewThread(ServerThread, net_evbase);
return true; return true;
} }
bool NetServer::StartBroadcast() {
if(!net_evbase)
return false;
SOCKET udp = socket(AF_INET, SOCK_DGRAM, 0);
BOOL opt = TRUE;
setsockopt(udp, SOL_SOCKET, SO_BROADCAST, (const char*)&opt, sizeof(BOOL));
sockaddr_in addr;
memset(&addr, 0, sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_port = htons(7920);
addr.sin_addr.s_addr = 0;
if(bind(udp, (sockaddr*)&addr, sizeof(addr)) == SOCKET_ERROR) {
closesocket(udp);
return false;
}
broadcast_ev = event_new(net_evbase, udp, EV_READ | EV_PERSIST, BroadcastEvent, NULL);
event_add(broadcast_ev, NULL);
}
void NetServer::StopServer() { void NetServer::StopServer() {
if(!net_evbase) if(!net_evbase)
return; return;
event_base_loopexit(net_evbase, 0); event_base_loopexit(net_evbase, 0);
} }
void NetServer::StopBroadcast() {
if(!net_evbase || !broadcast_ev)
return;
event_del(broadcast_ev);
evutil_socket_t fd;
event_get_assignment(broadcast_ev, 0, &fd, 0, 0, 0);
evutil_closesocket(fd);
event_free(broadcast_ev);
broadcast_ev = 0;
}
void NetServer::StopListen() { void NetServer::StopListen() {
evconnlistener_disable(listener); evconnlistener_disable(listener);
StopBroadcast();
}
void NetServer::BroadcastEvent(evutil_socket_t fd, short events, void* arg) {
sockaddr_in bc_addr;
int sz = sizeof(sockaddr_in);
char buf[256];
int ret = recvfrom(fd, buf, 256, 0, (sockaddr*)&bc_addr, &sz);
HostRequest* pHR = (HostRequest*)buf;
if(pHR->identifier == NETWORK_CLIENT_ID) {
HostPacket hp;
hp.identifier = NETWORK_SERVER_ID;
hp.port = server_port;
hp.version = PRO_VERSION;
hp.host = duel_mode->host_info;
sendto(fd, (const char*)&hp, sizeof(HostPacket), 0, (sockaddr*)&bc_addr, sizeof(bc_addr));
}
} }
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) {
bufferevent* bev = bufferevent_socket_new(net_evbase, fd, BEV_OPT_CLOSE_ON_FREE); bufferevent* bev = bufferevent_socket_new(net_evbase, fd, BEV_OPT_CLOSE_ON_FREE);
...@@ -86,6 +133,13 @@ int NetServer::ServerThread(void* param) { ...@@ -86,6 +133,13 @@ int NetServer::ServerThread(void* param) {
} }
users.clear(); users.clear();
evconnlistener_free(listener); evconnlistener_free(listener);
if(broadcast_ev) {
evutil_socket_t fd;
event_get_assignment(broadcast_ev, 0, &fd, 0, 0, 0);
evutil_closesocket(fd);
event_free(broadcast_ev);
broadcast_ev = 0;
}
event_base_free(net_evbase); event_base_free(net_evbase);
listener = 0; listener = 0;
net_evbase = 0; net_evbase = 0;
...@@ -165,6 +219,7 @@ void NetServer::HandleCTOSPacket(DuelPlayer* dp, char* data, unsigned int len) { ...@@ -165,6 +219,7 @@ void NetServer::HandleCTOSPacket(DuelPlayer* dp, char* data, unsigned int len) {
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);
StartBroadcast();
break; break;
} }
case CTOS_JOIN_GAME: { case CTOS_JOIN_GAME: {
......
...@@ -13,7 +13,9 @@ namespace ygo { ...@@ -13,7 +13,9 @@ namespace ygo {
class NetServer { class NetServer {
private: private:
static std::unordered_map<bufferevent*, DuelPlayer> users; static std::unordered_map<bufferevent*, DuelPlayer> users;
static unsigned short server_port;
static event_base* net_evbase; static event_base* net_evbase;
static event* broadcast_ev;
static evconnlistener* listener; static evconnlistener* listener;
static DuelMode* duel_mode; static DuelMode* duel_mode;
static char net_server_read[0x2000]; static char net_server_read[0x2000];
...@@ -21,8 +23,11 @@ private: ...@@ -21,8 +23,11 @@ private:
static unsigned short last_sent; static unsigned short last_sent;
public: public:
static bool StartServer(unsigned short port); static bool StartServer(unsigned short port);
static bool StartBroadcast();
static void StopServer(); static void StopServer();
static void StopBroadcast();
static void StopListen(); static void StopListen();
static void BroadcastEvent(evutil_socket_t fd, short events, void* arg);
static void ServerAccept(evconnlistener* listener, evutil_socket_t fd, sockaddr* address, int socklen, void* ctx); static void ServerAccept(evconnlistener* listener, evutil_socket_t fd, sockaddr* address, int socklen, void* ctx);
static void ServerAcceptError(evconnlistener *listener, void* ctx); static void ServerAcceptError(evconnlistener *listener, void* ctx);
static void ServerEchoRead(bufferevent* bev, void* ctx); static void ServerEchoRead(bufferevent* bev, void* ctx);
......
#include "network.h"
namespace ygo {
/*
int NetManager::GetLocalAddress() {
char hname[256];
gethostname(hname, 256);
hostent* host = gethostbyname(hname);
if(!host)
return 0;
int i = 0;
for(i = 0; i < 8; ++i) {
local_addr[i] = 0;
if(host->h_addr_list[i] == 0)
break;
local_addr[i] = *(unsigned int*)host->h_addr_list[i];
}
return i;
}
int NetManager::BroadcastServer(void* np) {
NetManager* net = (NetManager*)np;
SOCKADDR_IN sockTo;
sockTo.sin_family = AF_INET;
sockTo.sin_port = htons(7912);
int recvLen = recvfrom(net->sBHost, (char*)&net->hReq, sizeof(HostRequest), 0, 0, 0);
while(recvLen != 0 && recvLen != SOCKET_ERROR) {
if(recvLen == sizeof(HostRequest) && net->hReq.identifier == NETWORK_CLIENT_ID) {
sockTo.sin_addr.s_addr = htonl(INADDR_BROADCAST);
sendto(net->sBHost, (const char*)&net->hInfo, sizeof(HostInfo), 0, (sockaddr*)&sockTo, sizeof(sockaddr));
}
recvLen = recvfrom(net->sBHost, (char*)&net->hReq, sizeof(HostRequest), 0, 0, 0);
}
net->is_creating_host = false;
shutdown(net->sBHost, SD_BOTH);
closesocket(net->sBHost);
return 0;
}
int NetManager::BroadcastClient(void* np) {
NetManager* net = (NetManager*)np;
SOCKADDR_IN sockTo;
sockTo.sin_addr.s_addr = htonl(INADDR_BROADCAST);
sockTo.sin_family = AF_INET;
sockTo.sin_port = htons(7913);
fd_set fds;
timeval tv;
tv.tv_sec = 1;
tv.tv_usec = 0;
FD_ZERO(&fds);
FD_SET(net->sBClient, &fds);
sendto(net->sBClient, (const char*)&net->hReq, sizeof(HostRequest), 0, (sockaddr*)&sockTo, sizeof(sockaddr));
mainGame->is_refreshing = true;
int result = select(0, &fds, 0, 0, &tv);
std::set<int> addrset;
net->hosts.clear();
SOCKADDR_IN sockFrom;
int sz = sizeof(SOCKADDR_IN);
if(mainGame->is_closing)
return 0;
wchar_t tbuf[256];
const wchar_t* mode;
std::vector<HostInfo>::iterator it;
mainGame->gMutex.Lock();
for(it = net->hosts.begin(); it != net->hosts.end(); ++it) {
if(!it->no_check_deck && !it->no_shuffle_deck && it->start_lp == 8000 && it->start_hand == 5 && it->draw_count == 1)
mode = L"标准设定";
else mode = L"自定义设定";
}
mainGame->gMutex.Unlock();
mainGame->is_refreshing = false;
closesocket(net->sBClient);
return 0;
}
*/
}
...@@ -25,7 +25,6 @@ struct HostInfo { ...@@ -25,7 +25,6 @@ struct HostInfo {
struct HostPacket { struct HostPacket {
unsigned short identifier; unsigned short identifier;
unsigned short version; unsigned short version;
unsigned int address;
unsigned short port; unsigned short port;
HostInfo host; HostInfo host;
}; };
......
...@@ -112,6 +112,7 @@ void SingleDuel::LeaveGame(DuelPlayer* dp) { ...@@ -112,6 +112,7 @@ void SingleDuel::LeaveGame(DuelPlayer* dp) {
if(dp == host_player) { if(dp == host_player) {
NetServer::StopServer(); NetServer::StopServer();
} else if(dp->type == NETPLAYER_TYPE_OBSERVER) { } else if(dp->type == NETPLAYER_TYPE_OBSERVER) {
observers.erase(dp);
if(!pduel) { if(!pduel) {
STOC_HS_WatchChange scwc; STOC_HS_WatchChange scwc;
scwc.watch_count = observers.size(); scwc.watch_count = observers.size();
...@@ -369,7 +370,7 @@ void SingleDuel::TPResult(DuelPlayer* dp, unsigned char tp) { ...@@ -369,7 +370,7 @@ void SingleDuel::TPResult(DuelPlayer* dp, unsigned char tp) {
NetServer::SendBufferToPlayer(players[0], STOC_GAME_MSG, startbuf, 18); NetServer::SendBufferToPlayer(players[0], STOC_GAME_MSG, startbuf, 18);
startbuf[1] = 1; startbuf[1] = 1;
NetServer::SendBufferToPlayer(players[1], STOC_GAME_MSG, startbuf, 18); NetServer::SendBufferToPlayer(players[1], STOC_GAME_MSG, startbuf, 18);
if(swapped) if(!swapped)
startbuf[1] = 0x10; startbuf[1] = 0x10;
else startbuf[1] = 0x11; else startbuf[1] = 0x11;
for(auto oit = observers.begin(); oit != observers.end(); ++oit) for(auto oit = observers.begin(); oit != observers.end(); ++oit)
...@@ -1126,7 +1127,7 @@ void SingleDuel::WaitforResponse(int playerid) { ...@@ -1126,7 +1127,7 @@ void SingleDuel::WaitforResponse(int playerid) {
last_response = playerid; last_response = playerid;
players[playerid]->state = CTOS_RESPONSE; players[playerid]->state = CTOS_RESPONSE;
unsigned char msg = MSG_WAITING; unsigned char msg = MSG_WAITING;
NetServer::SendPacketToPlayer(players[1-playerid], STOC_GAME_MSG, msg); NetServer::SendPacketToPlayer(players[1 - playerid], STOC_GAME_MSG, msg);
} }
void SingleDuel::RefreshMzone(int player, int flag, int use_cache) { void SingleDuel::RefreshMzone(int player, int flag, int use_cache) {
char query_buffer[0x1000]; char query_buffer[0x1000];
......
...@@ -9,9 +9,8 @@ function c23274061.initial_effect(c) ...@@ -9,9 +9,8 @@ function c23274061.initial_effect(c)
--Disable --Disable
local e2=Effect.CreateEffect(c) local e2=Effect.CreateEffect(c)
e2:SetDescription(aux.Stringid(23274061,0)) e2:SetDescription(aux.Stringid(23274061,0))
e2:SetType(EFFECT_TYPE_FIELD+EFFECT_TYPE_TRIGGER_F) e2:SetType(EFFECT_TYPE_SINGLE+EFFECT_TYPE_TRIGGER_F)
e2:SetCode(EVENT_BATTLE_END) e2:SetCode(EVENT_BATTLE_END)
e2:SetRange(LOCATION_MZONE)
e2:SetCondition(c23274061.condition) e2:SetCondition(c23274061.condition)
e2:SetOperation(c23274061.operation) e2:SetOperation(c23274061.operation)
c:RegisterEffect(e2) c:RegisterEffect(e2)
......
...@@ -34,7 +34,7 @@ function c38495396.xyzcon(e,c) ...@@ -34,7 +34,7 @@ function c38495396.xyzcon(e,c)
if c==nil then return true end if c==nil then return true end
if Duel.IsExistingMatchingCard(c38495396.ovfilter,c:GetControler(),LOCATION_MZONE,0,1,nil) then return true end if Duel.IsExistingMatchingCard(c38495396.ovfilter,c:GetControler(),LOCATION_MZONE,0,1,nil) then return true end
local g=Duel.GetXyzMaterial(c) local g=Duel.GetXyzMaterial(c)
return g:IsExists(c38495396.xyzfilter,3,nil) return g:IsExists(c38495396.xyzfilter,2,nil)
end end
function c38495396.xyzop(e,tp,eg,ep,ev,re,r,rp,c) function c38495396.xyzop(e,tp,eg,ep,ev,re,r,rp,c)
local g=Duel.GetXyzMaterial(c) local g=Duel.GetXyzMaterial(c)
......
...@@ -12,7 +12,7 @@ function c4335427.initial_effect(c) ...@@ -12,7 +12,7 @@ function c4335427.initial_effect(c)
c:RegisterEffect(e1) c:RegisterEffect(e1)
local e2=Effect.CreateEffect(c) local e2=Effect.CreateEffect(c)
e2:SetType(EFFECT_TYPE_SINGLE) e2:SetType(EFFECT_TYPE_SINGLE)
e2:SetCode(EFFECT_CANNOT_DISABLE_SUMMON) e2:SetCode(EFFECT_CANNOT_DISABLE_SPSUMMON)
e2:SetProperty(EFFECT_FLAG_CANNOT_DISABLE+EFFECT_FLAG_UNCOPYABLE) e2:SetProperty(EFFECT_FLAG_CANNOT_DISABLE+EFFECT_FLAG_UNCOPYABLE)
c:RegisterEffect(e2) c:RegisterEffect(e2)
--cannot special summon --cannot special summon
......
...@@ -15,10 +15,10 @@ function c4466015.filter(c) ...@@ -15,10 +15,10 @@ function c4466015.filter(c)
return c:GetCounter(0x9)>0 return c:GetCounter(0x9)>0
end end
function c4466015.target(e,tp,eg,ep,ev,re,r,rp,chk,chkc) function c4466015.target(e,tp,eg,ep,ev,re,r,rp,chk,chkc)
if chkc then return chkc:IsControler(1-tp) and chkc:IsLocation(LOCAITON_MZONE) and c4466015.filter(chkc) end if chkc then return chkc:IsLocation(LOCAITON_MZONE) and c4466015.filter(chkc) end
if chk==0 then return Duel.IsExistingTarget(c4466015.filter,tp,0,LOCATION_MZONE,1,nil) end if chk==0 then return Duel.IsExistingTarget(c4466015.filter,tp,LOCATION_MZONE,LOCATION_MZONE,1,nil) end
Duel.Hint(HINT_SELECTMSG,tp,HINTMSG_FACEUP) Duel.Hint(HINT_SELECTMSG,tp,HINTMSG_FACEUP)
local g=Duel.SelectTarget(tp,c4466015.filter,tp,0,LOCATION_MZONE,1,1,nil) local g=Duel.SelectTarget(tp,c4466015.filter,tp,LOCATION_MZONE,LOCATION_MZONE,1,1,nil)
Duel.SetOperationInfo(0,CATEGORY_DAMAGE,nil,0,1-tp,g:GetFirst():GetCounter(0x9)*700) Duel.SetOperationInfo(0,CATEGORY_DAMAGE,nil,0,1-tp,g:GetFirst():GetCounter(0x9)*700)
end end
function c4466015.activate(e,tp,eg,ep,ev,re,r,rp) function c4466015.activate(e,tp,eg,ep,ev,re,r,rp)
......
...@@ -3,9 +3,8 @@ function c5284653.initial_effect(c) ...@@ -3,9 +3,8 @@ function c5284653.initial_effect(c)
--Disable --Disable
local e1=Effect.CreateEffect(c) local e1=Effect.CreateEffect(c)
e1:SetDescription(aux.Stringid(5284653,0)) e1:SetDescription(aux.Stringid(5284653,0))
e1:SetType(EFFECT_TYPE_FIELD+EFFECT_TYPE_TRIGGER_F) e1:SetType(EFFECT_TYPE_SINGLE+EFFECT_TYPE_TRIGGER_F)
e1:SetCode(EVENT_BATTLE_END) e1:SetCode(EVENT_BATTLE_END)
e1:SetRange(LOCATION_MZONE)
e1:SetCondition(c5284653.condition) e1:SetCondition(c5284653.condition)
e1:SetOperation(c5284653.operation) e1:SetOperation(c5284653.operation)
c:RegisterEffect(e1) c:RegisterEffect(e1)
......
...@@ -14,10 +14,11 @@ function c76650663.condition(e,tp,eg,ep,ev,re,r,rp) ...@@ -14,10 +14,11 @@ function c76650663.condition(e,tp,eg,ep,ev,re,r,rp)
local a=Duel.GetAttacker() local a=Duel.GetAttacker()
if a==c then a=Duel.GetAttackTarget() end if a==c then a=Duel.GetAttackTarget() end
e:SetLabelObject(a) e:SetLabelObject(a)
return a and a:IsAttribute(ATTRIBUTE_LIGHT) return a and a:IsAttribute(ATTRIBUTE_LIGHT) and a:IsRelateToBattle()
end end
function c76650663.operation(e,tp,eg,ep,ev,re,r,rp) function c76650663.operation(e,tp,eg,ep,ev,re,r,rp)
local tc=e:GetLabelObject() local tc=e:GetLabelObject()
if tc:IsFacedown() or not tc:IsRelateToBattle() then return end
local e1=Effect.CreateEffect(e:GetHandler()) local e1=Effect.CreateEffect(e:GetHandler())
e1:SetType(EFFECT_TYPE_SINGLE) e1:SetType(EFFECT_TYPE_SINGLE)
e1:SetCode(EFFECT_DISABLE) e1:SetCode(EFFECT_DISABLE)
......
...@@ -213,6 +213,7 @@ ...@@ -213,6 +213,7 @@
!system 1214 !system 1214
!system 1215 开始 !system 1215 开始
!system 1216 消息 !system 1216 消息
!system 1217 刷新
!system 1220 昵称: !system 1220 昵称:
!system 1221 主机信息: !system 1221 主机信息:
!system 1222 主机密码: !system 1222 主机密码:
......
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