- Fix a bug with chosen map (new clinet gets wrong information)
authorunc0rr
Thu, 09 Oct 2008 15:54:09 +0000
changeset 1333 b0b0510eb82d
parent 1332 19ff9bf7d69e
child 1334 b58afaadf7ae
- Fix a bug with chosen map (new clinet gets wrong information) - Fix mapContainer bug when switching quickly from random map to a painted one
QTfrontend/mapContainer.cpp
QTfrontend/newnetclient.cpp
netserver/HWProto.hs
netserver/Miscutils.hs
--- a/QTfrontend/mapContainer.cpp	Thu Oct 09 13:57:18 2008 +0000
+++ b/QTfrontend/mapContainer.cpp	Thu Oct 09 15:54:09 2008 +0000
@@ -35,7 +35,9 @@
 #include "igbox.h"
 
 HWMapContainer::HWMapContainer(QWidget * parent) :
-  QWidget(parent), mainLayout(this)
+	QWidget(parent),
+	mainLayout(this),
+	pMap(0)
 {
 #if QT_VERSION >= 0x040300
   mainLayout.setContentsMargins(QApplication::style()->pixelMetric(QStyle::PM_LayoutLeftMargin),
@@ -111,12 +113,14 @@
   imageButt->setIcon(pxres);
   imageButt->setIconSize(QSize(256, 128));
   chooseMap->setCurrentIndex(0);
+  pMap = 0;
 }
 
 void HWMapContainer::mapChanged(int index)
 {
   if(!index) {
     changeImage();
+    emit mapChanged("+rnd+");
     return;
   }
 
@@ -185,10 +189,18 @@
 
 void HWMapContainer::setMap(const QString & map)
 {
+	if(map == "+rnd+")
+	{
+		changeImage();
+		return;
+	}
+	
 	int id = chooseMap->findText(map);
-	if(id >= 0) {
+	if(id > 0) {
 		chooseMap->setCurrentIndex(id);
 		loadMap(id);
+		if (pMap)
+			disconnect(pMap, 0, this, SLOT(setImage(const QImage)));
 	}
 }
 
--- a/QTfrontend/newnetclient.cpp	Thu Oct 09 13:57:18 2008 +0000
+++ b/QTfrontend/newnetclient.cpp	Thu Oct 09 15:54:09 2008 +0000
@@ -299,7 +299,6 @@
 		return;
 	}
 
-
 	if (lst[0] == "TEAM_ACCEPTED") {
 		if (lst.size() != 2)
 		{
@@ -310,6 +309,17 @@
 		return;
 	}
 
+	if (lst[0] == "MAP") {
+		if (lst.size() != 2)
+		{
+			qWarning("Net: Bad MAP message");
+			return;
+		}
+		emit mapChanged(lst[1]);
+		return;
+	}
+
+
 	if (lst[0] == "CONFIG_PARAM") {
 		if(lst.size() < 3)
 		{
@@ -320,10 +330,6 @@
 			emit seedChanged(lst[2]);
 			return;
 		}
-		if (lst[1] == "MAP") {
-			emit mapChanged(lst[2]);
-			return;
-		}
 		if (lst[1] == "THEME") {
 			emit themeChanged(lst[2]);
 			return;
@@ -433,7 +439,7 @@
 
 void HWNewNet::onMapChanged(const QString & map)
 {
-  if (isChief) RawSendNet(QString("CONFIG_PARAM%1MAP%1%2").arg(delimeter).arg(map));
+  if (isChief) RawSendNet(QString("MAP%1%2").arg(delimeter).arg(map));
 }
 
 void HWNewNet::onThemeChanged(const QString & theme)
--- a/netserver/HWProto.hs	Thu Oct 09 13:57:18 2008 +0000
+++ b/netserver/HWProto.hs	Thu Oct 09 15:54:09 2008 +0000
@@ -30,7 +30,7 @@
 answerWrongPassword = [(clientOnly, ["WARNING", "Wrong password"])]
 answerChatString nick msg = [(othersInRoom, ["CHAT_STRING", nick, msg])]
 answerConfigParam paramName paramStrs = [(othersInRoom, "CONFIG_PARAM" : paramName : paramStrs)]
-answerFullConfig room = map toAnswer (Map.toList $ params room)
+answerFullConfig room = map toAnswer (Map.toList $ params room) ++ [(clientOnly, ["MAP", gamemap room])]
 	where
 		toAnswer (paramName, paramStrs) =
 			(clientOnly, "CONFIG_PARAM" : paramName : paramStrs)
@@ -47,6 +47,7 @@
 			[(clientOnly, teamToNet team),
 			(clientOnly, ["TEAM_COLOR", teamname team, teamcolor team]),
 			(clientOnly, ["HH_NUM", teamname team, show $ hhnum team])]
+answerMap mapName = [(othersInRoom, ["MAP", mapName])]
 
 -- Main state-independent cmd handler
 handleCmd :: CmdHandler
@@ -103,7 +104,7 @@
 	if haveSameRoom then
 		(noChangeClients, noChangeRooms, answerRoomExists)
 	else
-		(modifyClient client{room = newRoom, isMaster = True}, addRoom (RoomInfo newRoom roomPassword (protocol client) [] Map.empty), answerJoined $ nick client)
+		(modifyClient client{room = newRoom, isMaster = True}, addRoom (RoomInfo newRoom roomPassword (protocol client) [] "+rnd+" Map.empty), answerJoined $ nick client)
 	where
 		haveSameRoom = isJust $ find (\room -> newRoom == name room) rooms
 
@@ -141,6 +142,14 @@
 	where
 		clRoom = roomByName (room client) rooms
 
+handleCmd_inRoom client _ rooms ["MAP", mapName] =
+	if isMaster client then
+		(noChangeClients, modifyRoom clRoom{gamemap = mapName}, answerMap mapName)
+	else
+		(noChangeClients, noChangeRooms, answerNotMaster)
+	where
+		clRoom = roomByName (room client) rooms
+
 handleCmd_inRoom client _ rooms ("ADD_TEAM" : name : color : grave : fort : difStr : hhsInfo)
 	| length hhsInfo == 16 =
 	if length (teams clRoom) == 6 || canAddNumber <= 0 || isJust findTeam then
--- a/netserver/Miscutils.hs	Thu Oct 09 13:57:18 2008 +0000
+++ b/netserver/Miscutils.hs	Thu Oct 09 15:54:09 2008 +0000
@@ -45,6 +45,7 @@
 		password :: String,
 		roomProto :: Word16,
 		teams :: [TeamInfo],
+		gamemap :: String,
 		params :: Map.Map String [String]
 	}