浏览代码

Server functionality

Laserlicht 1 年之前
父节点
当前提交
0565c062e5

+ 4 - 1
client/GameChatHandler.cpp

@@ -75,7 +75,10 @@ void GameChatHandler::onNewLobbyMessageReceived(const std::string & senderName,
 
 		lobby->card->chat->addNewMessage(formatted.toString());
 		if (lobby->card->chatMode != InfoCard::ChatMode::Enabled)
-				lobby->card->setChat(InfoCard::ChatMode::Enabled);
+		{
+			lobby->card->setChat(InfoCard::ChatMode::Disabled);
+			lobby->toggleChat();
+		}	
 	}
 
 	chatHistory.push_back({senderName, messageText, TextOperations::getCurrentFormattedTimeLocal()});

+ 20 - 1
client/lobby/CSelectionBase.cpp

@@ -49,6 +49,7 @@
 #include "../../lib/filesystem/Filesystem.h"
 #include "../../lib/mapping/CMapHeader.h"
 #include "../../lib/mapping/CMapInfo.h"
+#include "../../lib/networkPacks/PacksForLobby.h"
 
 ISelectionScreenInfo::ISelectionScreenInfo(ESelectionScreen ScreenType)
 	: screenType(ScreenType)
@@ -402,8 +403,26 @@ PvPBox::PvPBox(const Rect & rect)
 	pos += rect.topLeft();
 	setRedrawParent(true);
 
-	buttonFlipCoin = std::make_shared<CButton>(Point(17, 160), AnimationPath::builtin("GSPBUT2.DEF"), CButton::tooltip("flip coin"), [](){ std::cout << "coin flip"; }, EShortcut::NONE);
+	buttonFlipCoin = std::make_shared<CButton>(Point(17, 160), AnimationPath::builtin("GSPBUT2.DEF"), CButton::tooltip("flip coin"), [](){
+		LobbyPvPAction lpa;
+		lpa.action = LobbyPvPAction::COIN;
+		CSH->sendLobbyPack(lpa);
+	}, EShortcut::NONE);
 	buttonFlipCoin->setTextOverlay("Flip coin2", EFonts::FONT_SMALL, Colors::WHITE);
+
+	buttonRandomTown = std::make_shared<CButton>(Point(17, 184), AnimationPath::builtin("GSPBUT2.DEF"), CButton::tooltip("random town"), [](){
+		LobbyPvPAction lpa;
+		lpa.action = LobbyPvPAction::RANDOM_TOWN;
+		CSH->sendLobbyPack(lpa);
+	}, EShortcut::NONE);
+	buttonRandomTown->setTextOverlay("random town", EFonts::FONT_SMALL, Colors::WHITE);
+
+	buttonRandomTownVs = std::make_shared<CButton>(Point(17, 208), AnimationPath::builtin("GSPBUT2.DEF"), CButton::tooltip("random town vs"), [](){
+		LobbyPvPAction lpa;
+		lpa.action = LobbyPvPAction::RANDOM_TOWN_VS;
+		CSH->sendLobbyPack(lpa);
+	}, EShortcut::NONE);
+	buttonRandomTownVs->setTextOverlay("random town vs", EFonts::FONT_SMALL, Colors::WHITE);
 }
 
 CFlagBox::CFlagBox(const Rect & rect)

+ 2 - 0
client/lobby/CSelectionBase.h

@@ -147,6 +147,8 @@ class PvPBox : public CIntObject
 {
 public:
 	std::shared_ptr<CButton> buttonFlipCoin;
+	std::shared_ptr<CButton> buttonRandomTown;
+	std::shared_ptr<CButton> buttonRandomTownVs;
 
 	PvPBox(const Rect & rect);
 };

+ 1 - 0
lib/networkPacks/NetPackVisitor.h

@@ -172,6 +172,7 @@ public:
 	virtual void visitLobbySetDifficulty(LobbySetDifficulty & pack) {}
 	virtual void visitLobbyForceSetPlayer(LobbyForceSetPlayer & pack) {}
 	virtual void visitLobbyShowMessage(LobbyShowMessage & pack) {}
+	virtual void visitLobbyPvPAction(LobbyPvPAction & pack) {}
 };
 
 VCMI_LIB_NAMESPACE_END

+ 5 - 0
lib/networkPacks/NetPacksLib.cpp

