# HG changeset patch # User unc0rr # Date 1254562514 0 # Node ID 6c5d504af2ba5d3c1af74de938d2d17522e157b3 # Parent edd12b259e7caa3f24971e4d3024477d7f97fe02 - Proper /team command implementation - Many fixes for chat bugs in engine, frontend and server diff -r edd12b259e7c -r 6c5d504af2ba QTfrontend/game.cpp --- a/QTfrontend/game.cpp Fri Oct 02 18:56:54 2009 +0000 +++ b/QTfrontend/game.cpp Sat Oct 03 09:35:14 2009 +0000 @@ -224,9 +224,16 @@ int size = msg.size(); QString msgbody = QString::fromUtf8(msg.mid(2).left(size - 4)); emit SendChat(msgbody); - QByteArray buf; - HWProto::addStringToBuffer(buf, QString("s%1: %2\x20\x20").arg(config->netNick()).arg(msgbody)); - demo.append(buf); + // FIXME: /me command doesn't work here + //QByteArray buf; + //HWProto::addStringToBuffer(buf, QString("s\x01%1: %2\x20\x20").arg(config->netNick()).arg(msgbody)); + //demo.append(buf); + break; + } + case 'b': { + int size = msg.size(); + QString msgbody = QString::fromUtf8(msg.mid(2).left(size - 4)); + emit SendTeamMessage(msgbody); break; } default: { diff -r edd12b259e7c -r 6c5d504af2ba QTfrontend/game.h --- a/QTfrontend/game.h Fri Oct 02 18:56:54 2009 +0000 +++ b/QTfrontend/game.h Sat Oct 03 09:35:14 2009 +0000 @@ -60,6 +60,7 @@ signals: void SendNet(const QByteArray & msg); void SendChat(const QString & msg); + void SendTeamMessage(const QString & msg); void GameStateChanged(GameState gameState); void GameStats(char type, const QString & info); void HaveRecord(bool isDemo, const QByteArray & record); diff -r edd12b259e7c -r 6c5d504af2ba QTfrontend/hwform.cpp --- a/QTfrontend/hwform.cpp Fri Oct 02 18:56:54 2009 +0000 +++ b/QTfrontend/hwform.cpp Sat Oct 03 09:35:14 2009 +0000 @@ -873,6 +873,7 @@ connect(game, SIGNAL(SendNet(const QByteArray &)), hwnet, SLOT(SendNet(const QByteArray &))); connect(game, SIGNAL(SendChat(const QString &)), hwnet, SLOT(chatLineToNet(const QString &))); + connect(game, SIGNAL(SendTeamMessage(const QString &)), hwnet, SLOT(SendTeamMessage(const QString &))); connect(hwnet, SIGNAL(FromNet(const QByteArray &)), game, SLOT(FromNet(const QByteArray &))); connect(hwnet, SIGNAL(chatStringFromNet(const QString &)), game, SLOT(FromNetChat(const QString &))); diff -r edd12b259e7c -r 6c5d504af2ba QTfrontend/newnetclient.cpp --- a/QTfrontend/newnetclient.cpp Fri Oct 02 18:56:54 2009 +0000 +++ b/QTfrontend/newnetclient.cpp Sat Oct 03 09:35:14 2009 +0000 @@ -605,6 +605,11 @@ } } +void HWNewNet::SendTeamMessage(const QString& str) +{ + RawSendNet(QString("TEAMCHAT") + delimeter + str); +} + void HWNewNet::askRoomsList() { if(netClientState != 2) diff -r edd12b259e7c -r 6c5d504af2ba QTfrontend/newnetclient.h --- a/QTfrontend/newnetclient.h Fri Oct 02 18:56:54 2009 +0000 +++ b/QTfrontend/newnetclient.h Sat Oct 03 09:35:14 2009 +0000 @@ -122,6 +122,7 @@ void ToggleReady(); void chatLineToNet(const QString& str); void chatLineToLobby(const QString& str); + void SendTeamMessage(const QString& str); void SendNet(const QByteArray & buf); void AddTeam(const HWTeam & team); void RemoveTeam(const HWTeam& team); diff -r edd12b259e7c -r 6c5d504af2ba gameServer/Actions.hs --- a/gameServer/Actions.hs Fri Oct 02 18:56:54 2009 +0000 +++ b/gameServer/Actions.hs Sat Oct 03 09:35:14 2009 +0000 @@ -19,6 +19,7 @@ | AnswerAllOthers [String] | AnswerThisRoom [String] | AnswerOthersInRoom [String] + | AnswerSameClan [String] | AnswerLobby [String] | SendServerMessage | RoomAddThisClient Int -- roomID @@ -35,6 +36,7 @@ | BanClient String -- nick | RemoveClientTeams Int -- clID | ModifyClient (ClientInfo -> ClientInfo) + | ModifyClient2 Int (ClientInfo -> ClientInfo) | ModifyRoom (RoomInfo -> RoomInfo) | ModifyServerInfo (ServerInfo -> ServerInfo) | AddRoom String String @@ -64,13 +66,13 @@ processAction (clID, serverInfo, clients, rooms) (AnswerAllOthers msg) = do - mapM_ (\id -> writeChan (sendChan $ clients ! id) msg) $ + mapM_ (\id' -> writeChan (sendChan $ clients ! id') msg) $ Prelude.filter (\id' -> (id' /= clID) && logonPassed (clients ! id')) (keys clients) return (clID, serverInfo, clients, rooms) processAction (clID, serverInfo, clients, rooms) (AnswerThisRoom msg) = do - mapM_ (\id -> writeChan (sendChan $ clients ! id) msg) roomClients + mapM_ (\id' -> writeChan (sendChan $ clients ! id') msg) roomClients return (clID, serverInfo, clients, rooms) where roomClients = IntSet.elems $ playersIDs room @@ -80,7 +82,7 @@ processAction (clID, serverInfo, clients, rooms) (AnswerOthersInRoom msg) = do - mapM_ (\id -> writeChan (sendChan $ clients ! id) msg) $ Prelude.filter (/= clID) roomClients + mapM_ (\id' -> writeChan (sendChan $ clients ! id') msg) $ Prelude.filter (/= clID) roomClients return (clID, serverInfo, clients, rooms) where roomClients = IntSet.elems $ playersIDs room @@ -90,13 +92,25 @@ processAction (clID, serverInfo, clients, rooms) (AnswerLobby msg) = do - mapM_ (\id -> writeChan (sendChan $ clients ! id) msg) roomClients + mapM_ (\id' -> writeChan (sendChan $ clients ! id') msg) roomClients return (clID, serverInfo, clients, rooms) where roomClients = IntSet.elems $ playersIDs room room = rooms ! 0 +processAction (clID, serverInfo, clients, rooms) (AnswerSameClan msg) = do + mapM_ (\cl -> writeChan (sendChan cl) msg) sameClanClients + return (clID, serverInfo, clients, rooms) + where + otherRoomClients = Prelude.map ((!) clients) $ IntSet.elems $ clID `IntSet.delete` (playersIDs room) + sameClanClients = Prelude.filter (\cl -> teamsInGame cl > 0 && clientClan cl == thisClan) otherRoomClients + thisClan = clientClan client + room = rooms ! rID + rID = roomID client + client = clients ! clID + + processAction (clID, serverInfo, clients, rooms) SendServerMessage = do writeChan (sendChan $ clients ! clID) ["SERVER_MESSAGE", message serverInfo] return (clID, serverInfo, clients, rooms) @@ -163,6 +177,10 @@ return (clID, serverInfo, adjust func clID clients, rooms) +processAction (clID, serverInfo, clients, rooms) (ModifyClient2 cl2ID func) = + return (clID, serverInfo, adjust func cl2ID clients, rooms) + + processAction (clID, serverInfo, clients, rooms) (ModifyRoom func) = return (clID, serverInfo, clients, adjust func rID rooms) where diff -r edd12b259e7c -r 6c5d504af2ba gameServer/CoreTypes.hs --- a/gameServer/CoreTypes.hs Fri Oct 02 18:56:54 2009 +0000 +++ b/gameServer/CoreTypes.hs Sat Oct 03 09:35:14 2009 +0000 @@ -30,6 +30,7 @@ isMaster :: Bool, isReady :: Bool, isAdministrator :: Bool, + clientClan :: String, teamsInGame :: Word } @@ -47,6 +48,7 @@ data TeamInfo = TeamInfo { + teamownerId :: !Int, teamowner :: String, teamname :: String, teamcolor :: String, diff -r edd12b259e7c -r 6c5d504af2ba gameServer/HWProtoInRoomState.hs --- a/gameServer/HWProtoInRoomState.hs Fri Oct 02 18:56:54 2009 +0000 +++ b/gameServer/HWProtoInRoomState.hs Sat Oct 03 09:35:14 2009 +0000 @@ -6,6 +6,7 @@ import Data.Sequence(Seq, (|>), (><), fromList, empty) import Data.List import Maybe +import qualified Codec.Binary.UTF8.String as UTF8 -------------------------------------- import CoreTypes import Actions @@ -49,7 +50,7 @@ | isRestrictedTeams room = [Warning "restricted"] | otherwise = [ModifyRoom (\r -> r{teams = teams r ++ [newTeam]}), - ModifyClient (\c -> c{teamsInGame = teamsInGame c + 1}), + ModifyClient (\c -> c{teamsInGame = teamsInGame c + 1, clientClan = color}), AnswerThisClient ["TEAM_ACCEPTED", name], AnswerOthersInRoom $ teamToNet newTeam, AnswerOthersInRoom ["TEAM_COLOR", name, color] @@ -59,7 +60,7 @@ room = rooms IntMap.! (roomID client) canAddNumber = 48 - (sum . map hhnum $ teams room) findTeam = find (\t -> name == teamname t) $ teams room - newTeam = (TeamInfo (nick client) name color grave fort voicepack difficulty newTeamHHNum (hhsList hhsInfo)) + newTeam = (TeamInfo clID (nick client) name color grave fort voicepack difficulty newTeamHHNum (hhsList hhsInfo)) difficulty = fromMaybe 0 (maybeRead difStr :: Maybe Int) hhsList [] = [] hhsList (n:h:hhs) = HedgehogInfo n h : hhsList hhs @@ -101,7 +102,8 @@ | not $ isMaster client = [ProtocolError "Not room master"] | noSuchTeam = [] | otherwise = [ModifyRoom $ modifyTeam team{teamcolor = newColor}, - AnswerOthersInRoom ["TEAM_COLOR", teamName, newColor]] + AnswerOthersInRoom ["TEAM_COLOR", teamName, newColor], + ModifyClient2 (teamownerId team) (\c -> c{clientClan = newColor})] where noSuchTeam = isNothing findTeam team = fromJust findTeam @@ -191,4 +193,14 @@ kickID = clientUID kickClient +handleCmd_inRoom clID clients _ ["TEAMCHAT", msg] = + if (teamsInGame client > 0) then + [AnswerSameClan ["EM", engineMsg]] + else + [] + where + client = clients IntMap.! clID + engineMsg = toEngineMsg $ 'b' : (nick client ++ "(team): " ++ decodedMsg ++ "\x20\x20") + decodedMsg = UTF8.decodeString msg + handleCmd_inRoom clID _ _ _ = [ProtocolError "Incorrect command (state: in room)"] diff -r edd12b259e7c -r 6c5d504af2ba gameServer/NetRoutines.hs --- a/gameServer/NetRoutines.hs Fri Oct 02 18:56:54 2009 +0000 +++ b/gameServer/NetRoutines.hs Sat Oct 03 09:35:14 2009 +0000 @@ -46,6 +46,7 @@ False False undefined + undefined ) writeChan coreChan $ Accept newClient diff -r edd12b259e7c -r 6c5d504af2ba gameServer/Utils.hs --- a/gameServer/Utils.hs Fri Oct 02 18:56:54 2009 +0000 +++ b/gameServer/Utils.hs Sat Oct 03 09:35:14 2009 +0000 @@ -28,7 +28,9 @@ $ concatMap (\n -> (\(a, b) -> [showHex a, showHex b]) $ divMod n 65536) [a, b, c, d]) [] toEngineMsg :: String -> String -toEngineMsg msg = Base64.encode (fromIntegral (length msg) : (UTF8.encode msg)) +toEngineMsg msg = Base64.encode (fromIntegral (length encodedMsg) : encodedMsg) + where + encodedMsg = UTF8.encode msg fromEngineMsg :: String -> Maybe String fromEngineMsg msg = liftM (map w2c) (Base64.decode msg >>= removeLength) diff -r edd12b259e7c -r 6c5d504af2ba hedgewars/CCHandlers.inc --- a/hedgewars/CCHandlers.inc Fri Oct 02 18:56:54 2009 +0000 +++ b/hedgewars/CCHandlers.inc Sat Oct 03 09:35:14 2009 +0000 @@ -347,7 +347,7 @@ begin SendIPC('b' + s); -s[1]:= #4; +s:= #4 + UserNick + '(team): ' + s; AddChatString(s) end; diff -r edd12b259e7c -r 6c5d504af2ba hedgewars/uChat.pas --- a/hedgewars/uChat.pas Fri Oct 02 18:56:54 2009 +0000 +++ b/hedgewars/uChat.pas Sat Oct 03 09:35:14 2009 +0000 @@ -206,7 +206,7 @@ if copy(s, 1, 6) = '/team ' then begin - ParseCommand('/team ' + char(LocalClan) + UserNick + '(team): '+copy(s, 7, Length(s)-6), true); + ParseCommand(s, true); exit end; if (s[1] = '/') and (copy(s, 1, 4) <> '/me ') then diff -r edd12b259e7c -r 6c5d504af2ba hedgewars/uIO.pas --- a/hedgewars/uIO.pas Fri Oct 02 18:56:54 2009 +0000 +++ b/hedgewars/uIO.pas Sat Oct 03 09:35:14 2009 +0000 @@ -294,6 +294,11 @@ AddChatString(s); WriteLnToConsole(s) end; + 'b': begin + s:= copy(headcmd^.str, 2, Pred(headcmd^.len)); + AddChatString(#4 + s); + WriteLnToConsole(s) + end; 'F': TeamGone(copy(headcmd^.str, 2, Pred(headcmd^.len))); 'N': begin tmpflag:= false; @@ -312,12 +317,6 @@ 't': ParseCommand('taunt ' + headcmd^.str[2], true); 'g': ParseCommand('newgrave', true); 'h': ParseCommand('hogsay ' + copy(headcmd^.str, 2, Pred(headcmd^.len)), true); - 'b': if LocalClan = byte(headcmd^.str[2]) then - begin - s:= copy(headcmd^.str, 3, Pred(headcmd^.len)); - AddChatString(#4 + s); - WriteLnToConsole(s) - end; '1'..'5': ParseCommand('timer ' + headcmd^.cmd, true); #128..char(128 + cMaxSlotIndex): ParseCommand('slot ' + char(byte(headcmd^.cmd) - 79), true) else