1
0
mirror of https://github.com/vcmi/vcmi.git synced 2025-11-25 22:42:04 +02:00

Significantly simplify packs applying

Apparently our logic for packs applying with types registration is
overcomplicated and by now completely unnecessary - it became redundant
after introduction of visitor pattern.
This commit is contained in:
Ivan Savenko
2024-08-23 20:25:58 +00:00
parent 11e8b04ac5
commit b84af1a6de
12 changed files with 52 additions and 266 deletions

View File

@@ -17,7 +17,12 @@
#include "../lib/CHeroHandler.h"
#include "../lib/CPlayerState.h"
#include "../lib/registerTypes/RegisterTypesLobbyPacks.h"
#include "../lib/campaign/CampaignState.h"
#include "../lib/gameState/CGameState.h"
#include "../lib/mapping/CMapDefines.h"
#include "../lib/mapping/CMapInfo.h"
#include "../lib/mapping/CMapHeader.h"
#include "../lib/rmg/CMapGenOptions.h"
#include "../lib/serializer/CMemorySerializer.h"
#include "../lib/serializer/Connection.h"
#include "../lib/texts/CGeneralTextHandler.h"
@@ -28,64 +33,6 @@
#include <boost/uuid/uuid_generators.hpp>
#include <boost/program_options.hpp>
template<typename T> class CApplyOnServer;
class CBaseForServerApply
{
public:
virtual bool applyOnServerBefore(CVCMIServer * srv, CPack * pack) const =0;
virtual void applyOnServerAfter(CVCMIServer * srv, CPack * pack) const =0;
virtual ~CBaseForServerApply() {}
template<typename U> static CBaseForServerApply * getApplier(const U * t = nullptr)
{
return new CApplyOnServer<U>();
}
};
template <typename T> class CApplyOnServer : public CBaseForServerApply
{
public:
bool applyOnServerBefore(CVCMIServer * srv, CPack * pack) const override
{
T * ptr = static_cast<T *>(pack);
ClientPermissionsCheckerNetPackVisitor checker(*srv);
ptr->visit(checker);
if(checker.getResult())
{
ApplyOnServerNetPackVisitor applier(*srv);
ptr->visit(applier);
return applier.getResult();
}
else
return false;
}
void applyOnServerAfter(CVCMIServer * srv, CPack * pack) const override
{
T * ptr = static_cast<T *>(pack);
ApplyOnServerAfterAnnounceNetPackVisitor applier(*srv);
ptr->visit(applier);
}
};
template <>
class CApplyOnServer<CPack> : public CBaseForServerApply
{
public:
bool applyOnServerBefore(CVCMIServer * srv, CPack * pack) const override
{
logGlobal->error("Cannot apply plain CPack!");
assert(0);
return false;
}
void applyOnServerAfter(CVCMIServer * srv, CPack * pack) const override
{
logGlobal->error("Cannot apply plain CPack!");
assert(0);
}
};
class CVCMIServerPackVisitor : public VCMI_LIB_WRAP_NAMESPACE(ICPackVisitor)
{
private:
@@ -126,8 +73,6 @@ CVCMIServer::CVCMIServer(uint16_t port, bool runByClient)
{
uuid = boost::uuids::to_string(boost::uuids::random_generator()());
logNetwork->trace("CVCMIServer created! UUID: %s", uuid);
applier = std::make_shared<CApplier<CBaseForServerApply>>();
registerTypesLobbyPacks(*applier);
networkHandler = INetworkHandler::createHandler();
}
@@ -376,9 +321,16 @@ void CVCMIServer::onDisconnected(const std::shared_ptr<INetworkConnection> & con
void CVCMIServer::handleReceivedPack(std::unique_ptr<CPackForLobby> pack)
{
CBaseForServerApply * apply = applier->getApplier(CTypeList::getInstance().getTypeID(pack.get()));
if(apply->applyOnServerBefore(this, pack.get()))
announcePack(std::move(pack));
ClientPermissionsCheckerNetPackVisitor checker(*this);
pack->visit(checker);
if(checker.getResult())
{
ApplyOnServerNetPackVisitor applier(*this);
pack->visit(applier);
if (applier.getResult())
announcePack(std::move(pack));
}
}
void CVCMIServer::announcePack(std::unique_ptr<CPackForLobby> pack)
@@ -392,7 +344,8 @@ void CVCMIServer::announcePack(std::unique_ptr<CPackForLobby> pack)
activeConnection->sendPack(pack.get());
}
applier->getApplier(CTypeList::getInstance().getTypeID(pack.get()))->applyOnServerAfter(this, pack.get());
ApplyOnServerAfterAnnounceNetPackVisitor applier(*this);
pack->visit(applier);
}
void CVCMIServer::announceMessage(const MetaString & txt)