mirror of
https://github.com/vcmi/vcmi.git
synced 2025-04-27 12:22:45 +02:00
Simplified applying of lobby packs
This commit is contained in:
parent
22f0ca67c6
commit
8ea69e457a
@ -451,7 +451,6 @@ static void mainLoop()
|
|||||||
while(1) //main SDL events loop
|
while(1) //main SDL events loop
|
||||||
{
|
{
|
||||||
GH.input().fetchEvents();
|
GH.input().fetchEvents();
|
||||||
CSH->applyPacksOnLobbyScreen();
|
|
||||||
GH.renderFrame();
|
GH.renderFrame();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -76,8 +76,8 @@ extern std::atomic_bool androidTestServerReadyFlag;
|
|||||||
class CBaseForLobbyApply
|
class CBaseForLobbyApply
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
virtual bool applyOnLobbyHandler(CServerHandler * handler, void * pack) const = 0;
|
virtual bool applyOnLobbyHandler(CServerHandler * handler, CPackForLobby & pack) const = 0;
|
||||||
virtual void applyOnLobbyScreen(CLobbyScreen * lobby, CServerHandler * handler, void * pack) const = 0;
|
virtual void applyOnLobbyScreen(CLobbyScreen * lobby, CServerHandler * handler, CPackForLobby & pack) const = 0;
|
||||||
virtual ~CBaseForLobbyApply(){};
|
virtual ~CBaseForLobbyApply(){};
|
||||||
template<typename U> static CBaseForLobbyApply * getApplier(const U * t = nullptr)
|
template<typename U> static CBaseForLobbyApply * getApplier(const U * t = nullptr)
|
||||||
{
|
{
|
||||||
@ -88,40 +88,40 @@ public:
|
|||||||
template<typename T> class CApplyOnLobby : public CBaseForLobbyApply
|
template<typename T> class CApplyOnLobby : public CBaseForLobbyApply
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
bool applyOnLobbyHandler(CServerHandler * handler, void * pack) const override
|
bool applyOnLobbyHandler(CServerHandler * handler, CPackForLobby & pack) const override
|
||||||
{
|
{
|
||||||
boost::mutex::scoped_lock interfaceLock(GH.interfaceMutex);
|
boost::mutex::scoped_lock interfaceLock(GH.interfaceMutex);
|
||||||
|
|
||||||
T * ptr = static_cast<T *>(pack);
|
T & ptr = static_cast<T &>(pack);
|
||||||
ApplyOnLobbyHandlerNetPackVisitor visitor(*handler);
|
ApplyOnLobbyHandlerNetPackVisitor visitor(*handler);
|
||||||
|
|
||||||
logNetwork->trace("\tImmediately apply on lobby: %s", typeid(ptr).name());
|
logNetwork->trace("\tImmediately apply on lobby: %s", typeid(ptr).name());
|
||||||
ptr->visit(visitor);
|
ptr.visit(visitor);
|
||||||
|
|
||||||
return visitor.getResult();
|
return visitor.getResult();
|
||||||
}
|
}
|
||||||
|
|
||||||
void applyOnLobbyScreen(CLobbyScreen * lobby, CServerHandler * handler, void * pack) const override
|
void applyOnLobbyScreen(CLobbyScreen * lobby, CServerHandler * handler, CPackForLobby & pack) const override
|
||||||
{
|
{
|
||||||
T * ptr = static_cast<T *>(pack);
|
T & ptr = static_cast<T &>(pack);
|
||||||
ApplyOnLobbyScreenNetPackVisitor visitor(*handler, lobby);
|
ApplyOnLobbyScreenNetPackVisitor visitor(*handler, lobby);
|
||||||
|
|
||||||
logNetwork->trace("\tApply on lobby from queue: %s", typeid(ptr).name());
|
logNetwork->trace("\tApply on lobby from queue: %s", typeid(ptr).name());
|
||||||
ptr->visit(visitor);
|
ptr.visit(visitor);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
template<> class CApplyOnLobby<CPack>: public CBaseForLobbyApply
|
template<> class CApplyOnLobby<CPack>: public CBaseForLobbyApply
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
bool applyOnLobbyHandler(CServerHandler * handler, void * pack) const override
|
bool applyOnLobbyHandler(CServerHandler * handler, CPackForLobby & pack) const override
|
||||||
{
|
{
|
||||||
logGlobal->error("Cannot apply plain CPack!");
|
logGlobal->error("Cannot apply plain CPack!");
|
||||||
assert(0);
|
assert(0);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void applyOnLobbyScreen(CLobbyScreen * lobby, CServerHandler * handler, void * pack) const override
|
void applyOnLobbyScreen(CLobbyScreen * lobby, CServerHandler * handler, CPackForLobby & pack) const override
|
||||||
{
|
{
|
||||||
logGlobal->error("Cannot apply plain CPack!");
|
logGlobal->error("Cannot apply plain CPack!");
|
||||||
assert(0);
|
assert(0);
|
||||||
@ -139,7 +139,6 @@ CServerHandler::~CServerHandler()
|
|||||||
|
|
||||||
CServerHandler::CServerHandler()
|
CServerHandler::CServerHandler()
|
||||||
: state(EClientState::NONE)
|
: state(EClientState::NONE)
|
||||||
, mx(std::make_shared<boost::recursive_mutex>())
|
|
||||||
, networkClient(std::make_unique<NetworkClient>(*this))
|
, networkClient(std::make_unique<NetworkClient>(*this))
|
||||||
, client(nullptr)
|
, client(nullptr)
|
||||||
, loadMode(0)
|
, loadMode(0)
|
||||||
@ -170,7 +169,6 @@ void CServerHandler::resetStateForLobby(const StartInfo::EMode mode, const std::
|
|||||||
state = EClientState::NONE;
|
state = EClientState::NONE;
|
||||||
mapToStart = nullptr;
|
mapToStart = nullptr;
|
||||||
th = std::make_unique<CStopWatch>();
|
th = std::make_unique<CStopWatch>();
|
||||||
packsForLobbyScreen.clear();
|
|
||||||
c.reset();
|
c.reset();
|
||||||
si = std::make_shared<StartInfo>();
|
si = std::make_shared<StartInfo>();
|
||||||
playerNames.clear();
|
playerNames.clear();
|
||||||
@ -321,19 +319,12 @@ void CServerHandler::onConnectionEstablished(const std::shared_ptr<NetworkConnec
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void CServerHandler::applyPacksOnLobbyScreen()
|
void CServerHandler::applyPackOnLobbyScreen(CPackForLobby & pack)
|
||||||
{
|
{
|
||||||
boost::unique_lock<boost::recursive_mutex> lock(*mx);
|
|
||||||
while(!packsForLobbyScreen.empty())
|
|
||||||
{
|
|
||||||
boost::mutex::scoped_lock interfaceLock(GH.interfaceMutex);
|
boost::mutex::scoped_lock interfaceLock(GH.interfaceMutex);
|
||||||
CPackForLobby * pack = packsForLobbyScreen.front();
|
CBaseForLobbyApply * apply = applier->getApplier(CTypeList::getInstance().getTypeID(&pack)); //find the applier
|
||||||
packsForLobbyScreen.pop_front();
|
|
||||||
CBaseForLobbyApply * apply = applier->getApplier(CTypeList::getInstance().getTypeID(pack)); //find the applier
|
|
||||||
apply->applyOnLobbyScreen(dynamic_cast<CLobbyScreen *>(SEL), this, pack);
|
apply->applyOnLobbyScreen(dynamic_cast<CLobbyScreen *>(SEL), this, pack);
|
||||||
GH.windows().totalRedraw();
|
GH.windows().totalRedraw();
|
||||||
delete pack;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
std::set<PlayerColor> CServerHandler::getHumanColors()
|
std::set<PlayerColor> CServerHandler::getHumanColors()
|
||||||
@ -956,23 +947,19 @@ void CServerHandler::onDisconnected(const std::shared_ptr<NetworkConnection> &)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
auto lcd = new LobbyClientDisconnected();
|
LobbyClientDisconnected lcd;
|
||||||
lcd->clientId = c->connectionID;
|
lcd.clientId = c->connectionID;
|
||||||
boost::unique_lock<boost::recursive_mutex> lock(*mx);
|
applyPackOnLobbyScreen(lcd);
|
||||||
packsForLobbyScreen.push_back(lcd);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void CServerHandler::visitForLobby(CPackForLobby & lobbyPack)
|
void CServerHandler::visitForLobby(CPackForLobby & lobbyPack)
|
||||||
{
|
{
|
||||||
if(applier->getApplier(CTypeList::getInstance().getTypeID(&lobbyPack))->applyOnLobbyHandler(this, &lobbyPack))
|
if(applier->getApplier(CTypeList::getInstance().getTypeID(&lobbyPack))->applyOnLobbyHandler(this, lobbyPack))
|
||||||
{
|
{
|
||||||
if(!settings["session"]["headless"].Bool())
|
if(!settings["session"]["headless"].Bool())
|
||||||
{
|
applyPackOnLobbyScreen(lobbyPack);
|
||||||
boost::unique_lock<boost::recursive_mutex> lock(*mx);
|
|
||||||
packsForLobbyScreen.push_back(&lobbyPack);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -83,21 +83,13 @@ public:
|
|||||||
/// structure to handle running server and connecting to it
|
/// structure to handle running server and connecting to it
|
||||||
class CServerHandler : public IServerAPI, public LobbyInfo, public INetworkClientListener, boost::noncopyable
|
class CServerHandler : public IServerAPI, public LobbyInfo, public INetworkClientListener, boost::noncopyable
|
||||||
{
|
{
|
||||||
std::unique_ptr<NetworkClient> networkClient;
|
|
||||||
|
|
||||||
friend class ApplyOnLobbyHandlerNetPackVisitor;
|
friend class ApplyOnLobbyHandlerNetPackVisitor;
|
||||||
|
|
||||||
|
std::unique_ptr<NetworkClient> networkClient;
|
||||||
std::shared_ptr<CApplier<CBaseForLobbyApply>> applier;
|
std::shared_ptr<CApplier<CBaseForLobbyApply>> applier;
|
||||||
|
|
||||||
std::shared_ptr<boost::recursive_mutex> mx;
|
|
||||||
std::list<CPackForLobby *> packsForLobbyScreen; //protected by mx
|
|
||||||
|
|
||||||
std::shared_ptr<CMapInfo> mapToStart;
|
std::shared_ptr<CMapInfo> mapToStart;
|
||||||
|
|
||||||
std::vector<std::string> myNames;
|
std::vector<std::string> myNames;
|
||||||
|
|
||||||
std::shared_ptr<HighScoreCalculation> highScoreCalc;
|
std::shared_ptr<HighScoreCalculation> highScoreCalc;
|
||||||
|
|
||||||
std::function<void()> onConnectedCallback;
|
std::function<void()> onConnectedCallback;
|
||||||
|
|
||||||
void threadRunNetwork();
|
void threadRunNetwork();
|
||||||
@ -110,6 +102,7 @@ class CServerHandler : public IServerAPI, public LobbyInfo, public INetworkClien
|
|||||||
void onConnectionEstablished(const std::shared_ptr<NetworkConnection> &) override;
|
void onConnectionEstablished(const std::shared_ptr<NetworkConnection> &) override;
|
||||||
void onDisconnected(const std::shared_ptr<NetworkConnection> &) override;
|
void onDisconnected(const std::shared_ptr<NetworkConnection> &) override;
|
||||||
|
|
||||||
|
void applyPackOnLobbyScreen(CPackForLobby & pack);
|
||||||
public:
|
public:
|
||||||
std::shared_ptr<CConnection> c;
|
std::shared_ptr<CConnection> c;
|
||||||
|
|
||||||
@ -143,7 +136,6 @@ public:
|
|||||||
void resetStateForLobby(const StartInfo::EMode mode, const std::vector<std::string> * names = nullptr);
|
void resetStateForLobby(const StartInfo::EMode mode, const std::vector<std::string> * names = nullptr);
|
||||||
void startLocalServerAndConnect(const std::function<void()> & onConnected);
|
void startLocalServerAndConnect(const std::function<void()> & onConnected);
|
||||||
void justConnectToServer(const std::string & addr, const ui16 port, const std::function<void()> & onConnected);
|
void justConnectToServer(const std::string & addr, const ui16 port, const std::function<void()> & onConnected);
|
||||||
void applyPacksOnLobbyScreen();
|
|
||||||
|
|
||||||
// Helpers for lobby state access
|
// Helpers for lobby state access
|
||||||
std::set<PlayerColor> getHumanColors();
|
std::set<PlayerColor> getHumanColors();
|
||||||
|
Loading…
x
Reference in New Issue
Block a user