1
Fork 0
mirror of https://bitbucket.org/Ioncannon/project-meteor-server.git synced 2025-04-23 21:27:46 +00:00

Lobby and game server packet ConsoleColor to NLog cleanup.

This commit is contained in:
deviltti 2016-06-21 21:13:01 -04:00
parent 0c197f34a1
commit b8a563f9d7
6 changed files with 382 additions and 351 deletions

View file

@ -10,10 +10,10 @@ namespace FFXIVClassic.Common
private static uint[] CreateLookup32() private static uint[] CreateLookup32()
{ {
var result = new uint[256]; var result = new uint[256];
for (int i = 0; i < 256; i++) for (var i = 0; i < 256; i++)
{ {
string s = i.ToString("X2"); var s = i.ToString("X2");
result[i] = ((uint)s[0]) + ((uint)s[1] << 16); result[i] = s[0] + ((uint) s[1] << 16);
} }
return result; return result;
} }
@ -22,25 +22,23 @@ namespace FFXIVClassic.Common
{ {
if (bytes == null) if (bytes == null)
{ {
return String.Empty; return string.Empty;
} }
char[] hexChars = "0123456789ABCDEF".ToCharArray(); var hexChars = "0123456789ABCDEF".ToCharArray();
// 00000000 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ var offsetBlock = 8 + 3;
// 00000010 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ var byteBlock = offsetBlock + bytesPerLine*3 + (bytesPerLine - 1)/8 + 2;
int offsetBlock = 8 + 3; var lineLength = byteBlock + bytesPerLine + Environment.NewLine.Length;
int byteBlock = offsetBlock + (bytesPerLine * 3) + ((bytesPerLine - 1) / 8) + 2;
int lineLength = byteBlock + bytesPerLine + Environment.NewLine.Length;
char[] line = (new String(' ', lineLength - Environment.NewLine.Length) + Environment.NewLine).ToCharArray(); var line = (new string(' ', lineLength - Environment.NewLine.Length) + Environment.NewLine).ToCharArray();
int numLines = (bytes.Length + bytesPerLine - 1) / bytesPerLine; var numLines = (bytes.Length + bytesPerLine - 1)/bytesPerLine;
StringBuilder sb = new StringBuilder(numLines * lineLength); var sb = new StringBuilder(numLines*lineLength);
for (int i = 0; i < bytes.Length; i += bytesPerLine) for (var i = 0; i < bytes.Length; i += bytesPerLine)
{ {
int h = i + offset; var h = i + offset;
line[0] = hexChars[(h >> 28) & 0xF]; line[0] = hexChars[(h >> 28) & 0xF];
line[1] = hexChars[(h >> 24) & 0xF]; line[1] = hexChars[(h >> 24) & 0xF];
@ -51,10 +49,10 @@ namespace FFXIVClassic.Common
line[6] = hexChars[(h >> 4) & 0xF]; line[6] = hexChars[(h >> 4) & 0xF];
line[7] = hexChars[(h >> 0) & 0xF]; line[7] = hexChars[(h >> 0) & 0xF];
int hexColumn = offsetBlock; var hexColumn = offsetBlock;
int charColumn = byteBlock; var charColumn = byteBlock;
for (int j = 0; j < bytesPerLine; j++) for (var j = 0; j < bytesPerLine; j++)
{ {
if (j > 0 && (j & 7) == 0) if (j > 0 && (j & 7) == 0)
{ {
@ -69,10 +67,10 @@ namespace FFXIVClassic.Common
} }
else else
{ {
byte by = bytes[i + j]; var by = bytes[i + j];
line[hexColumn] = hexChars[(by >> 4) & 0xF]; line[hexColumn] = hexChars[(by >> 4) & 0xF];
line[hexColumn + 1] = hexChars[by & 0xF]; line[hexColumn + 1] = hexChars[by & 0xF];
line[charColumn] = (by < 32 ? '.' : (char)by); line[charColumn] = by < 32 ? '.' : (char) by;
} }
hexColumn += 3; hexColumn += 3;
@ -82,60 +80,60 @@ namespace FFXIVClassic.Common
sb.Append(line); sb.Append(line);
} }
return sb.ToString(); return sb.ToString().TrimEnd(Environment.NewLine.ToCharArray());
} }
public static UInt32 UnixTimeStampUTC() public static uint UnixTimeStampUTC()
{ {
UInt32 unixTimeStamp; uint unixTimeStamp;
DateTime currentTime = DateTime.Now; var currentTime = DateTime.Now;
DateTime zuluTime = currentTime.ToUniversalTime(); var zuluTime = currentTime.ToUniversalTime();
DateTime unixEpoch = new DateTime(1970, 1, 1); var unixEpoch = new DateTime(1970, 1, 1);
unixTimeStamp = (UInt32)(zuluTime.Subtract(unixEpoch)).TotalSeconds; unixTimeStamp = (uint) zuluTime.Subtract(unixEpoch).TotalSeconds;
return unixTimeStamp; return unixTimeStamp;
} }
public static UInt64 MilisUnixTimeStampUTC() public static ulong MilisUnixTimeStampUTC()
{ {
UInt64 unixTimeStamp; ulong unixTimeStamp;
DateTime currentTime = DateTime.Now; var currentTime = DateTime.Now;
DateTime zuluTime = currentTime.ToUniversalTime(); var zuluTime = currentTime.ToUniversalTime();
DateTime unixEpoch = new DateTime(1970, 1, 1); var unixEpoch = new DateTime(1970, 1, 1);
unixTimeStamp = (UInt64)(zuluTime.Subtract(unixEpoch)).TotalMilliseconds; unixTimeStamp = (ulong) zuluTime.Subtract(unixEpoch).TotalMilliseconds;
return unixTimeStamp; return unixTimeStamp;
} }
public static ulong SwapEndian(ulong input) public static ulong SwapEndian(ulong input)
{ {
return ((0x00000000000000FF) & (input >> 56) | return 0x00000000000000FF & (input >> 56) |
(0x000000000000FF00) & (input >> 40) | 0x000000000000FF00 & (input >> 40) |
(0x0000000000FF0000) & (input >> 24) | 0x0000000000FF0000 & (input >> 24) |
(0x00000000FF000000) & (input >> 8) | 0x00000000FF000000 & (input >> 8) |
(0x000000FF00000000) & (input << 8) | 0x000000FF00000000 & (input << 8) |
(0x0000FF0000000000) & (input << 24) | 0x0000FF0000000000 & (input << 24) |
(0x00FF000000000000) & (input << 40) | 0x00FF000000000000 & (input << 40) |
(0xFF00000000000000) & (input << 56)); 0xFF00000000000000 & (input << 56);
} }
public static uint SwapEndian(uint input) public static uint SwapEndian(uint input)
{ {
return ((input >> 24) & 0xff) | return ((input >> 24) & 0xff) |
((input << 8) & 0xff0000) | ((input << 8) & 0xff0000) |
((input >> 8) & 0xff00) | ((input >> 8) & 0xff00) |
((input << 24) & 0xff000000); ((input << 24) & 0xff000000);
} }
public static int SwapEndian(int input) public static int SwapEndian(int input)
{ {
uint inputAsUint = (uint)input; var inputAsUint = (uint) input;
input = (int) input = (int)
(((inputAsUint >> 24) & 0xff) | (((inputAsUint >> 24) & 0xff) |
((inputAsUint << 8) & 0xff0000) | ((inputAsUint << 8) & 0xff0000) |
((inputAsUint >> 8) & 0xff00) | ((inputAsUint >> 8) & 0xff00) |
((inputAsUint << 24) & 0xff000000)); ((inputAsUint << 24) & 0xff000000));
return input; return input;
} }
@ -145,15 +143,15 @@ namespace FFXIVClassic.Common
// 'm' and 'r' are mixing constants generated offline. // 'm' and 'r' are mixing constants generated offline.
// They're not really 'magic', they just happen to work well. // They're not really 'magic', they just happen to work well.
byte[] data = Encoding.ASCII.GetBytes(key); var data = Encoding.ASCII.GetBytes(key);
const uint m = 0x5bd1e995; const uint m = 0x5bd1e995;
const int r = 24; const int r = 24;
int len = key.Length; var len = key.Length;
int dataIndex = len - 4; var dataIndex = len - 4;
// Initialize the hash to a 'random' value // Initialize the hash to a 'random' value
uint h = seed ^ (uint)len; var h = seed ^ (uint) len;
// Mix 4 bytes at a time into the hash // Mix 4 bytes at a time into the hash
@ -162,11 +160,11 @@ namespace FFXIVClassic.Common
{ {
h *= m; h *= m;
uint k = (uint)BitConverter.ToInt32(data, dataIndex); var k = (uint) BitConverter.ToInt32(data, dataIndex);
k = ((k >> 24) & 0xff) | // move byte 3 to byte 0 k = ((k >> 24) & 0xff) | // move byte 3 to byte 0
((k << 8) & 0xff0000) | // move byte 1 to byte 2 ((k << 8) & 0xff0000) | // move byte 1 to byte 2
((k >> 8) & 0xff00) | // move byte 2 to byte 1 ((k >> 8) & 0xff00) | // move byte 2 to byte 1
((k << 24) & 0xff000000); // byte 0 to byte 3 ((k << 24) & 0xff000000); // byte 0 to byte 3
k *= m; k *= m;
k ^= k >> r; k ^= k >> r;
@ -182,14 +180,17 @@ namespace FFXIVClassic.Common
switch (len) switch (len)
{ {
case 3: case 3:
h ^= (uint)data[0] << 16; goto case 2; h ^= (uint) data[0] << 16;
goto case 2;
case 2: case 2:
h ^= (uint)data[len - 2] << 8; goto case 1; h ^= (uint) data[len - 2] << 8;
goto case 1;
case 1: case 1:
h ^= data[len - 1]; h ^= data[len - 1];
h *= m; h *= m;
break; break;
}; }
;
// Do a few final mixes of the hash to ensure the last few // Do a few final mixes of the hash to ensure the last few
// bytes are well-incorporated. // bytes are well-incorporated.
@ -203,16 +204,16 @@ namespace FFXIVClassic.Common
public static byte[] ConvertBoolArrayToBinaryStream(bool[] array) public static byte[] ConvertBoolArrayToBinaryStream(bool[] array)
{ {
byte[] data = new byte[(array.Length / 8) + (array.Length % 8 != 0 ? 1 : 0)]; var data = new byte[array.Length/8 + (array.Length%8 != 0 ? 1 : 0)];
int dataCounter = 0; var dataCounter = 0;
for (int i = 0; i < array.Length; i += 8) for (var i = 0; i < array.Length; i += 8)
{ {
for (int bitCount = 0; bitCount < 8; bitCount++) for (var bitCount = 0; bitCount < 8; bitCount++)
{ {
if (i + bitCount >= array.Length) if (i + bitCount >= array.Length)
break; break;
data[dataCounter] = (byte)(((array[i + bitCount] ? 1 : 0) << 7 - bitCount) | data[dataCounter]); data[dataCounter] = (byte) (((array[i + bitCount] ? 1 : 0) << 7 - bitCount) | data[dataCounter]);
} }
dataCounter++; dataCounter++;
} }
@ -222,10 +223,10 @@ namespace FFXIVClassic.Common
public static string ToStringBase63(int number) public static string ToStringBase63(int number)
{ {
string lookup = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; var lookup = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
string secondDigit = lookup.Substring((int)Math.Floor((double)number / (double)lookup.Length), 1); var secondDigit = lookup.Substring((int) Math.Floor(number/(double) lookup.Length), 1);
string firstDigit = lookup.Substring(number % lookup.Length, 1); var firstDigit = lookup.Substring(number%lookup.Length, 1);
return secondDigit + firstDigit; return secondDigit + firstDigit;
} }

View file

@ -1,48 +1,62 @@
<?xml version="1.0" encoding="utf-8" ?> <?xml version="1.0" encoding="utf-8"?>
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd" <nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.nlog-project.org/schemas/NLog.xsd NLog.xsd" xsi:schemaLocation="http://www.nlog-project.org/schemas/NLog.xsd NLog.xsd"
autoReload="true" autoReload="true"
throwExceptions="false" throwExceptions="false"
internalLogLevel="Off" internalLogFile="c:\temp\nlog-internal.log" > internalLogLevel="Off" internalLogFile="c:\temp\nlog-internal.log">
<!-- optional, add some variabeles <!-- optional, add some variabeles
https://github.com/nlog/NLog/wiki/Configuration-file#variables https://github.com/nlog/NLog/wiki/Configuration-file#variables
--> -->
<variable name="myvar" value="myvalue"/> <variable name="myvar" value="myvalue" />
<!-- <!--
See https://github.com/nlog/nlog/wiki/Configuration-file See https://github.com/nlog/nlog/wiki/Configuration-file
for information on customizing logging rules and outputs. for information on customizing logging rules and outputs.
--> -->
<targets async="true"> <targets async="true">
<!-- <!--
add your targets here add your targets here
See https://github.com/nlog/NLog/wiki/Targets for possible targets. See https://github.com/nlog/NLog/wiki/Targets for possible targets.
See https://github.com/nlog/NLog/wiki/Layout-Renderers for the possible layout renderers. See https://github.com/nlog/NLog/wiki/Layout-Renderers for the possible layout renderers.
--> -->
<!-- <!--
Write events to a file with the date in the filename. Write events to a file with the date in the filename.
<target xsi:type="File" name="f" fileName="${basedir}/logs/${shortdate}.log" <target xsi:type="File" name="f" fileName="${basedir}/logs/${shortdate}.log"
layout="${longdate} ${uppercase:${level}} ${message}" /> layout="${longdate} ${uppercase:${level}} ${message}" />
--> -->
<target xsi:type="ColoredConsole" name="console" layout="[${longdate}] [${uppercase:${level}}] ${message}"> <!--<target xsi:type="ColoredConsole" name="console" layout="[${longdate}] [${uppercase:${level}}] ${message}" />-->
<highlight-row condition="equals('${logger}','FFXIVClassic_Lobby_Server.packets.BasePacket') and equals('${event-context:item=color}','5')" foregroundColor="White" backgroundColor="Yellow" /> <target xsi:type="File" name="file" fileName="${basedir}/logs/${shortdate}/map.log"
<highlight-row condition="equals('${logger}','FFXIVClassic_Lobby_Server.packets.SubPacket') and equals('${event-context:item=color}','5')" foregroundColor="White" backgroundColor="DarkMagenta" /> layout="[${date:format=MM/dd/yyyy HH\:mm\:ss}][${uppercase:${level}}]${message}" />
</target> <target xsi:type="ColoredConsole" name="console"
<target xsi:type="File" name="file" fileName="${basedir}/logs/${shortdate}/lobby.log" layout="[${longdate}] [${uppercase:${level}}] ${message}" /> layout="[${date:format=MM/dd/yyyy HH\:mm\:ss}][${uppercase:${level}}]${message}" />
</targets> <target xsi:type="ColoredConsole" name="packets"
layout="${message}">
<highlight-row
condition="equals('${logger}', 'FFXIVClassic_Lobby_Server.packets.BasePacket') and equals('${event-context:item=color}', '6')"
backgroundColor="DarkYellow" foregroundColor="NoChange" />
<highlight-row
condition="equals('${logger}', 'FFXIVClassic_Lobby_Server.packets.SubPacket') and equals('${event-context:item=color}', '4')"
backgroundColor="DarkRed" foregroundColor="NoChange" />
<highlight-row
condition="equals('${logger}', 'FFXIVClassic_Lobby_Server.packets.SubPacket') and equals('${event-context:item=color}', '5')"
backgroundColor="DarkMagenta" foregroundColor="NoChange" />
</target>
</targets>
<rules> <rules>
<!-- add your logging rules here --> <!-- add your logging rules here -->
<logger name='*' minlevel='Trace' writeTo='file' /> <logger name='*' minlevel='Trace' writeTo='file' />
<logger name='*' minlevel='Trace' writeTo='console' /> <logger name='*' minlevel='Info' writeTo='console' />
<!-- <logger name='FFXIVClassic_Lobby_Server.packets.*' minlevel='Debug' writeTo='packets' />
<!--
Write all events with minimal level of Debug (So Debug, Info, Warn, Error and Fatal, but not Trace) to "f" Write all events with minimal level of Debug (So Debug, Info, Warn, Error and Fatal, but not Trace) to "f"
<logger name="*" minlevel="Debug" writeTo="f" /> <logger name="*" minlevel="Debug" writeTo="f" />
--> -->
</rules> </rules>
</nlog> </nlog>

View file

@ -1,14 +1,14 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Runtime.InteropServices;
using System.Diagnostics; using System.Diagnostics;
using FFXIVClassic.Common;
using System.IO; using System.IO;
using System.Runtime.InteropServices;
using FFXIVClassic.Common;
using NLog; using NLog;
using NLog.Targets;
namespace FFXIVClassic_Lobby_Server.packets namespace FFXIVClassic_Lobby_Server.packets
{ {
[StructLayout(LayoutKind.Sequential)] [StructLayout(LayoutKind.Sequential)]
public struct BasePacketHeader public struct BasePacketHeader
{ {
@ -22,25 +22,25 @@ namespace FFXIVClassic_Lobby_Server.packets
public class BasePacket public class BasePacket
{ {
public static Logger Log = LogManager.GetCurrentClassLogger();
public const int TYPE_ZONE = 1; public const int TYPE_ZONE = 1;
public const int TYPE_CHAT = 2; public const int TYPE_CHAT = 2;
public const int BASEPACKET_SIZE = 0x10; public const int BASEPACKET_SIZE = 0x10;
private static readonly Logger logger = LogManager.GetCurrentClassLogger();
public BasePacketHeader header;
public byte[] data; public byte[] data;
public BasePacketHeader header;
//Loads a sniffed packet from a file //Loads a sniffed packet from a file
public unsafe BasePacket(String path) public unsafe BasePacket(string path)
{ {
byte[] bytes = File.ReadAllBytes(path); var bytes = File.ReadAllBytes(path);
if (bytes.Length < BASEPACKET_SIZE) if (bytes.Length < BASEPACKET_SIZE)
throw new OverflowException("Packet Error: Packet was too small"); throw new OverflowException("Packet Error: Packet was too small");
fixed (byte* pdata = &bytes[0]) fixed (byte* pdata = &bytes[0])
{ {
header = (BasePacketHeader)Marshal.PtrToStructure(new IntPtr(pdata), typeof(BasePacketHeader)); header = (BasePacketHeader) Marshal.PtrToStructure(new IntPtr(pdata), typeof(BasePacketHeader));
} }
if (bytes.Length < header.packetSize) if (bytes.Length < header.packetSize)
@ -65,7 +65,7 @@ namespace FFXIVClassic_Lobby_Server.packets
fixed (byte* pdata = &bytes[0]) fixed (byte* pdata = &bytes[0])
{ {
header = (BasePacketHeader)Marshal.PtrToStructure(new IntPtr(pdata), typeof(BasePacketHeader)); header = (BasePacketHeader) Marshal.PtrToStructure(new IntPtr(pdata), typeof(BasePacketHeader));
} }
if (bytes.Length < header.packetSize) if (bytes.Length < header.packetSize)
@ -84,7 +84,7 @@ namespace FFXIVClassic_Lobby_Server.packets
fixed (byte* pdata = &bytes[offset]) fixed (byte* pdata = &bytes[offset])
{ {
header = (BasePacketHeader)Marshal.PtrToStructure(new IntPtr(pdata), typeof(BasePacketHeader)); header = (BasePacketHeader) Marshal.PtrToStructure(new IntPtr(pdata), typeof(BasePacketHeader));
} }
int packetSize = header.packetSize; int packetSize = header.packetSize;
@ -106,9 +106,9 @@ namespace FFXIVClassic_Lobby_Server.packets
public List<SubPacket> GetSubpackets() public List<SubPacket> GetSubpackets()
{ {
List<SubPacket> subpackets = new List<SubPacket>(header.numSubpackets); var subpackets = new List<SubPacket>(header.numSubpackets);
int offset = 0; var offset = 0;
while (offset < data.Length) while (offset < data.Length)
subpackets.Add(new SubPacket(data, ref offset)); subpackets.Add(new SubPacket(data, ref offset));
@ -116,7 +116,7 @@ namespace FFXIVClassic_Lobby_Server.packets
return subpackets; return subpackets;
} }
public unsafe static BasePacketHeader GetHeader(byte[] bytes) public static unsafe BasePacketHeader GetHeader(byte[] bytes)
{ {
BasePacketHeader header; BasePacketHeader header;
if (bytes.Length < BASEPACKET_SIZE) if (bytes.Length < BASEPACKET_SIZE)
@ -124,7 +124,7 @@ namespace FFXIVClassic_Lobby_Server.packets
fixed (byte* pdata = &bytes[0]) fixed (byte* pdata = &bytes[0])
{ {
header = (BasePacketHeader)Marshal.PtrToStructure(new IntPtr(pdata), typeof(BasePacketHeader)); header = (BasePacketHeader) Marshal.PtrToStructure(new IntPtr(pdata), typeof(BasePacketHeader));
} }
return header; return header;
@ -132,10 +132,10 @@ namespace FFXIVClassic_Lobby_Server.packets
public byte[] GetHeaderBytes() public byte[] GetHeaderBytes()
{ {
int size = Marshal.SizeOf(header); var size = Marshal.SizeOf(header);
byte[] arr = new byte[size]; var arr = new byte[size];
IntPtr ptr = Marshal.AllocHGlobal(size); var ptr = Marshal.AllocHGlobal(size);
Marshal.StructureToPtr(header, ptr, true); Marshal.StructureToPtr(header, ptr, true);
Marshal.Copy(ptr, arr, 0, size); Marshal.Copy(ptr, arr, 0, size);
Marshal.FreeHGlobal(ptr); Marshal.FreeHGlobal(ptr);
@ -144,7 +144,7 @@ namespace FFXIVClassic_Lobby_Server.packets
public byte[] GetPacketBytes() public byte[] GetPacketBytes()
{ {
byte[] outBytes = new byte[header.packetSize]; var outBytes = new byte[header.packetSize];
Array.Copy(GetHeaderBytes(), 0, outBytes, 0, BASEPACKET_SIZE); Array.Copy(GetHeaderBytes(), 0, outBytes, 0, BASEPACKET_SIZE);
Array.Copy(data, 0, outBytes, BASEPACKET_SIZE, data.Length); Array.Copy(data, 0, outBytes, BASEPACKET_SIZE, data.Length);
return outBytes; return outBytes;
@ -153,16 +153,17 @@ namespace FFXIVClassic_Lobby_Server.packets
//Replaces all instances of the sniffed actorID with the given one //Replaces all instances of the sniffed actorID with the given one
public void ReplaceActorID(uint actorID) public void ReplaceActorID(uint actorID)
{ {
using (MemoryStream mem = new MemoryStream(data)) using (var mem = new MemoryStream(data))
{ {
using (BinaryWriter binWriter = new BinaryWriter(mem)) using (var binWriter = new BinaryWriter(mem))
{ {
using (BinaryReader binreader = new BinaryReader(mem)) using (var binreader = new BinaryReader(mem))
{ {
while (binreader.BaseStream.Position + 4 < data.Length) while (binreader.BaseStream.Position + 4 < data.Length)
{ {
uint read = binreader.ReadUInt32(); var read = binreader.ReadUInt32();
if (read == 0x029B2941 || read == 0x02977DC7 || read == 0x0297D2C8 || read == 0x0230d573 || read == 0x23317df || read == 0x23344a3 || read == 0x1730bdb) //Original ID if (read == 0x029B2941 || read == 0x02977DC7 || read == 0x0297D2C8 || read == 0x0230d573 ||
read == 0x23317df || read == 0x23344a3 || read == 0x1730bdb) //Original ID
{ {
binWriter.BaseStream.Seek(binreader.BaseStream.Position - 0x4, SeekOrigin.Begin); binWriter.BaseStream.Seek(binreader.BaseStream.Position - 0x4, SeekOrigin.Begin);
binWriter.Write(actorID); binWriter.Write(actorID);
@ -176,15 +177,15 @@ namespace FFXIVClassic_Lobby_Server.packets
//Replaces all instances of the sniffed actorID with the given one //Replaces all instances of the sniffed actorID with the given one
public void ReplaceActorID(uint fromActorID, uint actorID) public void ReplaceActorID(uint fromActorID, uint actorID)
{ {
using (MemoryStream mem = new MemoryStream(data)) using (var mem = new MemoryStream(data))
{ {
using (BinaryWriter binWriter = new BinaryWriter(mem)) using (var binWriter = new BinaryWriter(mem))
{ {
using (BinaryReader binreader = new BinaryReader(mem)) using (var binreader = new BinaryReader(mem))
{ {
while (binreader.BaseStream.Position + 4 < data.Length) while (binreader.BaseStream.Position + 4 < data.Length)
{ {
uint read = binreader.ReadUInt32(); var read = binreader.ReadUInt32();
if (read == fromActorID) //Original ID if (read == fromActorID) //Original ID
{ {
binWriter.BaseStream.Seek(binreader.BaseStream.Position - 0x4, SeekOrigin.Begin); binWriter.BaseStream.Seek(binreader.BaseStream.Position - 0x4, SeekOrigin.Begin);
@ -196,49 +197,65 @@ namespace FFXIVClassic_Lobby_Server.packets
} }
} }
public void DebugPrintPacket()
{
#if DEBUG
logger.ColorDebug(
string.Format("IsAuth:{0} Size:0x{1:X}, NumSubpackets:{2}{3}{4}",
header.isAuthenticated, header.packetSize, header.numSubpackets,
Environment.NewLine, Utils.ByteArrayToHex(GetHeaderBytes())), ConsoleOutputColor.DarkYellow);
foreach (var sub in GetSubpackets())
{
sub.DebugPrintSubPacket();
}
#endif
}
#region Utility Functions #region Utility Functions
public static BasePacket CreatePacket(List<SubPacket> subpackets, bool isAuthed, bool isEncrypted) public static BasePacket CreatePacket(List<SubPacket> subpackets, bool isAuthed, bool isEncrypted)
{ {
//Create Header //Create Header
BasePacketHeader header = new BasePacketHeader(); var header = new BasePacketHeader();
byte[] data = null; byte[] data = null;
header.isAuthenticated = isAuthed ? (byte)1 : (byte)0; header.isAuthenticated = isAuthed ? (byte) 1 : (byte) 0;
header.isEncrypted = isEncrypted ? (byte)1 : (byte)0; header.isEncrypted = isEncrypted ? (byte) 1 : (byte) 0;
header.numSubpackets = (ushort)subpackets.Count; header.numSubpackets = (ushort) subpackets.Count;
header.packetSize = BASEPACKET_SIZE; header.packetSize = BASEPACKET_SIZE;
header.timestamp = Utils.MilisUnixTimeStampUTC(); header.timestamp = Utils.MilisUnixTimeStampUTC();
//Get packet size //Get packet size
foreach (SubPacket subpacket in subpackets) foreach (var subpacket in subpackets)
header.packetSize += subpacket.header.subpacketSize; header.packetSize += subpacket.header.subpacketSize;
data = new byte[header.packetSize - 0x10]; data = new byte[header.packetSize - 0x10];
//Add Subpackets //Add Subpackets
int offset = 0; var offset = 0;
foreach (SubPacket subpacket in subpackets) foreach (var subpacket in subpackets)
{ {
byte[] subpacketData = subpacket.GetBytes(); var subpacketData = subpacket.GetBytes();
Array.Copy(subpacketData, 0, data, offset, subpacketData.Length); Array.Copy(subpacketData, 0, data, offset, subpacketData.Length);
offset += (ushort)subpacketData.Length; offset += (ushort) subpacketData.Length;
} }
Debug.Assert(data != null && offset == data.Length && header.packetSize == 0x10 + offset); Debug.Assert(data != null && offset == data.Length && header.packetSize == 0x10 + offset);
BasePacket packet = new BasePacket(header, data); var packet = new BasePacket(header, data);
return packet; return packet;
} }
public static BasePacket CreatePacket(SubPacket subpacket, bool isAuthed, bool isEncrypted) public static BasePacket CreatePacket(SubPacket subpacket, bool isAuthed, bool isEncrypted)
{ {
//Create Header //Create Header
BasePacketHeader header = new BasePacketHeader(); var header = new BasePacketHeader();
byte[] data = null; byte[] data = null;
header.isAuthenticated = isAuthed ? (byte)1 : (byte)0; header.isAuthenticated = isAuthed ? (byte) 1 : (byte) 0;
header.isEncrypted = isEncrypted ? (byte)1 : (byte)0; header.isEncrypted = isEncrypted ? (byte) 1 : (byte) 0;
header.numSubpackets = (ushort)1; header.numSubpackets = 1;
header.packetSize = BASEPACKET_SIZE; header.packetSize = BASEPACKET_SIZE;
header.timestamp = Utils.MilisUnixTimeStampUTC(); header.timestamp = Utils.MilisUnixTimeStampUTC();
@ -248,42 +265,41 @@ namespace FFXIVClassic_Lobby_Server.packets
data = new byte[header.packetSize - 0x10]; data = new byte[header.packetSize - 0x10];
//Add Subpackets //Add Subpackets
byte[] subpacketData = subpacket.GetBytes(); var subpacketData = subpacket.GetBytes();
Array.Copy(subpacketData, 0, data, 0, subpacketData.Length); Array.Copy(subpacketData, 0, data, 0, subpacketData.Length);
Debug.Assert(data != null); Debug.Assert(data != null);
BasePacket packet = new BasePacket(header, data); var packet = new BasePacket(header, data);
return packet; return packet;
} }
public static BasePacket CreatePacket(byte[] data, bool isAuthed, bool isEncrypted) public static BasePacket CreatePacket(byte[] data, bool isAuthed, bool isEncrypted)
{ {
Debug.Assert(data != null); Debug.Assert(data != null);
//Create Header //Create Header
BasePacketHeader header = new BasePacketHeader(); var header = new BasePacketHeader();
header.isAuthenticated = isAuthed ? (byte)1 : (byte)0; header.isAuthenticated = isAuthed ? (byte) 1 : (byte) 0;
header.isEncrypted = isEncrypted ? (byte)1 : (byte)0; header.isEncrypted = isEncrypted ? (byte) 1 : (byte) 0;
header.numSubpackets = (ushort)1; header.numSubpackets = 1;
header.packetSize = BASEPACKET_SIZE; header.packetSize = BASEPACKET_SIZE;
header.timestamp = Utils.MilisUnixTimeStampUTC(); header.timestamp = Utils.MilisUnixTimeStampUTC();
//Get packet size //Get packet size
header.packetSize += (ushort)data.Length; header.packetSize += (ushort) data.Length;
BasePacket packet = new BasePacket(header, data); var packet = new BasePacket(header, data);
return packet; return packet;
} }
public static unsafe void EncryptPacket(Blowfish blowfish, BasePacket packet) public static unsafe void EncryptPacket(Blowfish blowfish, BasePacket packet)
{ {
byte[] data = packet.data; var data = packet.data;
int size = packet.header.packetSize; int size = packet.header.packetSize;
int offset = 0; var offset = 0;
while (offset < data.Length) while (offset < data.Length)
{ {
if (data.Length < offset + SubPacket.SUBPACKET_SIZE) if (data.Length < offset + SubPacket.SUBPACKET_SIZE)
@ -292,7 +308,7 @@ namespace FFXIVClassic_Lobby_Server.packets
SubPacketHeader header; SubPacketHeader header;
fixed (byte* pdata = &data[offset]) fixed (byte* pdata = &data[offset])
{ {
header = (SubPacketHeader)Marshal.PtrToStructure(new IntPtr(pdata), typeof(SubPacketHeader)); header = (SubPacketHeader) Marshal.PtrToStructure(new IntPtr(pdata), typeof(SubPacketHeader));
} }
if (data.Length < offset + header.subpacketSize) if (data.Length < offset + header.subpacketSize)
@ -302,15 +318,14 @@ namespace FFXIVClassic_Lobby_Server.packets
offset += header.subpacketSize; offset += header.subpacketSize;
} }
} }
public static unsafe void DecryptPacket(Blowfish blowfish, ref BasePacket packet) public static unsafe void DecryptPacket(Blowfish blowfish, ref BasePacket packet)
{ {
byte[] data = packet.data; var data = packet.data;
int size = packet.header.packetSize; int size = packet.header.packetSize;
int offset = 0; var offset = 0;
while (offset < data.Length) while (offset < data.Length)
{ {
if (data.Length < offset + SubPacket.SUBPACKET_SIZE) if (data.Length < offset + SubPacket.SUBPACKET_SIZE)
@ -319,7 +334,7 @@ namespace FFXIVClassic_Lobby_Server.packets
SubPacketHeader header; SubPacketHeader header;
fixed (byte* pdata = &data[offset]) fixed (byte* pdata = &data[offset])
{ {
header = (SubPacketHeader)Marshal.PtrToStructure(new IntPtr(pdata), typeof(SubPacketHeader)); header = (SubPacketHeader) Marshal.PtrToStructure(new IntPtr(pdata), typeof(SubPacketHeader));
} }
if (data.Length < offset + header.subpacketSize) if (data.Length < offset + header.subpacketSize)
@ -330,24 +345,17 @@ namespace FFXIVClassic_Lobby_Server.packets
offset += header.subpacketSize; offset += header.subpacketSize;
} }
} }
#endregion #endregion
}
public void DebugPrintPacket() public static class LoggerExtensions
{
public static void ColorDebug(this Logger logger, string message, ConsoleOutputColor color)
{ {
#if DEBUG var logEvent = new LogEventInfo(LogLevel.Debug, logger.Name, message);
// todo: create new target for colourful packet logging logEvent.Properties["color"] = (int) color;
//Console.BackgroundColor = ConsoleColor.DarkYellow; logger.Log(logEvent);
Log.Debug("IsAuth: {0} Size: 0x{1:X}, NumSubpackets: {2}{3}{4}", header.isAuthenticated, header.packetSize, header.numSubpackets, Environment.NewLine, Utils.ByteArrayToHex(GetHeaderBytes()));
foreach (SubPacket sub in GetSubpackets())
{
sub.DebugPrintSubPacket();
}
//Console.BackgroundColor = ConsoleColor.Black;
#endif
} }
} }
} }

View file

@ -2,6 +2,7 @@
using System.Runtime.InteropServices; using System.Runtime.InteropServices;
using FFXIVClassic.Common; using FFXIVClassic.Common;
using NLog; using NLog;
using NLog.Targets;
namespace FFXIVClassic_Lobby_Server.packets namespace FFXIVClassic_Lobby_Server.packets
{ {
@ -27,13 +28,13 @@ namespace FFXIVClassic_Lobby_Server.packets
public class SubPacket public class SubPacket
{ {
public static Logger Log = LogManager.GetCurrentClassLogger();
public const int SUBPACKET_SIZE = 0x10; public const int SUBPACKET_SIZE = 0x10;
public const int GAMEMESSAGE_SIZE = 0x10; public const int GAMEMESSAGE_SIZE = 0x10;
private static readonly Logger logger = LogManager.GetCurrentClassLogger();
public byte[] data;
public GameMessageHeader gameMessage;
public SubPacketHeader header; public SubPacketHeader header;
public GameMessageHeader gameMessage;
public byte[] data;
public unsafe SubPacket(byte[] bytes, ref int offset) public unsafe SubPacket(byte[] bytes, ref int offset)
{ {
@ -42,14 +43,15 @@ namespace FFXIVClassic_Lobby_Server.packets
fixed (byte* pdata = &bytes[offset]) fixed (byte* pdata = &bytes[offset])
{ {
header = (SubPacketHeader)Marshal.PtrToStructure(new IntPtr(pdata), typeof(SubPacketHeader)); header = (SubPacketHeader) Marshal.PtrToStructure(new IntPtr(pdata), typeof(SubPacketHeader));
} }
if (header.type == 0x3) if (header.type == 0x3)
{ {
fixed (byte* pdata = &bytes[offset + SUBPACKET_SIZE]) fixed (byte* pdata = &bytes[offset + SUBPACKET_SIZE])
{ {
gameMessage = (GameMessageHeader)Marshal.PtrToStructure(new IntPtr(pdata), typeof(GameMessageHeader)); gameMessage =
(GameMessageHeader) Marshal.PtrToStructure(new IntPtr(pdata), typeof(GameMessageHeader));
} }
} }
@ -72,8 +74,8 @@ namespace FFXIVClassic_Lobby_Server.packets
public SubPacket(ushort opcode, uint sourceId, uint targetId, byte[] data) public SubPacket(ushort opcode, uint sourceId, uint targetId, byte[] data)
{ {
this.header = new SubPacketHeader(); header = new SubPacketHeader();
this.gameMessage = new GameMessageHeader(); gameMessage = new GameMessageHeader();
gameMessage.opcode = opcode; gameMessage.opcode = opcode;
header.sourceId = sourceId; header.sourceId = sourceId;
@ -89,13 +91,13 @@ namespace FFXIVClassic_Lobby_Server.packets
this.data = data; this.data = data;
header.subpacketSize = (ushort)(SUBPACKET_SIZE + GAMEMESSAGE_SIZE + data.Length); header.subpacketSize = (ushort) (SUBPACKET_SIZE + GAMEMESSAGE_SIZE + data.Length);
} }
public SubPacket(SubPacket original, uint newTargetId) public SubPacket(SubPacket original, uint newTargetId)
{ {
this.header = new SubPacketHeader(); header = new SubPacketHeader();
this.gameMessage = original.gameMessage; gameMessage = original.gameMessage;
header.subpacketSize = original.header.subpacketSize; header.subpacketSize = original.header.subpacketSize;
header.type = original.header.type; header.type = original.header.type;
header.sourceId = original.header.sourceId; header.sourceId = original.header.sourceId;
@ -105,10 +107,10 @@ namespace FFXIVClassic_Lobby_Server.packets
public byte[] GetHeaderBytes() public byte[] GetHeaderBytes()
{ {
int size = Marshal.SizeOf(header); var size = Marshal.SizeOf(header);
byte[] arr = new byte[size]; var arr = new byte[size];
IntPtr ptr = Marshal.AllocHGlobal(size); var ptr = Marshal.AllocHGlobal(size);
Marshal.StructureToPtr(header, ptr, true); Marshal.StructureToPtr(header, ptr, true);
Marshal.Copy(ptr, arr, 0, size); Marshal.Copy(ptr, arr, 0, size);
Marshal.FreeHGlobal(ptr); Marshal.FreeHGlobal(ptr);
@ -117,10 +119,10 @@ namespace FFXIVClassic_Lobby_Server.packets
public byte[] GetGameMessageBytes() public byte[] GetGameMessageBytes()
{ {
int size = Marshal.SizeOf(gameMessage); var size = Marshal.SizeOf(gameMessage);
byte[] arr = new byte[size]; var arr = new byte[size];
IntPtr ptr = Marshal.AllocHGlobal(size); var ptr = Marshal.AllocHGlobal(size);
Marshal.StructureToPtr(gameMessage, ptr, true); Marshal.StructureToPtr(gameMessage, ptr, true);
Marshal.Copy(ptr, arr, 0, size); Marshal.Copy(ptr, arr, 0, size);
Marshal.FreeHGlobal(ptr); Marshal.FreeHGlobal(ptr);
@ -129,7 +131,7 @@ namespace FFXIVClassic_Lobby_Server.packets
public byte[] GetBytes() public byte[] GetBytes()
{ {
byte[] outBytes = new byte[header.subpacketSize]; var outBytes = new byte[header.subpacketSize];
Array.Copy(GetHeaderBytes(), 0, outBytes, 0, SUBPACKET_SIZE); Array.Copy(GetHeaderBytes(), 0, outBytes, 0, SUBPACKET_SIZE);
if (header.type == 0x3) if (header.type == 0x3)
@ -142,17 +144,20 @@ namespace FFXIVClassic_Lobby_Server.packets
public void DebugPrintSubPacket() public void DebugPrintSubPacket()
{ {
#if DEBUG #if DEBUG
// todo: create new target for colourful packet logging logger.ColorDebug(
Log.Debug("Size: 0x{0:X}{1}{2}", header.subpacketSize, Environment.NewLine, Utils.ByteArrayToHex(GetHeaderBytes())); string.Format("Size:0x{0:X} Opcode:0x{1:X}{2}{3}", header.subpacketSize, header.type,
Environment.NewLine,
Utils.ByteArrayToHex(GetHeaderBytes())), ConsoleOutputColor.DarkRed);
if (header.type == 0x03) if (header.type == 0x03)
{ {
Log.Debug("Opcode: 0x{0:X}{1}{2}", gameMessage.opcode, Environment.NewLine, Utils.ByteArrayToHex(GetGameMessageBytes(), SUBPACKET_SIZE)); logger.ColorDebug(Utils.ByteArrayToHex(GetGameMessageBytes(), SUBPACKET_SIZE),
} ConsoleOutputColor.DarkRed);
Log.Debug("Data: {0}{1}", Environment.NewLine, Utils.ByteArrayToHex(data, SUBPACKET_SIZE + GAMEMESSAGE_SIZE)); logger.ColorDebug(Utils.ByteArrayToHex(data, SUBPACKET_SIZE + GAMEMESSAGE_SIZE),
ConsoleOutputColor.DarkMagenta);
}
#endif #endif
} }
} }
} }

View file

@ -34,7 +34,9 @@
<target xsi:type="File" name="file" fileName="${basedir}/logs/${shortdate}/map.log" <target xsi:type="File" name="file" fileName="${basedir}/logs/${shortdate}/map.log"
layout="[${date:format=MM/dd/yyyy HH\:mm\:ss}][${uppercase:${level}}]${message}" /> layout="[${date:format=MM/dd/yyyy HH\:mm\:ss}][${uppercase:${level}}]${message}" />
<target xsi:type="ColoredConsole" name="console" <target xsi:type="ColoredConsole" name="console"
layout="[${date:format=MM/dd/yyyy HH\:mm\:ss}][${uppercase:${level}}]${message}"> layout="[${date:format=MM/dd/yyyy HH\:mm\:ss}][${uppercase:${level}}]${message}" />
<target xsi:type="ColoredConsole" name="packets"
layout="${message}">
<highlight-row <highlight-row
condition="equals('${logger}', 'FFXIVClassic_Map_Server.packets.BasePacket') and equals('${event-context:item=color}', '6')" condition="equals('${logger}', 'FFXIVClassic_Map_Server.packets.BasePacket') and equals('${event-context:item=color}', '6')"
backgroundColor="DarkYellow" foregroundColor="NoChange" /> backgroundColor="DarkYellow" foregroundColor="NoChange" />
@ -50,7 +52,8 @@
<rules> <rules>
<!-- add your logging rules here --> <!-- add your logging rules here -->
<logger name='*' minlevel='Trace' writeTo='file' /> <logger name='*' minlevel='Trace' writeTo='file' />
<logger name='*' minlevel='Trace' writeTo='console' /> <logger name='*' minlevel='Info' writeTo='console' />
<logger name='FFXIVClassic_Map_Server.packets.*' minlevel='Debug' writeTo='packets' />
<!-- <!--
Write all events with minimal level of Debug (So Debug, Info, Warn, Error and Fatal, but not Trace) to "f" Write all events with minimal level of Debug (So Debug, Info, Warn, Error and Fatal, but not Trace) to "f"
<logger name="*" minlevel="Debug" writeTo="f" /> <logger name="*" minlevel="Debug" writeTo="f" />

View file

@ -1,8 +1,8 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Runtime.InteropServices;
using System.Diagnostics; using System.Diagnostics;
using System.IO; using System.IO;
using System.Runtime.InteropServices;
using FFXIVClassic.Common; using FFXIVClassic.Common;
using NLog; using NLog;
using NLog.Targets; using NLog.Targets;