@@ -813,6 +813,11 @@ void LobbyShowMessage::visitTyped(ICPackVisitor & visitor)
 	visitor.visitLobbyShowMessage(*this);
 }
 
+void LobbyPvPAction::visitTyped(ICPackVisitor & visitor)
+{
+	visitor.visitLobbyPvPAction(*this);
+}
+
 void SetResources::applyGs(CGameState * gs) const
 {
 	assert(player.isValidPlayer());

+ 15 - 0
lib/networkPacks/PacksForLobby.h

@@ -343,4 +343,19 @@ struct DLL_LINKAGE LobbyShowMessage : public CLobbyPackToPropagate
 	}
 };
 
+struct DLL_LINKAGE LobbyPvPAction : public CLobbyPackToServer
+{
+	enum EAction : ui8 {
+		NONE, COIN, RANDOM_TOWN, RANDOM_TOWN_VS
+	} action = NONE;
+
+
+	void visitTyped(ICPackVisitor & visitor) override;
+
+	template <typename Handler> void serialize(Handler &h)
+	{
+		h & action;
+	}
+};
+
 VCMI_LIB_NAMESPACE_END

+ 1 - 0
lib/registerTypes/RegisterTypesLobbyPacks.h

@@ -59,6 +59,7 @@ void registerTypesLobbyPacks(Serializer &s)
 	s.template registerType<CLobbyPackToServer, LobbySetDifficulty>();
 	s.template registerType<CLobbyPackToServer, LobbyForceSetPlayer>();
 	s.template registerType<CLobbyPackToServer, LobbySetExtraOptions>();
+	s.template registerType<CLobbyPackToServer, LobbyPvPAction>();
 }
 
 VCMI_LIB_NAMESPACE_END

+ 1 - 0
server/LobbyNetPackVisitors.h

@@ -93,4 +93,5 @@ public:
 	void visitLobbySetSimturns(LobbySetSimturns & pack) override;
 	void visitLobbySetDifficulty(LobbySetDifficulty & pack) override;
 	void visitLobbyForceSetPlayer(LobbyForceSetPlayer & pack) override;
+	void visitLobbyPvPAction(LobbyPvPAction & pack) override;
 };

+ 29 - 0
server/NetPacksLobbyServer.cpp

@@ -18,6 +18,9 @@
 
 #include "../lib/campaign/CampaignState.h"
 #include "../lib/serializer/Connection.h"
+#include "../lib/mapping/CMapInfo.h"
+#include "../lib/mapping/CMapHeader.h"
+#include "../lib/CTownHandler.h"
 
 void ClientPermissionsCheckerNetPackVisitor::visitForLobby(CPackForLobby & pack)
 {
@@ -366,3 +369,29 @@ void ApplyOnServerNetPackVisitor::visitLobbyForceSetPlayer(LobbyForceSetPlayer &
 	srv.si->playerInfos[pack.targetPlayerColor].connectedPlayerIDs.insert(pack.targetConnectedPlayer);
 	result = true;
 }
+
+void ApplyOnServerNetPackVisitor::visitLobbyPvPAction(LobbyPvPAction & pack)
+{
+	std::set<FactionID> allowedFactions;
+	for(auto & player : srv.mi->mapHeader->players)
+	{
+		std::set<FactionID> tmpAllowedFactions = player.allowedFactions;
+		std::set_union(std::begin(tmpAllowedFactions), std::end(tmpAllowedFactions), std::begin(allowedFactions), std::end(allowedFactions), std::inserter(allowedFactions, std::begin(allowedFactions)));
+	}
+
+	std::vector<FactionID> randomFactions;
+	std::sample(allowedFactions.begin(), allowedFactions.end(), std::back_inserter(randomFactions), 2, std::mt19937{std::random_device{}()});
+
+	switch(pack.action) {
+		case LobbyPvPAction::COIN:
+			srv.announceTxt("Coin - " + std::to_string(std::rand()%2));
+			break;
+		case LobbyPvPAction::RANDOM_TOWN:
+			srv.announceTxt("Faction - " + VLC->townh->getById(randomFactions[0])->getNameTranslated());
+			break;
+		case LobbyPvPAction::RANDOM_TOWN_VS:
+			srv.announceTxt("Factions - " + VLC->townh->getById(randomFactions[0])->getNameTranslated() + " vs. " + VLC->townh->getById(randomFactions[randomFactions.size() > 1 ? 1 : 0])->getNameTranslated());
+			break;
+	}
+	result = true;
+}