begin removing all references to metaserver in favor of pvpgn
This commit is contained in:
parent
201773b155
commit
61d4818a68
8 changed files with 75 additions and 431 deletions
|
@ -232,7 +232,6 @@ set(network_SRCS
|
||||||
src/network/commands.cpp
|
src/network/commands.cpp
|
||||||
src/network/net_lowlevel.cpp
|
src/network/net_lowlevel.cpp
|
||||||
src/network/net_message.cpp
|
src/network/net_message.cpp
|
||||||
src/network/master.cpp
|
|
||||||
src/network/netconnect.cpp
|
src/network/netconnect.cpp
|
||||||
src/network/network.cpp
|
src/network/network.cpp
|
||||||
src/network/netsockets.cpp
|
src/network/netsockets.cpp
|
||||||
|
@ -367,7 +366,6 @@ set(tolua_FILES
|
||||||
src/tolua/font.pkg
|
src/tolua/font.pkg
|
||||||
src/tolua/game.pkg
|
src/tolua/game.pkg
|
||||||
src/tolua/map.pkg
|
src/tolua/map.pkg
|
||||||
src/tolua/master.pkg
|
|
||||||
src/tolua/minimap.pkg
|
src/tolua/minimap.pkg
|
||||||
src/tolua/network.pkg
|
src/tolua/network.pkg
|
||||||
src/tolua/particle.pkg
|
src/tolua/particle.pkg
|
||||||
|
@ -537,7 +535,6 @@ set(stratagus_generic_HDRS
|
||||||
src/include/iolib.h
|
src/include/iolib.h
|
||||||
src/include/luacallback.h
|
src/include/luacallback.h
|
||||||
src/include/map.h
|
src/include/map.h
|
||||||
src/include/master.h
|
|
||||||
src/include/menus.h
|
src/include/menus.h
|
||||||
src/include/minimap.h
|
src/include/minimap.h
|
||||||
src/include/missile.h
|
src/include/missile.h
|
||||||
|
@ -1104,43 +1101,6 @@ endif()
|
||||||
|
|
||||||
########### next target ###############
|
########### next target ###############
|
||||||
|
|
||||||
set(metaserver_SRCS
|
|
||||||
metaserver/cmd.cpp
|
|
||||||
metaserver/db.cpp
|
|
||||||
metaserver/games.cpp
|
|
||||||
metaserver/main.cpp
|
|
||||||
metaserver/netdriver.cpp
|
|
||||||
src/network/net_lowlevel.cpp
|
|
||||||
)
|
|
||||||
|
|
||||||
set(metaserver_HDRS
|
|
||||||
metaserver/cmd.h
|
|
||||||
metaserver/db.h
|
|
||||||
metaserver/games.h
|
|
||||||
metaserver/netdriver.h
|
|
||||||
)
|
|
||||||
|
|
||||||
source_group(metaserver FILES ${metaserver_SRCS} ${metaserver_HDRS})
|
|
||||||
|
|
||||||
if(SQLITE_FOUND)
|
|
||||||
add_executable(metaserver ${metaserver_SRCS} ${metaserver_HDRS})
|
|
||||||
target_link_libraries(metaserver ${SDL2_LIBRARY} ${SQLITE_LIBRARIES})
|
|
||||||
|
|
||||||
if(WIN32)
|
|
||||||
target_link_libraries(metaserver winmm ws2_32)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if(WIN32 AND MINGW)
|
|
||||||
target_link_libraries(metaserver dxguid)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if(WIN32 AND MINGW AND ENABLE_STATIC)
|
|
||||||
set_target_properties(metaserver PROPERTIES LINK_FLAGS "${LINK_FLAGS} -static-libgcc -static-libstdc++")
|
|
||||||
endif()
|
|
||||||
endif()
|
|
||||||
|
|
||||||
########### next target ###############
|
|
||||||
|
|
||||||
set(png2stratagus_SRCS
|
set(png2stratagus_SRCS
|
||||||
tools/png2stratagus.cpp
|
tools/png2stratagus.cpp
|
||||||
)
|
)
|
||||||
|
@ -1175,8 +1135,6 @@ set(doxygen_FILES
|
||||||
doc/Doxyfile-header.html
|
doc/Doxyfile-header.html
|
||||||
${stratagus_SRCS}
|
${stratagus_SRCS}
|
||||||
${stratagus_HDRS}
|
${stratagus_HDRS}
|
||||||
${metaserver_SRCS}
|
|
||||||
${metaserver_HDRS}
|
|
||||||
${gameheaders_HDRS}
|
${gameheaders_HDRS}
|
||||||
${png2stratagus_SRCS}
|
${png2stratagus_SRCS}
|
||||||
)
|
)
|
||||||
|
@ -1211,9 +1169,6 @@ endmacro()
|
||||||
if(ENABLE_UPX AND SELF_PACKER_FOR_EXECUTABLE)
|
if(ENABLE_UPX AND SELF_PACKER_FOR_EXECUTABLE)
|
||||||
self_packer(stratagus)
|
self_packer(stratagus)
|
||||||
self_packer(png2stratagus)
|
self_packer(png2stratagus)
|
||||||
if(SQLITE_FOUND)
|
|
||||||
self_packer(metaserver)
|
|
||||||
endif()
|
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
########### next target ###############
|
########### next target ###############
|
||||||
|
@ -1238,10 +1193,6 @@ endif()
|
||||||
install(TARGETS stratagus DESTINATION ${GAMEDIR})
|
install(TARGETS stratagus DESTINATION ${GAMEDIR})
|
||||||
install(TARGETS png2stratagus DESTINATION ${BINDIR})
|
install(TARGETS png2stratagus DESTINATION ${BINDIR})
|
||||||
|
|
||||||
if(SQLITE_FOUND)
|
|
||||||
install(TARGETS metaserver DESTINATION ${BINDIR} RENAME stratagus-metaserver)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if(ENABLE_DOC AND DOXYGEN_FOUND)
|
if(ENABLE_DOC AND DOXYGEN_FOUND)
|
||||||
install(FILES doc/stratagus.6 DESTINATION ${MANDIR})
|
install(FILES doc/stratagus.6 DESTINATION ${MANDIR})
|
||||||
install(FILES
|
install(FILES
|
||||||
|
@ -1253,7 +1204,6 @@ if(ENABLE_DOC AND DOXYGEN_FOUND)
|
||||||
doc/index.html
|
doc/index.html
|
||||||
doc/install.html
|
doc/install.html
|
||||||
doc/media.html
|
doc/media.html
|
||||||
doc/metaserver_protocol.txt
|
|
||||||
doc/README-SDL.txt
|
doc/README-SDL.txt
|
||||||
DESTINATION share/doc/stratagus
|
DESTINATION share/doc/stratagus
|
||||||
)
|
)
|
||||||
|
|
|
@ -1,86 +0,0 @@
|
||||||
// _________ __ __
|
|
||||||
// / _____// |_____________ _/ |______ ____ __ __ ______
|
|
||||||
// \_____ \\ __\_ __ \__ \\ __\__ \ / ___\| | \/ ___/
|
|
||||||
// / \| | | | \// __ \| | / __ \_/ /_/ > | /\___ |
|
|
||||||
// /_______ /|__| |__| (____ /__| (____ /\___ /|____//____ >
|
|
||||||
// \/ \/ \//_____/ \/
|
|
||||||
// ______________________ ______________________
|
|
||||||
// T H E W A R B E G I N S
|
|
||||||
// Stratagus - A free fantasy real time strategy game engine
|
|
||||||
//
|
|
||||||
/**@name master.h - The master server headerfile. */
|
|
||||||
//
|
|
||||||
// (c) Copyright 2003-2007 by Tom Zickel and Jimmy Salmon
|
|
||||||
//
|
|
||||||
// This program is free software; you can redistribute it and/or modify
|
|
||||||
// it under the terms of the GNU General Public License as published by
|
|
||||||
// the Free Software Foundation; only version 2 of the License.
|
|
||||||
//
|
|
||||||
// This program is distributed in the hope that it will be useful,
|
|
||||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
// GNU General Public License for more details.
|
|
||||||
//
|
|
||||||
// You should have received a copy of the GNU General Public License
|
|
||||||
// along with this program; if not, write to the Free Software
|
|
||||||
// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
|
||||||
// 02111-1307, USA.
|
|
||||||
//
|
|
||||||
|
|
||||||
#ifndef __MASTER_H__
|
|
||||||
#define __MASTER_H__
|
|
||||||
|
|
||||||
//@{
|
|
||||||
|
|
||||||
#include <list>
|
|
||||||
#include "network/netsockets.h"
|
|
||||||
|
|
||||||
/*----------------------------------------------------------------------------
|
|
||||||
-- Declarations
|
|
||||||
----------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
struct lua_State;
|
|
||||||
|
|
||||||
// Log data used in metaserver client
|
|
||||||
struct CClientLog {
|
|
||||||
std::string entry; // command itself
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
// Class representing meta server client structure
|
|
||||||
class CMetaClient
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
CMetaClient() : metaSocket(), metaPort(-1), lastRecvState(-1) {}
|
|
||||||
~CMetaClient();
|
|
||||||
void SetMetaServer(const std::string host, const int port);
|
|
||||||
int Init();
|
|
||||||
void Close();
|
|
||||||
int Send(const std::string cmd);
|
|
||||||
int Recv();
|
|
||||||
int GetLastRecvState() { return lastRecvState; }
|
|
||||||
int GetLogSize() { return events.size(); }
|
|
||||||
CClientLog *GetLastMessage() { return events.back(); }
|
|
||||||
int CreateGame(std::string desc, std::string map, std::string players);
|
|
||||||
|
|
||||||
CHost *GetMetaServer() { return new CHost(metaHost.c_str(), metaPort); }
|
|
||||||
|
|
||||||
private:
|
|
||||||
CTCPSocket metaSocket; /// This is a TCP socket
|
|
||||||
std::string metaHost; /// Address of metaserver
|
|
||||||
int metaPort; /// Port of metaserver
|
|
||||||
std::list <CClientLog *> events; /// All commands received from metaserver
|
|
||||||
int lastRecvState; /// Now many bytes have been received in last reply
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*----------------------------------------------------------------------------
|
|
||||||
-- Variables
|
|
||||||
----------------------------------------------------------------------------*/
|
|
||||||
// Metaserver itself
|
|
||||||
extern CMetaClient MetaClient;
|
|
||||||
|
|
||||||
//@}
|
|
||||||
|
|
||||||
#endif // !__MASTER_H__
|
|
|
@ -1,6 +1,23 @@
|
||||||
#ifndef __ONLINE_SERVICE_H__
|
#ifndef __ONLINE_SERVICE_H__
|
||||||
#define __ONLINE_SERVICE_H__
|
#define __ONLINE_SERVICE_H__
|
||||||
|
|
||||||
void GoOnline();
|
class OnlineContext {
|
||||||
|
public:
|
||||||
|
virtual void doOneStep();
|
||||||
|
|
||||||
#endif // !__EDITOR_H__
|
virtual void goOnline();
|
||||||
|
|
||||||
|
virtual void joinGame(std:string name, std::string pw);
|
||||||
|
|
||||||
|
// TODO: allow passing all the other options, like 1 peon only, resource amount, game type, ...
|
||||||
|
virtual void advertiseGame(std::string name, std::string pw, std::string creatorName, std::string mapName,
|
||||||
|
int mapX, int mapY, int maxPlayers, int playersInGame);
|
||||||
|
|
||||||
|
virtual void stopAdvertisingGame();
|
||||||
|
|
||||||
|
virtual void reportGameResult();
|
||||||
|
};
|
||||||
|
|
||||||
|
extern OnlineContext *OnlineContextHandler;
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
|
@ -1,244 +0,0 @@
|
||||||
// _________ __ __
|
|
||||||
// / _____// |_____________ _/ |______ ____ __ __ ______
|
|
||||||
// \_____ \\ __\_ __ \__ \\ __\__ \ / ___\| | \/ ___/
|
|
||||||
// / \| | | | \// __ \| | / __ \_/ /_/ > | /\___ |
|
|
||||||
// /_______ /|__| |__| (____ /__| (____ /\___ /|____//____ >
|
|
||||||
// \/ \/ \//_____/ \/
|
|
||||||
// ______________________ ______________________
|
|
||||||
// T H E W A R B E G I N S
|
|
||||||
// Stratagus - A free fantasy real time strategy game engine
|
|
||||||
//
|
|
||||||
/**@name master.cpp - The master server. */
|
|
||||||
//
|
|
||||||
// (c) Copyright 2003-2007 by Tom Zickel and Jimmy Salmon
|
|
||||||
//
|
|
||||||
// This program is free software; you can redistribute it and/or modify
|
|
||||||
// it under the terms of the GNU General Public License as published by
|
|
||||||
// the Free Software Foundation; only version 2 of the License.
|
|
||||||
//
|
|
||||||
// This program is distributed in the hope that it will be useful,
|
|
||||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
// GNU General Public License for more details.
|
|
||||||
//
|
|
||||||
// You should have received a copy of the GNU General Public License
|
|
||||||
// along with this program; if not, write to the Free Software
|
|
||||||
// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
|
||||||
// 02111-1307, USA.
|
|
||||||
//
|
|
||||||
|
|
||||||
//@{
|
|
||||||
|
|
||||||
/*----------------------------------------------------------------------------
|
|
||||||
-- Includes
|
|
||||||
----------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
#include <errno.h>
|
|
||||||
#include <stdarg.h>
|
|
||||||
#include <ctype.h>
|
|
||||||
#include <limits.h>
|
|
||||||
|
|
||||||
#include "stratagus.h"
|
|
||||||
|
|
||||||
#include "master.h"
|
|
||||||
|
|
||||||
#include "game.h"
|
|
||||||
#include "network/netsockets.h"
|
|
||||||
#include "network.h"
|
|
||||||
#include "net_lowlevel.h"
|
|
||||||
#include "parameters.h"
|
|
||||||
#include "script.h"
|
|
||||||
#include "version.h"
|
|
||||||
|
|
||||||
|
|
||||||
/*----------------------------------------------------------------------------
|
|
||||||
-- Variables
|
|
||||||
----------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
CMetaClient MetaClient;
|
|
||||||
|
|
||||||
/*----------------------------------------------------------------------------
|
|
||||||
-- Functions
|
|
||||||
----------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
** Set the metaserver to use for internet play.
|
|
||||||
**
|
|
||||||
** @param host Host to connect
|
|
||||||
** @param port Port to use to connect
|
|
||||||
*/
|
|
||||||
void CMetaClient::SetMetaServer(const std::string host, const int port)
|
|
||||||
{
|
|
||||||
metaHost = host;
|
|
||||||
metaPort = port;
|
|
||||||
}
|
|
||||||
|
|
||||||
CMetaClient::~CMetaClient()
|
|
||||||
{
|
|
||||||
for (std::list<CClientLog *>::iterator it = events.begin(); it != events.end(); ++it) {
|
|
||||||
CClientLog *log = *it;
|
|
||||||
delete log;
|
|
||||||
}
|
|
||||||
events.clear();
|
|
||||||
this->Close();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
** Initialize the TCP connection to the Meta Server and send test ping to it.
|
|
||||||
**
|
|
||||||
** @return -1 fail, 0 success.
|
|
||||||
*/
|
|
||||||
int CMetaClient::Init()
|
|
||||||
{
|
|
||||||
if (metaPort == -1) {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Server socket
|
|
||||||
CHost metaServerHost(metaHost.c_str(), metaPort);
|
|
||||||
// Client socket
|
|
||||||
|
|
||||||
// open on all interfaces, not the loopback, unless we have an override from the commandline
|
|
||||||
std::string localHost = CNetworkParameter::Instance.localHost;
|
|
||||||
if (!localHost.compare("127.0.0.1")) {
|
|
||||||
localHost = "0.0.0.0";
|
|
||||||
}
|
|
||||||
CHost metaClientHost(localHost.c_str(), CNetworkParameter::Instance.localPort);
|
|
||||||
metaSocket.Open(metaClientHost);
|
|
||||||
if (metaSocket.IsValid() == false) {
|
|
||||||
fprintf(stderr, "METACLIENT: No free port %d available, aborting\n", metaServerHost.getPort());
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
if (metaSocket.Connect(metaServerHost) == false) {
|
|
||||||
fprintf(stderr, "METACLIENT: Unable to connect to host %s\n", metaServerHost.toString().c_str());
|
|
||||||
MetaClient.Close();
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (this->Send("PING") == -1) { // not sent
|
|
||||||
MetaClient.Close();
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
if (this->Recv() == -1) { // not received
|
|
||||||
MetaClient.Close();
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
CClientLog &log = *GetLastMessage();
|
|
||||||
if (log.entry.find("PING_OK") != std::string::npos) {
|
|
||||||
// Everything is OK
|
|
||||||
return 0;
|
|
||||||
} else {
|
|
||||||
fprintf(stderr, "METACLIENT: inappropriate message received from %s\n", metaServerHost.toString().c_str());
|
|
||||||
MetaClient.Close();
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
** Close Connection to Master Server
|
|
||||||
**
|
|
||||||
** @return nothing
|
|
||||||
*/
|
|
||||||
void CMetaClient::Close()
|
|
||||||
{
|
|
||||||
if (metaSocket.IsValid()) {
|
|
||||||
metaSocket.Close();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
** Send a command to the meta server
|
|
||||||
**
|
|
||||||
** @param cmd command to send
|
|
||||||
**
|
|
||||||
** @returns -1 if failed, otherwise length of command
|
|
||||||
*/
|
|
||||||
int CMetaClient::Send(const std::string cmd)
|
|
||||||
{
|
|
||||||
int ret = -1;
|
|
||||||
if (metaSocket.IsValid()) {
|
|
||||||
std::string mes(cmd);
|
|
||||||
mes.append("\n");
|
|
||||||
ret = metaSocket.Send(mes.c_str(), mes.size());
|
|
||||||
}
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
** Receive reply from Meta Server
|
|
||||||
**
|
|
||||||
** @return error or number of bytes
|
|
||||||
*/
|
|
||||||
int CMetaClient::Recv()
|
|
||||||
{
|
|
||||||
if (metaSocket.HasDataToRead(5000) == -1) {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
char buf[1024];
|
|
||||||
memset(&buf, 0, sizeof(buf));
|
|
||||||
int n = metaSocket.Recv(&buf, sizeof(buf));
|
|
||||||
if (n == -1) {
|
|
||||||
return n;
|
|
||||||
}
|
|
||||||
// We know we now have the whole command.
|
|
||||||
// Convert to standard notation
|
|
||||||
std::string cmd(buf, strlen(buf));
|
|
||||||
cmd += '\n';
|
|
||||||
cmd += '\0';
|
|
||||||
CClientLog *log = new CClientLog;
|
|
||||||
log->entry = cmd;
|
|
||||||
events.push_back(log);
|
|
||||||
lastRecvState = n;
|
|
||||||
return n;
|
|
||||||
}
|
|
||||||
|
|
||||||
//@}
|
|
||||||
|
|
||||||
int CMetaClient::CreateGame(std::string desc, std::string map, std::string players) {
|
|
||||||
if (metaSocket.IsValid() == false) {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
if (NetworkFildes.IsValid() == false) {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
CHost metaServerHost(metaHost.c_str(), metaPort);
|
|
||||||
|
|
||||||
// Advertise an external IP address if we can
|
|
||||||
unsigned long ips[1];
|
|
||||||
int networkNumInterfaces = NetworkFildes.GetSocketAddresses(ips, 1);
|
|
||||||
std::string ipport = "";
|
|
||||||
if (!networkNumInterfaces || CNetworkParameter::Instance.localHost.compare("127.0.0.1")) {
|
|
||||||
ipport += CNetworkParameter::Instance.localHost.c_str();
|
|
||||||
} else {
|
|
||||||
ipport += inet_ntoa(((struct in_addr *)ips)[0]);
|
|
||||||
}
|
|
||||||
ipport += " ";
|
|
||||||
ipport += std::to_string(CNetworkParameter::Instance.localPort);
|
|
||||||
|
|
||||||
std::string cmd("CREATEGAME \"");
|
|
||||||
cmd += desc;
|
|
||||||
cmd += "\" \"";
|
|
||||||
cmd += map;
|
|
||||||
cmd += "\" ";
|
|
||||||
cmd += players;
|
|
||||||
cmd += " ";
|
|
||||||
cmd += ipport;
|
|
||||||
|
|
||||||
if (this->Send(cmd.c_str()) == -1) { // not sent
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
if (this->Recv() == -1) { // not received
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
CClientLog &log = *GetLastMessage();
|
|
||||||
if (log.entry.find("CREATEGAME_OK") != std::string::npos) {
|
|
||||||
// Everything is OK, let's inform metaserver of our UDP info
|
|
||||||
NetworkFildes.Send(metaServerHost, ipport.c_str(), ipport.size());
|
|
||||||
return 0;
|
|
||||||
} else {
|
|
||||||
fprintf(stderr, "METACLIENT: failed to create game: %s\n", log.entry.c_str());
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -39,7 +39,6 @@
|
||||||
|
|
||||||
#include "interface.h"
|
#include "interface.h"
|
||||||
#include "map.h"
|
#include "map.h"
|
||||||
#include "master.h"
|
|
||||||
#include "network.h"
|
#include "network.h"
|
||||||
#include "parameters.h"
|
#include "parameters.h"
|
||||||
#include "player.h"
|
#include "player.h"
|
||||||
|
|
|
@ -584,7 +584,7 @@ protected:
|
||||||
int send(Context *ctx, BNCSOutputStream *buf);
|
int send(Context *ctx, BNCSOutputStream *buf);
|
||||||
};
|
};
|
||||||
|
|
||||||
class Context {
|
class Context : public OnlineContext {
|
||||||
public:
|
public:
|
||||||
Context() {
|
Context() {
|
||||||
this->udpSocket = new CUDPSocket();
|
this->udpSocket = new CUDPSocket();
|
||||||
|
@ -606,7 +606,29 @@ public:
|
||||||
delete host;
|
delete host;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
boolean isConnected() {
|
||||||
|
return !getCurrentChannel().empty();
|
||||||
|
}
|
||||||
|
|
||||||
// User and UI actions
|
// User and UI actions
|
||||||
|
void disconnect() {
|
||||||
|
if (isConnected()) {
|
||||||
|
// SID_STOPADV: according to bnetdocs.org, this is always sent when
|
||||||
|
// clients disconnect, regardless of state
|
||||||
|
BNCSOutputStream stop(0x02);
|
||||||
|
stop.flush(tcpSocket);
|
||||||
|
// SID_LEAVECHAT
|
||||||
|
BNCSOutputStream leave(0x10);
|
||||||
|
leave.flush(tcpSocket);
|
||||||
|
}
|
||||||
|
udpSocket->Close();
|
||||||
|
tcpSocket->Close();
|
||||||
|
state = NULL;
|
||||||
|
clientToken = MyRand();
|
||||||
|
username = "";
|
||||||
|
setPassword("");
|
||||||
|
}
|
||||||
|
|
||||||
void sendText(std::string txt) {
|
void sendText(std::string txt) {
|
||||||
// C>S 0x0E SID_CHATCOMMAND
|
// C>S 0x0E SID_CHATCOMMAND
|
||||||
int pos = 0;
|
int pos = 0;
|
||||||
|
@ -759,7 +781,7 @@ public:
|
||||||
|
|
||||||
BNCSInputStream *getMsgIStream() { return istream; }
|
BNCSInputStream *getMsgIStream() { return istream; }
|
||||||
|
|
||||||
void doOneStep() { this->state->doOneStep(this); }
|
virtual void doOneStep() { if (this->state != NULL) this->state->doOneStep(this); }
|
||||||
|
|
||||||
void setState(NetworkState* newState) {
|
void setState(NetworkState* newState) {
|
||||||
assert (newState != this->state);
|
assert (newState != this->state);
|
||||||
|
@ -808,6 +830,7 @@ public:
|
||||||
std::cout << message << std::endl;
|
std::cout << message << std::endl;
|
||||||
ctx->showInfo(message);
|
ctx->showInfo(message);
|
||||||
hasPrinted = true;
|
hasPrinted = true;
|
||||||
|
ctx->disconnect();
|
||||||
}
|
}
|
||||||
// the end
|
// the end
|
||||||
}
|
}
|
||||||
|
@ -822,6 +845,7 @@ class C2S_GAMERESULT_OR_STOPADV : public NetworkState {
|
||||||
// TODO - wait until the game lobby is left or the game is over and then send the result
|
// TODO - wait until the game lobby is left or the game is over and then send the result
|
||||||
// C>S 0x02 SID_STOPADV
|
// C>S 0x02 SID_STOPADV
|
||||||
// C>S 0x2C SID_GAMERESULT
|
// C>S 0x2C SID_GAMERESULT
|
||||||
|
// C>S 0x22 SID_NOTIFYJOIN
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -850,6 +874,7 @@ public:
|
||||||
|
|
||||||
switch (msg) {
|
switch (msg) {
|
||||||
case 0x00: // SID_NULL
|
case 0x00: // SID_NULL
|
||||||
|
handleNull(ctx);
|
||||||
break;
|
break;
|
||||||
case 0x25: // SID_PING
|
case 0x25: // SID_PING
|
||||||
handlePing(ctx);
|
handlePing(ctx);
|
||||||
|
@ -894,9 +919,13 @@ public:
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
void handleNull(Context *ctx) {
|
||||||
|
BNCSOutputStream buffer(0x00);
|
||||||
|
send(ctx, &buffer);
|
||||||
|
}
|
||||||
|
|
||||||
void handlePing(Context *ctx) {
|
void handlePing(Context *ctx) {
|
||||||
uint32_t pingValue = ctx->getMsgIStream()->read32();
|
uint32_t pingValue = ctx->getMsgIStream()->read32();
|
||||||
ctx->getMsgIStream()->finishMessage();
|
|
||||||
BNCSOutputStream buffer(0x25);
|
BNCSOutputStream buffer(0x25);
|
||||||
buffer.serialize32(pingValue);
|
buffer.serialize32(pingValue);
|
||||||
send(ctx, &buffer);
|
send(ctx, &buffer);
|
||||||
|
@ -1585,12 +1614,13 @@ static gcn::Container *loginWindowContainer;
|
||||||
static gcn::TextField *username;
|
static gcn::TextField *username;
|
||||||
static gcn::TextField *password;
|
static gcn::TextField *password;
|
||||||
|
|
||||||
static Context *ctx;
|
static Context _ctx;
|
||||||
|
Context *OnlineContext = &_ctx;
|
||||||
|
|
||||||
class ChatInputListener : public gcn::ActionListener {
|
class ChatInputListener : public gcn::ActionListener {
|
||||||
virtual void action(const std::string &) {
|
virtual void action(const std::string &) {
|
||||||
if (!ctx->getCurrentChannel().empty()) {
|
if (!OnlineContext->getCurrentChannel().empty()) {
|
||||||
ctx->sendText(chatInput->getText());
|
OnlineContext->sendText(chatInput->getText());
|
||||||
chatInput->setText("");
|
chatInput->setText("");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1598,15 +1628,15 @@ class ChatInputListener : public gcn::ActionListener {
|
||||||
|
|
||||||
class UsernameInputListener : public gcn::ActionListener {
|
class UsernameInputListener : public gcn::ActionListener {
|
||||||
virtual void action(const std::string &) {
|
virtual void action(const std::string &) {
|
||||||
ctx->setUsername(username->getText());
|
OnlineContext->setUsername(username->getText());
|
||||||
ctx->setPassword(password->getText());
|
OnlineContext->setPassword(password->getText());
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
class PasswordInputListener : public gcn::ActionListener {
|
class PasswordInputListener : public gcn::ActionListener {
|
||||||
virtual void action(const std::string &) {
|
virtual void action(const std::string &) {
|
||||||
ctx->setUsername(username->getText());
|
OnlineContext->setUsername(username->getText());
|
||||||
ctx->setPassword(password->getText());
|
OnlineContext->setPassword(password->getText());
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -1619,9 +1649,7 @@ void GoOnline() {
|
||||||
gcn::Widget *oldTop = Gui->getTop();
|
gcn::Widget *oldTop = Gui->getTop();
|
||||||
Gui->setUseDirtyDrawing(false);
|
Gui->setUseDirtyDrawing(false);
|
||||||
|
|
||||||
ctx = new Context();
|
OnlineContext->setState(new ConnectState());
|
||||||
ctx->setHost(MetaClient.GetMetaServer());
|
|
||||||
ctx->setState(new ConnectState());
|
|
||||||
|
|
||||||
onlineServiceContainer = new gcn::Container();
|
onlineServiceContainer = new gcn::Container();
|
||||||
onlineServiceContainer->setDimension(gcn::Rectangle(0, 0, Video.Width, Video.Height));
|
onlineServiceContainer->setDimension(gcn::Rectangle(0, 0, Video.Width, Video.Height));
|
||||||
|
@ -1695,19 +1723,17 @@ void GoOnline() {
|
||||||
InterfaceState = IfaceStateNormal;
|
InterfaceState = IfaceStateNormal;
|
||||||
UI.SelectedViewport = UI.Viewports;
|
UI.SelectedViewport = UI.Viewports;
|
||||||
while (1) {
|
while (1) {
|
||||||
ctx->doOneStep();
|
if (OnlineContext->isConnected()) {
|
||||||
|
|
||||||
if (!ctx->getCurrentChannel().empty()) {
|
|
||||||
loginWindow->setVisible(false);
|
loginWindow->setVisible(false);
|
||||||
|
|
||||||
if ((FrameCounter % (FRAMES_PER_SECOND * 5)) == 0) {
|
if ((FrameCounter % (FRAMES_PER_SECOND * 5)) == 0) {
|
||||||
ctx->refreshGames();
|
OnlineContext->refreshGames();
|
||||||
ctx->refreshFriends();
|
OnlineContext->refreshFriends();
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((FrameCounter % (FRAMES_PER_SECOND * 1)) == 0) {
|
if ((FrameCounter % (FRAMES_PER_SECOND * 1)) == 0) {
|
||||||
static_cast<gcn::TextBox*>(gamelistArea->getContent())->setText("");
|
static_cast<gcn::TextBox*>(gamelistArea->getContent())->setText("");
|
||||||
for (auto g : ctx->getGames()) {
|
for (auto g : OnlineContext->getGames()) {
|
||||||
static_cast<gcn::TextBox*>(gamelistArea->getContent())->addRow(g->getMap() + " " +
|
static_cast<gcn::TextBox*>(gamelistArea->getContent())->addRow(g->getMap() + " " +
|
||||||
g->getCreator() + " " +
|
g->getCreator() + " " +
|
||||||
g->getGameType() + " " +
|
g->getGameType() + " " +
|
||||||
|
@ -1716,25 +1742,25 @@ void GoOnline() {
|
||||||
}
|
}
|
||||||
|
|
||||||
static_cast<gcn::TextBox*>(usersArea->getContent())->setText("");
|
static_cast<gcn::TextBox*>(usersArea->getContent())->setText("");
|
||||||
for (auto u : ctx->getUsers()) {
|
for (auto u : OnlineContext->getUsers()) {
|
||||||
static_cast<gcn::TextBox*>(usersArea->getContent())->addRow(u);
|
static_cast<gcn::TextBox*>(usersArea->getContent())->addRow(u);
|
||||||
}
|
}
|
||||||
|
|
||||||
static_cast<gcn::TextBox*>(channelsArea->getContent())->setText("");
|
static_cast<gcn::TextBox*>(channelsArea->getContent())->setText("");
|
||||||
for (auto u : ctx->getChannels()) {
|
for (auto u : OnlineContext->getChannels()) {
|
||||||
static_cast<gcn::TextBox*>(channelsArea->getContent())->addRow(u);
|
static_cast<gcn::TextBox*>(channelsArea->getContent())->addRow(u);
|
||||||
}
|
}
|
||||||
|
|
||||||
static_cast<gcn::TextBox*>(friendsArea->getContent())->setText("");
|
static_cast<gcn::TextBox*>(friendsArea->getContent())->setText("");
|
||||||
for (auto u : ctx->getFriends()) {
|
for (auto u : OnlineContext->getFriends()) {
|
||||||
static_cast<gcn::TextBox*>(friendsArea->getContent())->addRow(u->getName() + ", " + u->getStatus() + ", " + u->getProduct());
|
static_cast<gcn::TextBox*>(friendsArea->getContent())->addRow(u->getName() + ", " + u->getStatus() + ", " + u->getProduct());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
while (!ctx->getInfo()->empty()) {
|
while (!OnlineContext->getInfo()->empty()) {
|
||||||
static_cast<gcn::TextBox*>(messageArea->getContent())->addRow(ctx->getInfo()->front());
|
static_cast<gcn::TextBox*>(messageArea->getContent())->addRow(OnlineContext->getInfo()->front());
|
||||||
ctx->getInfo()->pop();
|
OnlineContext->getInfo()->pop();
|
||||||
}
|
}
|
||||||
|
|
||||||
Gui->draw();
|
Gui->draw();
|
||||||
|
|
|
@ -1,23 +0,0 @@
|
||||||
$#include "master.h"
|
|
||||||
|
|
||||||
struct CClientLog
|
|
||||||
{
|
|
||||||
std::string entry;
|
|
||||||
};
|
|
||||||
|
|
||||||
class CMetaClient
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
CMetaClient();
|
|
||||||
void SetMetaServer(const std::string host, const int port);
|
|
||||||
int Init();
|
|
||||||
void Close();
|
|
||||||
int Send(const std::string cmd);
|
|
||||||
int Recv();
|
|
||||||
int GetLastRecvState() { return lastRecvState; }
|
|
||||||
int GetLogSize() { return events.size(); }
|
|
||||||
CClientLog* GetLastMessage() { return events.back(); }
|
|
||||||
int CreateGame(std::string desc, std::string map, std::string players);
|
|
||||||
};
|
|
||||||
|
|
||||||
CMetaClient MetaClient;
|
|
|
@ -35,6 +35,7 @@
|
||||||
----------------------------------------------------------------------------*/
|
----------------------------------------------------------------------------*/
|
||||||
|
|
||||||
#include "stratagus.h"
|
#include "stratagus.h"
|
||||||
|
#include "online_service.h"
|
||||||
|
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
#include <signal.h>
|
#include <signal.h>
|
||||||
|
@ -676,6 +677,10 @@ void WaitEventsOneFrame()
|
||||||
GetCallbacks()->NetworkEvent();
|
GetCallbacks()->NetworkEvent();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Online session
|
||||||
|
OnlineContextHandler->doOneStep();
|
||||||
|
|
||||||
// No more input and time for frame over: return
|
// No more input and time for frame over: return
|
||||||
if (!i && s <= 0 && interrupts) {
|
if (!i && s <= 0 && interrupts) {
|
||||||
break;
|
break;
|
||||||
|
|
Loading…
Reference in a new issue