11using System ;
22using System . IO ;
3+ using System . Text . RegularExpressions ;
34
45using OXGaming . TibiaAPI ;
56using OXGaming . TibiaAPI . Constants ;
@@ -9,6 +10,8 @@ namespace Redact
910{
1011 class Program
1112 {
13+ static Regex _lookPlayerRx = new Regex ( @"you see .*\(level \d+\).*(she|he) is" , RegexOptions . Compiled | RegexOptions . IgnoreCase ) ;
14+
1215 static string _recordingName ;
1316
1417 static bool _keepClientPackets ;
@@ -126,6 +129,7 @@ static void Redact()
126129 client . Connection . OnReceivedServerCreateOnMapPacket += Connection_OnReceivedServerCreateOnMapPacket ;
127130 client . Connection . OnReceivedServerCreatureUpdatePacket += Connection_OnReceivedServerCreatureUpdatePacket ;
128131 client . Connection . OnReceivedServerTalkPacket += Connection_OnReceivedServerTalkPacket ;
132+ client . Connection . OnReceivedServerMessagePacket += Connection_OnReceivedServerMessagePacket ;
129133
130134 // These packets aren't necessary in a redacted recording.
131135 if ( _keepClientPackets )
@@ -165,21 +169,29 @@ static void Redact()
165169
166170 writer . Write ( version ) ;
167171
172+ var clientSequenceNumber = 0u ;
173+ var serverSequenceNumber = 0u ;
174+
168175 while ( reader . BaseStream . Position < reader . BaseStream . Length )
169176 {
170177 var packetType = ( PacketType ) reader . ReadByte ( ) ;
171178 var timestamp = reader . ReadInt64 ( ) ;
172179 var size = reader . ReadUInt32 ( ) ;
180+
181+ // If the Record app wasn't properly shutdown, a recording could
182+ // possibly be missing data at the end.
183+ if ( reader . BaseStream . Length - reader . BaseStream . Position < size )
184+ {
185+ break ;
186+ }
187+
173188 _ = reader . ReadUInt16 ( ) ; // packet size
174- var sequenceNumber = reader . ReadUInt32 ( ) ;
189+ _ = reader . ReadUInt32 ( ) ; // sequence number
190+ var outMessage = new NetworkMessage ( client ) ;
175191 var message = new NetworkMessage ( client )
176192 {
177193 Size = size
178194 } ;
179- var outMessage = new NetworkMessage ( client )
180- {
181- SequenceNumber = sequenceNumber
182- } ;
183195
184196 reader . BaseStream . Position -= 6 ;
185197 Array . Copy ( reader . ReadBytes ( ( int ) message . Size ) , message . GetBuffer ( ) , message . Size ) ;
@@ -199,9 +211,10 @@ static void Redact()
199211 continue ;
200212 }
201213
202- // Prepare the message to send without an XTEA key so that the proper
214+ // Prepare the message without an XTEA key so that the proper
203215 // sizes are added to the packet data, but it stays unencrypted.
204216 outMessage . PrepareToSend ( null ) ;
217+ outMessage . SequenceNumber = packetType == PacketType . Client ? clientSequenceNumber ++ : serverSequenceNumber ++ ;
205218
206219 var data = outMessage . GetData ( ) ;
207220
@@ -221,17 +234,35 @@ private static bool Connection_OnReceivedClientTalkPacket(Packet packet)
221234 return true ;
222235 }
223236
237+ private static bool Connection_OnReceivedServerMessagePacket ( Packet packet )
238+ {
239+ var p = ( OXGaming . TibiaAPI . Network . ServerPackets . Message ) packet ;
240+ if ( p . MessageMode == MessageModeType . Look )
241+ {
242+ if ( _lookPlayerRx . IsMatch ( p . Text ) || p . Text . Contains ( "You see yourself." ) )
243+ {
244+ p . Text = "Redacted" ;
245+ }
246+ }
247+ return true ;
248+ }
249+
224250 private static bool Connection_OnReceivedServerTalkPacket ( Packet packet )
225251 {
226252 var p = ( OXGaming . TibiaAPI . Network . ServerPackets . Talk ) packet ;
227- p . SpeakerName = "Redacted" ;
253+ var creature = p . Client . CreatureStorage . GetCreature ( p . SpeakerName ) ;
254+ if ( creature is null || creature . Type == CreatureType . Player )
255+ {
256+ p . SpeakerLevel = 100 ;
257+ p . SpeakerName = "Redacted" ;
258+ }
228259 return true ;
229260 }
230261
231262 private static bool Connection_OnReceivedServerCreatureUpdatePacket ( Packet packet )
232263 {
233264 var p = ( OXGaming . TibiaAPI . Network . ServerPackets . CreatureUpdate ) packet ;
234- if ( p . Creature is object )
265+ if ( p . Creature is object && p . Creature . Type == CreatureType . Player )
235266 {
236267 p . Creature . Name = "Redacted" ;
237268 }
@@ -241,7 +272,7 @@ private static bool Connection_OnReceivedServerCreatureUpdatePacket(Packet packe
241272 private static bool Connection_OnReceivedServerCreateOnMapPacket ( Packet packet )
242273 {
243274 var p = ( OXGaming . TibiaAPI . Network . ServerPackets . CreateOnMap ) packet ;
244- if ( p . Creature is object )
275+ if ( p . Creature is object && p . Creature . Type == CreatureType . Player )
245276 {
246277 p . Creature . Name = "Redacted" ;
247278 }
0 commit comments