# HG changeset patch # User unc0rr # Date 1470945914 -10800 # Node ID 01f88c3b7b66a6e38b9a75c886361449c94223ac # Parent 93e6c401cc3df63b50e9e295ce0f3680c99f6688 Make in-game chat work diff -r 93e6c401cc3d -r 01f88c3b7b66 hedgewars/hwLibrary.pas --- a/hedgewars/hwLibrary.pas Tue Aug 02 23:08:17 2016 +0300 +++ b/hedgewars/hwLibrary.pas Thu Aug 11 23:05:14 2016 +0300 @@ -181,6 +181,7 @@ // network connectOfficialServer, passNetData, + passToNet, passFlibEvent, sendChatLine, joinRoom, diff -r 93e6c401cc3d -r 01f88c3b7b66 hedgewars/uFLNet.pas --- a/hedgewars/uFLNet.pas Tue Aug 02 23:08:17 2016 +0300 +++ b/hedgewars/uFLNet.pas Thu Aug 11 23:05:14 2016 +0300 @@ -11,6 +11,7 @@ procedure passToNet(data: PByteArray; len: Longword); var isConnected: boolean = false; + myNickname: shortstring = 'qmlfrontend'; implementation uses uFLIPC, uFLUICallback, uFLNetTypes, uFLUtils, uFLTypes; @@ -402,6 +403,8 @@ procedure passToNet(data: PByteArray; len: Longword); var i: Longword; + l: ansistring; + s: shortstring; begin i:= 0; @@ -409,8 +412,15 @@ begin if data^[i + 1] = ord('s') then begin - sendUI(mtRoomChatLine, @(data^[i + 2]), data^[i]); - //sendChatLine() + s[0]:= char(data^[i] - 1); + Move(data^[i + 2], s[1], data^[i] - 1); + + l:= myNickname + #10; + l:= l + s; + + sendUI(mtRoomChatLine, @l[1], length(l)); + sendNetLn('CHAT'); + sendNet(s); end; inc(i, data^[i] + 1); diff -r 93e6c401cc3d -r 01f88c3b7b66 hedgewars/uFLNetProtocol.pas --- a/hedgewars/uFLNetProtocol.pas Tue Aug 02 23:08:17 2016 +0300 +++ b/hedgewars/uFLNetProtocol.pas Thu Aug 11 23:05:14 2016 +0300 @@ -16,7 +16,6 @@ PHandler = procedure (var t: TCmdData); var isInRoom: boolean; - myNickname: shortstring; procedure onRoomLeaving(); begin @@ -310,8 +309,8 @@ begin sendUI(mtConnected, nil, 0); //writeln('Server features version ', p.param1); - sendNet('PROTO' + #10 + '51'); - sendNet('NICK' + #10 + 'qmlfrontend'); + sendNet('PROTO' + #10 + '52'); + sendNet('NICK' + #10 + myNickname); end; procedure handler_EM(var p: TCmdParam); diff -r 93e6c401cc3d -r 01f88c3b7b66 hedgewars/uFLUICallback.pas --- a/hedgewars/uFLUICallback.pas Tue Aug 02 23:08:17 2016 +0300 +++ b/hedgewars/uFLUICallback.pas Thu Aug 11 23:05:14 2016 +0300 @@ -14,10 +14,9 @@ procedure engineMessageCallback(p: pointer; msg: PChar; len: Longword); begin - if msg^ = 'T' then + if (len >= 3) and (msg[1] = 'T') then begin - inc(msg); - isGame:= msg^ = 'G'; + isGame:= msg[2] = 'G'; exit; end; diff -r 93e6c401cc3d -r 01f88c3b7b66 hedgewars/uIO.pas --- a/hedgewars/uIO.pas Tue Aug 02 23:08:17 2016 +0300 +++ b/hedgewars/uIO.pas Thu Aug 11 23:05:14 2016 +0300 @@ -256,7 +256,9 @@ procedure flushBuffer(); begin + ipcToFrontendRaw(@sendBuffer.buf, sendBuffer.count); flushDelayTicks:= 0; + sendBuffer.count:= 0; end; procedure SendIPC(s: shortstring); @@ -269,7 +271,20 @@ AddFileLog('[IPC out] '+ sanitizeCharForLog(s[1])); inc(s[0], 2); - ipcToFrontend(s) + if isSyncedCommand(s[1]) then + begin + if sendBuffer.count + byte(s[0]) >= cSendBufferSize then + flushBuffer(); + + Move(s, sendBuffer.buf[sendBuffer.count], byte(s[0]) + 1); + inc(sendBuffer.count, byte(s[0]) + 1); + + if (s[1] = 'N') or (s[1] = '#') then + flushBuffer(); + end + else + ipcToFrontendRaw(@s, Succ(byte(s[0]))) + end; procedure SendIPCRaw(p: pointer; len: Longword);