diff --git a/FFXIVClassic Common Class Lib/Utils.cs b/FFXIVClassic Common Class Lib/Utils.cs
index 12f5f88f..a6479b78 100644
--- a/FFXIVClassic Common Class Lib/Utils.cs
+++ b/FFXIVClassic Common Class Lib/Utils.cs
@@ -1,4 +1,5 @@
using System;
+using System.IO;
using System.Text;
namespace FFXIVClassic.Common
@@ -13,7 +14,7 @@ namespace FFXIVClassic.Common
for (var i = 0; i < 256; i++)
{
var s = i.ToString("X2");
- result[i] = s[0] + ((uint) s[1] << 16);
+ result[i] = s[0] + ((uint)s[1] << 16);
}
return result;
}
@@ -28,13 +29,13 @@ namespace FFXIVClassic.Common
var hexChars = "0123456789ABCDEF".ToCharArray();
var offsetBlock = 8 + 3;
- var byteBlock = offsetBlock + bytesPerLine*3 + (bytesPerLine - 1)/8 + 2;
+ var byteBlock = offsetBlock + bytesPerLine * 3 + (bytesPerLine - 1) / 8 + 2;
var lineLength = byteBlock + bytesPerLine + Environment.NewLine.Length;
var line = (new string(' ', lineLength - Environment.NewLine.Length) + Environment.NewLine).ToCharArray();
- var numLines = (bytes.Length + bytesPerLine - 1)/bytesPerLine;
+ var numLines = (bytes.Length + bytesPerLine - 1) / bytesPerLine;
- var sb = new StringBuilder(numLines*lineLength);
+ var sb = new StringBuilder(numLines * lineLength);
for (var i = 0; i < bytes.Length; i += bytesPerLine)
{
@@ -70,7 +71,7 @@ namespace FFXIVClassic.Common
var by = bytes[i + j];
line[hexColumn] = hexChars[(by >> 4) & 0xF];
line[hexColumn + 1] = hexChars[by & 0xF];
- line[charColumn] = by < 32 ? '.' : (char) by;
+ line[charColumn] = by < 32 ? '.' : (char)by;
}
hexColumn += 3;
@@ -89,7 +90,7 @@ namespace FFXIVClassic.Common
var currentTime = DateTime.Now;
var zuluTime = currentTime.ToUniversalTime();
var unixEpoch = new DateTime(1970, 1, 1);
- unixTimeStamp = (uint) zuluTime.Subtract(unixEpoch).TotalSeconds;
+ unixTimeStamp = (uint)zuluTime.Subtract(unixEpoch).TotalSeconds;
return unixTimeStamp;
}
@@ -100,7 +101,7 @@ namespace FFXIVClassic.Common
var currentTime = DateTime.Now;
var zuluTime = currentTime.ToUniversalTime();
var unixEpoch = new DateTime(1970, 1, 1);
- unixTimeStamp = (ulong) zuluTime.Subtract(unixEpoch).TotalMilliseconds;
+ unixTimeStamp = (ulong)zuluTime.Subtract(unixEpoch).TotalMilliseconds;
return unixTimeStamp;
}
@@ -127,7 +128,7 @@ namespace FFXIVClassic.Common
public static int SwapEndian(int input)
{
- var inputAsUint = (uint) input;
+ var inputAsUint = (uint)input;
input = (int)
(((inputAsUint >> 24) & 0xff) |
@@ -151,7 +152,7 @@ namespace FFXIVClassic.Common
// Initialize the hash to a 'random' value
- var h = seed ^ (uint) len;
+ var h = seed ^ (uint)len;
// Mix 4 bytes at a time into the hash
@@ -160,7 +161,7 @@ namespace FFXIVClassic.Common
{
h *= m;
- var k = (uint) BitConverter.ToInt32(data, dataIndex);
+ var k = (uint)BitConverter.ToInt32(data, dataIndex);
k = ((k >> 24) & 0xff) | // move byte 3 to byte 0
((k << 8) & 0xff0000) | // move byte 1 to byte 2
((k >> 8) & 0xff00) | // move byte 2 to byte 1
@@ -180,10 +181,10 @@ namespace FFXIVClassic.Common
switch (len)
{
case 3:
- h ^= (uint) data[0] << 16;
+ h ^= (uint)data[0] << 16;
goto case 2;
case 2:
- h ^= (uint) data[len - 2] << 8;
+ h ^= (uint)data[len - 2] << 8;
goto case 1;
case 1:
h ^= data[len - 1];
@@ -204,7 +205,7 @@ namespace FFXIVClassic.Common
public static byte[] ConvertBoolArrayToBinaryStream(bool[] array)
{
- var 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)];
var dataCounter = 0;
for (var i = 0; i < array.Length; i += 8)
@@ -213,7 +214,7 @@ namespace FFXIVClassic.Common
{
if (i + bitCount >= array.Length)
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++;
}
@@ -225,10 +226,130 @@ namespace FFXIVClassic.Common
{
var lookup = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
- var secondDigit = lookup.Substring((int) Math.Floor(number/(double) lookup.Length), 1);
- var firstDigit = lookup.Substring(number%lookup.Length, 1);
+ var secondDigit = lookup.Substring((int)Math.Floor(number / (double)lookup.Length), 1);
+ var firstDigit = lookup.Substring(number % lookup.Length, 1);
return secondDigit + firstDigit;
}
+
+
+ public static string FFXIVLoginStringDecodeBinary(string path)
+ {
+ Console.OutputEncoding = System.Text.Encoding.UTF8;
+ byte[] data = File.ReadAllBytes(path);
+ int offset = 0x5405a;
+ //int offset = 0x5425d;
+ //int offset = 0x53ea0;
+ while (true)
+ {
+ string result = "";
+ uint key = (uint)data[offset + 0] << 8 | data[offset + 1];
+ uint key2 = data[offset + 2];
+ key = RotateRight(key, 1) & 0xFFFF;
+ key -= 0x22AF;
+ key &= 0xFFFF;
+ key2 = key2 ^ key;
+ key = RotateRight(key, 1) & 0xFFFF;
+ key -= 0x22AF;
+ key &= 0xFFFF;
+ uint finalKey = key;
+ key = data[offset + 3];
+ uint count = (key2 & 0xFF) << 8;
+ key = key ^ finalKey;
+ key &= 0xFF;
+ count |= key;
+
+ int count2 = 0;
+ while (count != 0)
+ {
+ uint encrypted = data[offset + 4 + count2];
+ finalKey = RotateRight(finalKey, 1) & 0xFFFF;
+ finalKey -= 0x22AF;
+ finalKey &= 0xFFFF;
+ encrypted = encrypted ^ (finalKey & 0xFF);
+
+ result += (char)encrypted;
+ count--;
+ count2++;
+ }
+
+ offset += 4 + count2;
+ }
+ }
+
+ public static string FFXIVLoginStringDecode(byte[] data)
+ {
+ string result = "";
+ uint key = (uint)data[0] << 8 | data[1];
+ uint key2 = data[2];
+ key = RotateRight(key, 1) & 0xFFFF;
+ key -= 0x22AF;
+ key2 = key2 ^ key;
+ key = RotateRight(key, 1) & 0xFFFF;
+ key -= 0x22AF;
+ uint finalKey = key;
+ key = data[3];
+ uint count = (key2 & 0xFF) << 8;
+ key = key ^ finalKey;
+ key &= 0xFF;
+ count |= key;
+
+ int count2 = 0;
+ while (count != 0)
+ {
+ uint encrypted = data[4 + count2];
+ finalKey = RotateRight(finalKey, 1) & 0xFFFF;
+ finalKey -= 0x22AF;
+ encrypted = encrypted ^ (finalKey & 0xFF);
+ result += (char)encrypted;
+ count--;
+ count2++;
+ }
+
+ return result;
+ }
+
+ public static byte[] FFXIVLoginStringEncode(uint key, string text)
+ {
+ key = key & 0xFFFF;
+
+ uint count = 0;
+ byte[] asciiBytes = Encoding.ASCII.GetBytes(text);
+ byte[] result = new byte[4 + text.Length];
+ for (count = 0; count < text.Length; count++)
+ {
+ result[result.Length - count - 1] = (byte)(asciiBytes[asciiBytes.Length - count - 1] ^ (key & 0xFF));
+ key += 0x22AF;
+ key &= 0xFFFF;
+ key = RotateLeft(key, 1) & 0xFFFF;
+ }
+
+ count = count ^ key;
+ result[3] = (byte)(count & 0xFF);
+
+ key += 0x22AF & 0xFFFF;
+ key = RotateLeft(key, 1) & 0xFFFF;
+
+ result[2] = (byte)(key & 0xFF);
+
+ key += 0x22AF & 0xFFFF;
+ key = RotateLeft(key, 1) & 0xFFFF;
+
+
+ result[1] = (byte)(key & 0xFF);
+ result[0] = (byte)((key >> 8) & 0xFF);
+
+ return result;
+ }
+
+ public static uint RotateLeft(uint value, int bits)
+ {
+ return (value << bits) | (value >> (16 - bits));
+ }
+
+ public static uint RotateRight(uint value, int bits)
+ {
+ return (value >> bits) | (value << (16 - bits));
+ }
}
}
\ No newline at end of file
diff --git a/FFXIVClassic Map Server/CommandProcessor.cs b/FFXIVClassic Map Server/CommandProcessor.cs
index 6cebd662..50985884 100644
--- a/FFXIVClassic Map Server/CommandProcessor.cs
+++ b/FFXIVClassic Map Server/CommandProcessor.cs
@@ -88,7 +88,7 @@ namespace FFXIVClassic_Map_Server
if (cmd.Any())
{
// if client isnt null, take player to be the player actor
- var player = client.GetActor();
+ var player = client?.GetActor();
if (cmd.Equals("help"))
{
diff --git a/FFXIVClassic Map Server/NLog.config b/FFXIVClassic Map Server/NLog.config
index cad2eea9..a59613ac 100644
--- a/FFXIVClassic Map Server/NLog.config
+++ b/FFXIVClassic Map Server/NLog.config
@@ -53,6 +53,7 @@
+