From c23f9c7ca9d13df5f2600ee5cb20235d38385fb7 Mon Sep 17 00:00:00 2001 From: Tahir Akhlaq Date: Sun, 12 Jun 2016 20:12:59 +0100 Subject: [PATCH] PROJECT: added common library to make common files actually common - renamed sln to FFXIVClassic.sln - threaded logging - todo: print packets using Log.Packet --- .../Bitfield.cs | 6 +- .../Blowfish.cs | 2 +- .../EfficientHashTables.cs | 2 +- .../FFXIVClassic Common Class Lib.csproj | 64 +++ FFXIVClassic Common Class Lib/Log.cs | 137 +++++ .../Properties/AssemblyInfo.cs | 36 ++ .../STA_INIFile.cs | 7 +- .../Utils.cs | 48 +- FFXIVClassic Lobby Server/ClientConnection.cs | 4 +- FFXIVClassic Lobby Server/ConfigConstants.cs | 4 +- FFXIVClassic Lobby Server/Database.cs | 36 +- .../FFXIVClassic Lobby Server.csproj | 10 +- FFXIVClassic Lobby Server/PacketProcessor.cs | 36 +- FFXIVClassic Lobby Server/Program.cs | 33 +- FFXIVClassic Lobby Server/Server.cs | 14 +- FFXIVClassic Lobby Server/common/Blowfish.cs | 456 --------------- FFXIVClassic Lobby Server/common/Log.cs | 72 --- .../common/STA_INIFile.cs | 533 ------------------ .../dataobjects/CharaInfo.cs | 4 +- .../dataobjects/Character.cs | 8 +- .../packets/BasePacket.cs | 4 +- .../packets/SubPacket.cs | 8 +- FFXIVClassic Map Server/ClientConnection.cs | 4 +- FFXIVClassic Map Server/CommandProcessor.cs | 34 +- FFXIVClassic Map Server/ConfigConstants.cs | 10 +- FFXIVClassic Map Server/Database.cs | 46 +- .../FFXIVClassic Map Server.csproj | 10 +- FFXIVClassic Map Server/PacketProcessor.cs | 20 +- FFXIVClassic Map Server/Program.cs | 36 +- FFXIVClassic Map Server/Server.cs | 16 +- FFXIVClassic Map Server/WorldManager.cs | 24 +- .../actors/StaticActors.cs | 6 +- .../actors/chara/npc/Npc.cs | 4 +- .../actors/chara/player/Player.cs | 4 +- FFXIVClassic Map Server/actors/quest/Quest.cs | 6 +- FFXIVClassic Map Server/common/Bitfield.cs | 74 --- FFXIVClassic Map Server/common/Log.cs | 72 --- FFXIVClassic Map Server/common/Utils.cs | 346 ------------ .../dataobjects/ConnectedPlayer.cs | 2 +- FFXIVClassic Map Server/lua/LuaEngine.cs | 4 +- FFXIVClassic Map Server/lua/LuaUtils.cs | 2 +- FFXIVClassic Map Server/packets/BasePacket.cs | 4 +- FFXIVClassic Map Server/packets/SubPacket.cs | 8 +- .../receive/events/EventStartPacket.cs | 2 +- .../send/Actor/SetActorPropetyPacket.cs | 2 +- .../send/list/SetListPropertyPacket.cs | 2 +- .../player/SetCompletedAchievementsPacket.cs | 4 +- .../send/player/SetCutsceneBookPacket.cs | 4 +- .../utils/CharacterUtils.cs | 2 +- .../utils/SQLGeneration.cs | 20 +- ...Classic Map Server.sln => FFXIVClassic.sln | 68 ++- data/lobby_config.ini | 2 +- data/map_config.ini | 2 +- 53 files changed, 547 insertions(+), 1817 deletions(-) rename {FFXIVClassic Lobby Server/common => FFXIVClassic Common Class Lib}/Bitfield.cs (94%) rename {FFXIVClassic Map Server/common => FFXIVClassic Common Class Lib}/Blowfish.cs (99%) rename {FFXIVClassic Map Server/common => FFXIVClassic Common Class Lib}/EfficientHashTables.cs (99%) create mode 100644 FFXIVClassic Common Class Lib/FFXIVClassic Common Class Lib.csproj create mode 100644 FFXIVClassic Common Class Lib/Log.cs create mode 100644 FFXIVClassic Common Class Lib/Properties/AssemblyInfo.cs rename {FFXIVClassic Map Server/common => FFXIVClassic Common Class Lib}/STA_INIFile.cs (99%) rename {FFXIVClassic Lobby Server/common => FFXIVClassic Common Class Lib}/Utils.cs (98%) delete mode 100644 FFXIVClassic Lobby Server/common/Blowfish.cs delete mode 100644 FFXIVClassic Lobby Server/common/Log.cs delete mode 100644 FFXIVClassic Lobby Server/common/STA_INIFile.cs delete mode 100644 FFXIVClassic Map Server/common/Bitfield.cs delete mode 100644 FFXIVClassic Map Server/common/Log.cs delete mode 100644 FFXIVClassic Map Server/common/Utils.cs rename FFXIVClassic Map Server.sln => FFXIVClassic.sln (62%) diff --git a/FFXIVClassic Lobby Server/common/Bitfield.cs b/FFXIVClassic Common Class Lib/Bitfield.cs similarity index 94% rename from FFXIVClassic Lobby Server/common/Bitfield.cs rename to FFXIVClassic Common Class Lib/Bitfield.cs index 9e1de16a..8a54eec3 100644 --- a/FFXIVClassic Lobby Server/common/Bitfield.cs +++ b/FFXIVClassic Common Class Lib/Bitfield.cs @@ -1,9 +1,9 @@ using System; -namespace FFXIVClassic_Lobby_Server.common +namespace FFXIVClassic.Common { [global::System.AttributeUsage(AttributeTargets.Field, AllowMultiple = false)] - sealed class BitfieldLengthAttribute : Attribute + public sealed class BitfieldLengthAttribute : Attribute { uint length; @@ -15,7 +15,7 @@ namespace FFXIVClassic_Lobby_Server.common public uint Length { get { return length; } } } - static class PrimitiveConversion + public static class PrimitiveConversion { public static UInt32 ToUInt32(T t) where T : struct { diff --git a/FFXIVClassic Map Server/common/Blowfish.cs b/FFXIVClassic Common Class Lib/Blowfish.cs similarity index 99% rename from FFXIVClassic Map Server/common/Blowfish.cs rename to FFXIVClassic Common Class Lib/Blowfish.cs index ccc7075b..f05afbea 100644 --- a/FFXIVClassic Map Server/common/Blowfish.cs +++ b/FFXIVClassic Common Class Lib/Blowfish.cs @@ -1,6 +1,6 @@ using System; -namespace FFXIVClassic_Map_Server.common +namespace FFXIVClassic.Common { public class Blowfish { diff --git a/FFXIVClassic Map Server/common/EfficientHashTables.cs b/FFXIVClassic Common Class Lib/EfficientHashTables.cs similarity index 99% rename from FFXIVClassic Map Server/common/EfficientHashTables.cs rename to FFXIVClassic Common Class Lib/EfficientHashTables.cs index e4bcf517..92744b96 100644 --- a/FFXIVClassic Map Server/common/EfficientHashTables.cs +++ b/FFXIVClassic Common Class Lib/EfficientHashTables.cs @@ -1,6 +1,6 @@ using System; -namespace FFXIVClassic_Map_Server.common +namespace FFXIVClassic.Common { namespace EfficientHashTables { diff --git a/FFXIVClassic Common Class Lib/FFXIVClassic Common Class Lib.csproj b/FFXIVClassic Common Class Lib/FFXIVClassic Common Class Lib.csproj new file mode 100644 index 00000000..e096cebc --- /dev/null +++ b/FFXIVClassic Common Class Lib/FFXIVClassic Common Class Lib.csproj @@ -0,0 +1,64 @@ + + + + + Debug + AnyCPU + {3A3D6626-C820-4C18-8C81-64811424F20E} + Library + Properties + FFXIVClassic.Common + FFXIVClassic.Common + v4.5 + 512 + + + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + false + false + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + false + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/FFXIVClassic Common Class Lib/Log.cs b/FFXIVClassic Common Class Lib/Log.cs new file mode 100644 index 00000000..54ce9084 --- /dev/null +++ b/FFXIVClassic Common Class Lib/Log.cs @@ -0,0 +1,137 @@ +using System; +using System.IO; +using System.Text; +using System.Collections.Generic; +using System.Threading; + +namespace FFXIVClassic.Common +{ + public class Log + { + public string LogDirectory; + public string LogFileName; + public int EnabledLogTypes; + public Queue> LogQueue; + + public Log(string path, string file, int enabledtypes) + { + LogQueue = new Queue>(); + EnabledLogTypes = enabledtypes; + LogDirectory = path; + LogFileName = file; + } + + public enum LogType + { + None = 0x000, + Console = 0x001, + File = 0x002, + Status = 0x004, + Sql = 0x008, + Info = 0x010, + Debug = 0x020, + Error = 0x040, + } + + public enum LogColour + { + Status = ConsoleColor.Green, + Sql = ConsoleColor.Magenta, + Info = ConsoleColor.White, + Debug = ConsoleColor.Cyan, + Error = ConsoleColor.Red + } + + public void Status(String message, params object[] formatargs) + { + if (formatargs.Length > 0) + message = String.Format(message, formatargs); + + QueueMessage(message, LogColour.Status); + } + + public void Sql(String message, params object[] formatargs) + { + if (formatargs.Length > 0) + message = String.Format(message, formatargs); + + QueueMessage(message, LogColour.Sql); + } + + public void Info(String message, params object[] formatargs) + { + if (formatargs.Length > 0) + message = String.Format(message, formatargs); + + QueueMessage(message, LogColour.Info); + } + + public void Debug(String message, params object[] formatargs) + { + if (formatargs.Length > 0) + message = String.Format(message, formatargs); + + QueueMessage(message, LogColour.Debug); + } + + public void Error(String message, params object[] formatargs) + { + if (formatargs.Length > 0) + message = String.Format(message, formatargs); + + QueueMessage(message, LogColour.Error); + } + + public void Packet(String message, params object[] formatargs) + { + + } + + private void QueueMessage(String message, LogColour type) + { + LogQueue.Enqueue(Tuple.Create(message, type)); + } + + public void WriteMessage(String message, LogColour type) + { + var canLog = false; + + try + { + canLog = ((EnabledLogTypes & (int)(Enum.Parse(typeof(LogType), type.ToString()))) != 0); + } + catch (Exception e) { } + + string timestamp = String.Format("[{0}]", DateTime.Now.ToString("MM/dd/yyyy HH:mm:ss")); + string messageType = String.Format("[{0}] ", type.ToString().ToUpper()); + + if ((EnabledLogTypes & (int)LogType.Console) != 0) + { + Console.Write(timestamp); + Console.ForegroundColor = (ConsoleColor)type; + Console.Write(messageType); + Console.ForegroundColor = ConsoleColor.Gray; + Console.WriteLine(message); + } + + StringBuilder sb = new StringBuilder(); + + sb.AppendLine(String.Format("{0}{1}{2}", timestamp, messageType, message)); + + if ((EnabledLogTypes & (int)LogType.File) != 0) + { + // todo: add param to see if path has been changed during runtime and then check directory/file + if (!Directory.Exists(LogDirectory)) + { + Directory.CreateDirectory(LogDirectory); + } + + using (FileStream fs = new FileStream(Path.Combine(LogDirectory, LogFileName), FileMode.Append, FileAccess.Write)) + using (StreamWriter sw = new StreamWriter(fs)) + { + sw.WriteLine(sb.ToString()); + } + } + } + } +} \ No newline at end of file diff --git a/FFXIVClassic Common Class Lib/Properties/AssemblyInfo.cs b/FFXIVClassic Common Class Lib/Properties/AssemblyInfo.cs new file mode 100644 index 00000000..79f8aa4e --- /dev/null +++ b/FFXIVClassic Common Class Lib/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("FFXIVClassic.Common")] +[assembly: AssemblyDescription("Common class library for FFXIVClassic project")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("ffxivclassic.fragmenterworks.com")] +[assembly: AssemblyProduct("FFXIVClassic.Common")] +[assembly: AssemblyCopyright("Copyright © 2016")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("3a3d6626-c820-4c18-8c81-64811424f20e")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/FFXIVClassic Map Server/common/STA_INIFile.cs b/FFXIVClassic Common Class Lib/STA_INIFile.cs similarity index 99% rename from FFXIVClassic Map Server/common/STA_INIFile.cs rename to FFXIVClassic Common Class Lib/STA_INIFile.cs index fa7107ad..e8669eca 100644 --- a/FFXIVClassic Map Server/common/STA_INIFile.cs +++ b/FFXIVClassic Common Class Lib/STA_INIFile.cs @@ -9,10 +9,9 @@ using System.Globalization; using System.IO; using System.Text; -namespace STA.Settings +namespace FFXIVClassic.Common { - - internal class INIFile + public class INIFile { #region "Declarations" @@ -337,7 +336,7 @@ namespace STA.Settings } // *** Read a value from local cache *** - internal string GetValue(string SectionName, string Key, string DefaultValue) + public string GetValue(string SectionName, string Key, string DefaultValue) { // *** Lazy loading *** if (m_Lazy) diff --git a/FFXIVClassic Lobby Server/common/Utils.cs b/FFXIVClassic Common Class Lib/Utils.cs similarity index 98% rename from FFXIVClassic Lobby Server/common/Utils.cs rename to FFXIVClassic Common Class Lib/Utils.cs index 8329864c..728d5d96 100644 --- a/FFXIVClassic Lobby Server/common/Utils.cs +++ b/FFXIVClassic Common Class Lib/Utils.cs @@ -1,9 +1,9 @@ using System; using System.Text; -namespace FFXIVClassic_Lobby_Server.common +namespace FFXIVClassic.Common { - static class Utils + public static class Utils { private static readonly uint[] _lookup32 = CreateLookup32(); @@ -20,28 +20,28 @@ namespace FFXIVClassic_Lobby_Server.common public static string ByteArrayToHex(byte[] bytes, int offset = 0, int bytesPerLine = 16) { - if (bytes == null) - { - return String.Empty; + if (bytes == null) + { + return String.Empty; } - char[] hexChars = "0123456789ABCDEF".ToCharArray(); - - // 00000000 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ - // 00000010 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ - int offsetBlock = 8 + 3; - int byteBlock = offsetBlock + (bytesPerLine * 3) + ((bytesPerLine - 1) / 8) + 2; + char[] hexChars = "0123456789ABCDEF".ToCharArray(); + + // 00000000 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ + // 00000010 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ + int offsetBlock = 8 + 3; + 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(); - int numLines = (bytes.Length + bytesPerLine - 1) / bytesPerLine; - + char[] line = (new String(' ', lineLength - Environment.NewLine.Length) + Environment.NewLine).ToCharArray(); + int numLines = (bytes.Length + bytesPerLine - 1) / bytesPerLine; + StringBuilder sb = new StringBuilder(numLines * lineLength); for (int i = 0; i < bytes.Length; i += bytesPerLine) - { - int h = i + offset; - + { + int h = i + offset; + line[0] = hexChars[(h >> 28) & 0xF]; line[1] = hexChars[(h >> 24) & 0xF]; line[2] = hexChars[(h >> 20) & 0xF]; @@ -56,11 +56,11 @@ namespace FFXIVClassic_Lobby_Server.common for (int j = 0; j < bytesPerLine; j++) { - if (j > 0 && (j & 7) == 0) - { - hexColumn++; - } - + if (j > 0 && (j & 7) == 0) + { + hexColumn++; + } + if (i + j >= bytes.Length) { line[hexColumn] = ' '; @@ -73,8 +73,8 @@ namespace FFXIVClassic_Lobby_Server.common line[hexColumn] = hexChars[(by >> 4) & 0xF]; line[hexColumn + 1] = hexChars[by & 0xF]; line[charColumn] = (by < 32 ? '.' : (char)by); - } - + } + hexColumn += 3; charColumn++; } diff --git a/FFXIVClassic Lobby Server/ClientConnection.cs b/FFXIVClassic Lobby Server/ClientConnection.cs index 68da5ee3..ead6b483 100644 --- a/FFXIVClassic Lobby Server/ClientConnection.cs +++ b/FFXIVClassic Lobby Server/ClientConnection.cs @@ -1,7 +1,7 @@ using System; using System.Net.Sockets; using FFXIVClassic_Lobby_Server.packets; -using FFXIVClassic_Lobby_Server.common; +using FFXIVClassic.Common; using System.Collections.Concurrent; using Cyotek.Collections.Generic; using System.Net; @@ -59,7 +59,7 @@ namespace FFXIVClassic_Lobby_Server socket.Send(packetBytes); } catch(Exception e) - { Log.Error(String.Format("Weird case, socket was d/ced: {0}", e)); } + { Program.Log.Error(String.Format("Weird case, socket was d/ced: {0}", e)); } } } diff --git a/FFXIVClassic Lobby Server/ConfigConstants.cs b/FFXIVClassic Lobby Server/ConfigConstants.cs index 75d96000..4ebae680 100644 --- a/FFXIVClassic Lobby Server/ConfigConstants.cs +++ b/FFXIVClassic Lobby Server/ConfigConstants.cs @@ -1,4 +1,4 @@ -using STA.Settings; +using FFXIVClassic.Common; using System; using System.IO; @@ -11,6 +11,7 @@ namespace FFXIVClassic_Lobby_Server public static bool OPTIONS_TIMESTAMP = false; public static String OPTIONS_LOGPATH; public static String OPTIONS_LOGFILE; + public static String OPTIONS_LOGLEVEL; public static String DATABASE_HOST; public static String DATABASE_PORT; @@ -37,6 +38,7 @@ namespace FFXIVClassic_Lobby_Server ConfigConstants.OPTIONS_TIMESTAMP = configIni.GetValue("General", "showtimestamp", "true").ToLower().Equals("true"); ConfigConstants.OPTIONS_LOGPATH = configIni.GetValue("General", "log_path", "./logs/"); ConfigConstants.OPTIONS_LOGFILE = configIni.GetValue("General", "log_file_name", String.Format("lobby_{0}_{1}.log", OPTIONS_BINDIP, OPTIONS_PORT)); + ConfigConstants.OPTIONS_LOGLEVEL = configIni.GetValue("General", "log_level", "127"); ConfigConstants.DATABASE_HOST = configIni.GetValue("Database", "host", ""); ConfigConstants.DATABASE_PORT = configIni.GetValue("Database", "port", ""); diff --git a/FFXIVClassic Lobby Server/Database.cs b/FFXIVClassic Lobby Server/Database.cs index ca8361db..38a23169 100644 --- a/FFXIVClassic Lobby Server/Database.cs +++ b/FFXIVClassic Lobby Server/Database.cs @@ -5,7 +5,7 @@ using System; using System.Collections.Generic; using System.Linq; using FFXIVClassic_Lobby_Server.utils; -using FFXIVClassic_Lobby_Server.common; +using FFXIVClassic.Common; namespace FFXIVClassic_Lobby_Server { @@ -33,7 +33,7 @@ namespace FFXIVClassic_Lobby_Server } catch (MySqlException e) { - Log.Error(e.ToString()); + Program.Log.Error(e.ToString()); } finally @@ -88,9 +88,9 @@ namespace FFXIVClassic_Lobby_Server } catch (MySqlException e) { - Log.Error(e.ToString()); + Program.Log.Error(e.ToString()); - Log.Error(e.ToString()); + Program.Log.Error(e.ToString()); pid = 0; cid = 0; @@ -100,7 +100,7 @@ namespace FFXIVClassic_Lobby_Server conn.Dispose(); } - Log.Sql(String.Format("CID={0} created on 'characters' table.", cid)); + Program.Log.Sql(String.Format("CID={0} created on 'characters' table.", cid)); } return alreadyExists; @@ -183,7 +183,7 @@ namespace FFXIVClassic_Lobby_Server } catch (MySqlException e) { - Log.Error(e.ToString()); + Program.Log.Error(e.ToString()); conn.Dispose(); return; @@ -208,7 +208,7 @@ namespace FFXIVClassic_Lobby_Server } catch (MySqlException e) { - Log.Error(e.ToString()); + Program.Log.Error(e.ToString()); conn.Dispose(); return; @@ -230,7 +230,7 @@ namespace FFXIVClassic_Lobby_Server } catch (MySqlException e) { - Log.Error(e.ToString()); + Program.Log.Error(e.ToString()); } @@ -242,7 +242,7 @@ namespace FFXIVClassic_Lobby_Server } - Log.Sql(String.Format("CID={0} state updated to active(2).", cid)); + Program.Log.Sql(String.Format("CID={0} state updated to active(2).", cid)); } public static bool renameCharacter(uint userId, uint characterId, uint serverId, String newName) @@ -277,7 +277,7 @@ namespace FFXIVClassic_Lobby_Server } catch (MySqlException e) { - Log.Error(e.ToString()); + Program.Log.Error(e.ToString()); } @@ -286,7 +286,7 @@ namespace FFXIVClassic_Lobby_Server conn.Dispose(); } - Log.Sql(String.Format("CID={0} name updated to \"{1}\".", characterId, newName)); + Program.Log.Sql(String.Format("CID={0} name updated to \"{1}\".", characterId, newName)); return false; } @@ -310,7 +310,7 @@ namespace FFXIVClassic_Lobby_Server } catch (MySqlException e) { - Log.Error(e.ToString()); + Program.Log.Error(e.ToString()); } @@ -320,7 +320,7 @@ namespace FFXIVClassic_Lobby_Server } } - Log.Sql(String.Format("CID={0} deleted.", characterId)); + Program.Log.Sql(String.Format("CID={0} deleted.", characterId)); } public static List getServers() @@ -335,7 +335,7 @@ namespace FFXIVClassic_Lobby_Server } catch (MySqlException e) { - Log.Error(e.ToString()); + Program.Log.Error(e.ToString()); worldList = new List(); } finally { @@ -357,7 +357,7 @@ namespace FFXIVClassic_Lobby_Server } catch (MySqlException e) { - Log.Error(e.ToString()); + Program.Log.Error(e.ToString()); } finally @@ -494,7 +494,7 @@ namespace FFXIVClassic_Lobby_Server } catch (MySqlException e) { - Log.Error(e.ToString()); + Program.Log.Error(e.ToString()); } finally @@ -518,7 +518,7 @@ namespace FFXIVClassic_Lobby_Server } catch (MySqlException e) { - Log.Error(e.ToString()); + Program.Log.Error(e.ToString()); nameList = new List(); } finally { @@ -540,7 +540,7 @@ namespace FFXIVClassic_Lobby_Server } catch (MySqlException e) { - Log.Error(e.ToString()); + Program.Log.Error(e.ToString()); retainerList = new List(); } finally { diff --git a/FFXIVClassic Lobby Server/FFXIVClassic Lobby Server.csproj b/FFXIVClassic Lobby Server/FFXIVClassic Lobby Server.csproj index 00c7db3a..07c71cfc 100644 --- a/FFXIVClassic Lobby Server/FFXIVClassic Lobby Server.csproj +++ b/FFXIVClassic Lobby Server/FFXIVClassic Lobby Server.csproj @@ -11,6 +11,7 @@ FFXIVClassic_Lobby_Server v4.5 512 + false publish\ true Disk @@ -23,7 +24,6 @@ true 0 1.0.0.%2a - false false true @@ -55,6 +55,9 @@ ..\packages\Dapper.1.42\lib\net45\Dapper.dll + + ..\FFXIVClassic Common Class Lib\bin\Debug\FFXIVClassic.Common.dll + ..\packages\MySql.Data.6.9.7\lib\net45\MySql.Data.dll @@ -71,17 +74,12 @@ - - - - - diff --git a/FFXIVClassic Lobby Server/PacketProcessor.cs b/FFXIVClassic Lobby Server/PacketProcessor.cs index 8601dd3b..4adc7d10 100644 --- a/FFXIVClassic Lobby Server/PacketProcessor.cs +++ b/FFXIVClassic Lobby Server/PacketProcessor.cs @@ -1,4 +1,4 @@ -using FFXIVClassic_Lobby_Server.common; +using FFXIVClassic.Common; using FFXIVClassic_Lobby_Server.dataobjects; using FFXIVClassic_Lobby_Server.packets; using FFXIVClassic_Lobby_Server.packets.receive; @@ -53,7 +53,7 @@ namespace FFXIVClassic_Lobby_Server case 0x0F: //Mod Retainers default: - Log.Debug(String.Format("Unknown command 0x{0:X} received.", subpacket.gameMessage.opcode)); + Program.Log.Debug(String.Format("Unknown command 0x{0:X} received.", subpacket.gameMessage.opcode)); break; } } @@ -67,7 +67,7 @@ namespace FFXIVClassic_Lobby_Server byte[] blowfishKey = GenerateKey(securityHandshake.ticketPhrase, securityHandshake.clientNumber); client.blowfish = new Blowfish(blowfishKey); - Log.Info(String.Format("SecCNum: 0x{0:X}", securityHandshake.clientNumber)); + Program.Log.Info(String.Format("SecCNum: 0x{0:X}", securityHandshake.clientNumber)); //Respond with acknowledgment BasePacket outgoingPacket = new BasePacket(HardCoded_Packets.g_secureConnectionAcknowledgment); @@ -81,8 +81,8 @@ namespace FFXIVClassic_Lobby_Server SessionPacket sessionPacket = new SessionPacket(packet.data); String clientVersion = sessionPacket.version; - Log.Info(String.Format("Got acknowledgment for secure session.")); - Log.Info(String.Format("CLIENT VERSION: {0}", clientVersion)); + Program.Log.Info(String.Format("Got acknowledgment for secure session.")); + Program.Log.Info(String.Format("CLIENT VERSION: {0}", clientVersion)); uint userId = Database.getUserIdFromSession(sessionPacket.session); client.currentUserId = userId; @@ -96,11 +96,11 @@ namespace FFXIVClassic_Lobby_Server BasePacket.encryptPacket(client.blowfish, errorBasePacket); client.queuePacket(errorBasePacket); - Log.Info(String.Format("Invalid session, kicking...")); + Program.Log.Info(String.Format("Invalid session, kicking...")); return; } - Log.Info(String.Format("USER ID: {0}", userId)); + Program.Log.Info(String.Format("USER ID: {0}", userId)); List accountList = new List(); Account defaultAccount = new Account(); @@ -115,7 +115,7 @@ namespace FFXIVClassic_Lobby_Server private void ProcessGetCharacters(ClientConnection client, SubPacket packet) { - Log.Info(String.Format("{0} => Get characters", client.currentUserId == 0 ? client.getAddress() : "User " + client.currentUserId)); + Program.Log.Info(String.Format("{0} => Get characters", client.currentUserId == 0 ? client.getAddress() : "User " + client.currentUserId)); sendWorldList(client, packet); sendImportList(client, packet); @@ -128,7 +128,7 @@ namespace FFXIVClassic_Lobby_Server { SelectCharacterPacket selectCharRequest = new SelectCharacterPacket(packet.data); - Log.Info(String.Format("{0} => Select character id {1}", client.currentUserId == 0 ? client.getAddress() : "User " + client.currentUserId, selectCharRequest.characterId)); + Program.Log.Info(String.Format("{0} => Select character id {1}", client.currentUserId == 0 ? client.getAddress() : "User " + client.currentUserId, selectCharRequest.characterId)); Character chara = Database.getCharacter(client.currentUserId, selectCharRequest.characterId); World world = null; @@ -187,7 +187,7 @@ namespace FFXIVClassic_Lobby_Server BasePacket.encryptPacket(client.blowfish, basePacket); client.queuePacket(basePacket); - Log.Info(String.Format("User {0} => Error; invalid server id: \"{1}\"", client.currentUserId, worldId)); + Program.Log.Info(String.Format("User {0} => Error; invalid server id: \"{1}\"", client.currentUserId, worldId)); return; } @@ -207,7 +207,7 @@ namespace FFXIVClassic_Lobby_Server BasePacket.encryptPacket(client.blowfish, basePacket); client.queuePacket(basePacket); - Log.Info(String.Format("User {0} => Error; name taken: \"{1}\"", client.currentUserId, charaReq.characterName)); + Program.Log.Info(String.Format("User {0} => Error; name taken: \"{1}\"", client.currentUserId, charaReq.characterName)); return; } else @@ -219,7 +219,7 @@ namespace FFXIVClassic_Lobby_Server client.newCharaName = name; } - Log.Info(String.Format("User {0} => Character reserved \"{1}\"", client.currentUserId, name)); + Program.Log.Info(String.Format("User {0} => Character reserved \"{1}\"", client.currentUserId, name)); break; case 0x02://Make CharaInfo info = CharaInfo.getFromNewCharRequest(charaReq.characterInfoEncoded); @@ -272,7 +272,7 @@ namespace FFXIVClassic_Lobby_Server cid = client.newCharaCid; name = client.newCharaName; - Log.Info(String.Format("User {0} => Character created \"{1}\"", client.currentUserId, name)); + Program.Log.Info(String.Format("User {0} => Character created \"{1}\"", client.currentUserId, name)); break; case 0x03://Rename @@ -286,20 +286,20 @@ namespace FFXIVClassic_Lobby_Server BasePacket.encryptPacket(client.blowfish, basePacket); client.queuePacket(basePacket); - Log.Info(String.Format("User {0} => Error; name taken: \"{1}\"", client.currentUserId, charaReq.characterName)); + Program.Log.Info(String.Format("User {0} => Error; name taken: \"{1}\"", client.currentUserId, charaReq.characterName)); return; } - Log.Info(String.Format("User {0} => Character renamed \"{1}\"", client.currentUserId, name)); + Program.Log.Info(String.Format("User {0} => Character renamed \"{1}\"", client.currentUserId, name)); break; case 0x04://Delete Database.deleteCharacter(charaReq.characterId, charaReq.characterName); - Log.Info(String.Format("User {0} => Character deleted \"{1}\"", client.currentUserId, name)); + Program.Log.Info(String.Format("User {0} => Character deleted \"{1}\"", client.currentUserId, name)); break; case 0x06://Rename Retainer - Log.Info(String.Format("User {0} => Retainer renamed \"{1}\"", client.currentUserId, name)); + Program.Log.Info(String.Format("User {0} => Retainer renamed \"{1}\"", client.currentUserId, name)); break; } @@ -349,7 +349,7 @@ namespace FFXIVClassic_Lobby_Server List characterList = Database.getCharacters(client.currentUserId); if (characterList.Count > 8) - Log.Error("Warning, got more than 8 characters. List truncated, check DB for issues."); + Program.Log.Error("Warning, got more than 8 characters. List truncated, check DB for issues."); CharacterListPacket characterlistPacket = new CharacterListPacket(0, characterList); List subPackets = characterlistPacket.buildPackets(); diff --git a/FFXIVClassic Lobby Server/Program.cs b/FFXIVClassic Lobby Server/Program.cs index f99bd6e8..37019433 100644 --- a/FFXIVClassic Lobby Server/Program.cs +++ b/FFXIVClassic Lobby Server/Program.cs @@ -3,12 +3,14 @@ using System.Diagnostics; using System.Threading; using MySql.Data.MySqlClient; using System.Reflection; -using FFXIVClassic_Lobby_Server.common; +using FFXIVClassic.Common; namespace FFXIVClassic_Lobby_Server { class Program { + public static Log Log; + static void Main(string[] args) { #if DEBUG @@ -22,15 +24,30 @@ namespace FFXIVClassic_Lobby_Server if (!ConfigConstants.load()) startServer = false; - Log.Info("--------FFXIV 1.0 Lobby Server--------"); + Log = new Log(ConfigConstants.OPTIONS_LOGPATH, ConfigConstants.OPTIONS_LOGFILE, Int32.Parse(ConfigConstants.OPTIONS_LOGLEVEL)); + + Thread thread = new Thread(() => + { + while (true) + { + if (Log.LogQueue.Count > 0) + { + var message = Program.Log.LogQueue.Dequeue(); + Program.Log.WriteMessage(message.Item1, message.Item2); + } + } + }); + thread.Start(); + + Program.Log.Info("--------FFXIV 1.0 Lobby Server--------"); Assembly assem = Assembly.GetExecutingAssembly(); Version vers = assem.GetName().Version; - Log.Info("Version: " + vers.ToString()); + Program.Log.Info("Version: " + vers.ToString()); //Test DB Connection - Log.Info(String.Format("Testing DB connection to \"{0}\"... ", ConfigConstants.DATABASE_HOST)); + Program.Log.Info(String.Format("Testing DB connection to \"{0}\"... ", ConfigConstants.DATABASE_HOST)); using (MySqlConnection conn = new MySqlConnection(String.Format("Server={0}; Port={1}; Database={2}; UID={3}; Password={4}", ConfigConstants.DATABASE_HOST, ConfigConstants.DATABASE_PORT, ConfigConstants.DATABASE_NAME, ConfigConstants.DATABASE_USERNAME, ConfigConstants.DATABASE_PASSWORD))) { try @@ -38,12 +55,12 @@ namespace FFXIVClassic_Lobby_Server conn.Open(); conn.Close(); - Log.Status("[OK]"); + Program.Log.Status("[OK]"); } catch (MySqlException e) { - Log.Error(e.ToString()); - Log.Error("[FAILED]"); + Program.Log.Error(e.ToString()); + Program.Log.Error("[FAILED]"); startServer = false; } @@ -58,7 +75,7 @@ namespace FFXIVClassic_Lobby_Server while (true) Thread.Sleep(10000); } - Log.Info("Press any key to continue..."); + Program.Log.Info("Press any key to continue..."); Console.ReadKey(); } diff --git a/FFXIVClassic Lobby Server/Server.cs b/FFXIVClassic Lobby Server/Server.cs index 929e2d8a..6bcc66a5 100644 --- a/FFXIVClassic Lobby Server/Server.cs +++ b/FFXIVClassic Lobby Server/Server.cs @@ -4,7 +4,7 @@ using System.Net; using System.Net.Sockets; using System.Threading; using FFXIVClassic_Lobby_Server.packets; -using FFXIVClassic_Lobby_Server.common; +using FFXIVClassic.Common; namespace FFXIVClassic_Lobby_Server { @@ -25,7 +25,7 @@ namespace FFXIVClassic_Lobby_Server private void socketCleanup() { - Log.Debug(String.Format("Cleanup thread started; it will run every {0} seconds.", CLEANUP_THREAD_SLEEP_TIME)); + Program.Log.Debug(String.Format("Cleanup thread started; it will run every {0} seconds.", CLEANUP_THREAD_SLEEP_TIME)); while (!killCleanupThread) { int count = 0; @@ -40,7 +40,7 @@ namespace FFXIVClassic_Lobby_Server } } if (count != 0) - Log.Status(String.Format("{0} connections were cleaned up.", count)); + Program.Log.Status(String.Format("{0} connections were cleaned up.", count)); Thread.Sleep(CLEANUP_THREAD_SLEEP_TIME*1000); } } @@ -80,7 +80,7 @@ namespace FFXIVClassic_Lobby_Server } Console.ForegroundColor = ConsoleColor.White; - Log.Debug(String.Format("Lobby Server has started @ {0}:{1}", (mServerSocket.LocalEndPoint as IPEndPoint).Address, (mServerSocket.LocalEndPoint as IPEndPoint).Port)); + Program.Log.Debug(String.Format("Lobby Server has started @ {0}:{1}", (mServerSocket.LocalEndPoint as IPEndPoint).Address, (mServerSocket.LocalEndPoint as IPEndPoint).Port)); Console.ForegroundColor = ConsoleColor.Gray; mProcessor = new PacketProcessor(); @@ -105,7 +105,7 @@ namespace FFXIVClassic_Lobby_Server conn.socket.BeginReceive(conn.buffer, 0, conn.buffer.Length, SocketFlags.None, new AsyncCallback(receiveCallback), conn); //Queue the accept of the next incomming connection mServerSocket.BeginAccept(new AsyncCallback(acceptCallback), mServerSocket); - Log.Status(String.Format("Connection {0}:{1} has connected.", (conn.socket.RemoteEndPoint as IPEndPoint).Address, (conn.socket.RemoteEndPoint as IPEndPoint).Port)); + Program.Log.Status(String.Format("Connection {0}:{1} has connected.", (conn.socket.RemoteEndPoint as IPEndPoint).Address, (conn.socket.RemoteEndPoint as IPEndPoint).Port)); } catch (SocketException) { @@ -179,7 +179,7 @@ namespace FFXIVClassic_Lobby_Server } else { - Log.Status(String.Format("{0} has disconnected.", conn.currentUserId == 0 ? conn.getAddress() : "User " + conn.currentUserId)); + Program.Log.Status(String.Format("{0} has disconnected.", conn.currentUserId == 0 ? conn.getAddress() : "User " + conn.currentUserId)); lock (mConnectionList) { @@ -192,7 +192,7 @@ namespace FFXIVClassic_Lobby_Server { if (conn.socket != null) { - Log.Status(String.Format("{0} has disconnected.", conn.currentUserId == 0 ? conn.getAddress() : "User " + conn.currentUserId)); + Program.Log.Status(String.Format("{0} has disconnected.", conn.currentUserId == 0 ? conn.getAddress() : "User " + conn.currentUserId)); lock (mConnectionList) { diff --git a/FFXIVClassic Lobby Server/common/Blowfish.cs b/FFXIVClassic Lobby Server/common/Blowfish.cs deleted file mode 100644 index 16590402..00000000 --- a/FFXIVClassic Lobby Server/common/Blowfish.cs +++ /dev/null @@ -1,456 +0,0 @@ -using System; - -namespace FFXIVClassic_Lobby_Server.common -{ - public class Blowfish - { - const int N = 16; - UInt32 [] P = new uint[16 + 2]; - UInt32 [,] S = new UInt32[4,256]; - - #region P and S Values - - byte [] P_values = - { - 0x88, 0x6A, 0x3F, 0x24, 0xD3, 0x08, 0xA3, 0x85, 0x2E, 0x8A, 0x19, 0x13, 0x44, 0x73, 0x70, 0x03, - 0x22, 0x38, 0x09, 0xA4, 0xD0, 0x31, 0x9F, 0x29, 0x98, 0xFA, 0x2E, 0x08, 0x89, 0x6C, 0x4E, 0xEC, - 0xE6, 0x21, 0x28, 0x45, 0x77, 0x13, 0xD0, 0x38, 0xCF, 0x66, 0x54, 0xBE, 0x6C, 0x0C, 0xE9, 0x34, - 0xB7, 0x29, 0xAC, 0xC0, 0xDD, 0x50, 0x7C, 0xC9, 0xB5, 0xD5, 0x84, 0x3F, 0x17, 0x09, 0x47, 0xB5, - 0xD9, 0xD5, 0x16, 0x92, 0x1B, 0xFB, 0x79, 0x89 - }; - - byte [] S_values = - { - 0xA6, 0x0B, 0x31, 0xD1, 0xAC, 0xB5, 0xDF, 0x98, 0xDB, 0x72, 0xFD, 0x2F, 0xB7, 0xDF, 0x1A, 0xD0, - 0xED, 0xAF, 0xE1, 0xB8, 0x96, 0x7E, 0x26, 0x6A, 0x45, 0x90, 0x7C, 0xBA, 0x99, 0x7F, 0x2C, 0xF1, - 0x47, 0x99, 0xA1, 0x24, 0xF7, 0x6C, 0x91, 0xB3, 0xE2, 0xF2, 0x01, 0x08, 0x16, 0xFC, 0x8E, 0x85, - 0xD8, 0x20, 0x69, 0x63, 0x69, 0x4E, 0x57, 0x71, 0xA3, 0xFE, 0x58, 0xA4, 0x7E, 0x3D, 0x93, 0xF4, - 0x8F, 0x74, 0x95, 0x0D, 0x58, 0xB6, 0x8E, 0x72, 0x58, 0xCD, 0x8B, 0x71, 0xEE, 0x4A, 0x15, 0x82, - 0x1D, 0xA4, 0x54, 0x7B, 0xB5, 0x59, 0x5A, 0xC2, 0x39, 0xD5, 0x30, 0x9C, 0x13, 0x60, 0xF2, 0x2A, - 0x23, 0xB0, 0xD1, 0xC5, 0xF0, 0x85, 0x60, 0x28, 0x18, 0x79, 0x41, 0xCA, 0xEF, 0x38, 0xDB, 0xB8, - 0xB0, 0xDC, 0x79, 0x8E, 0x0E, 0x18, 0x3A, 0x60, 0x8B, 0x0E, 0x9E, 0x6C, 0x3E, 0x8A, 0x1E, 0xB0, - 0xC1, 0x77, 0x15, 0xD7, 0x27, 0x4B, 0x31, 0xBD, 0xDA, 0x2F, 0xAF, 0x78, 0x60, 0x5C, 0x60, 0x55, - 0xF3, 0x25, 0x55, 0xE6, 0x94, 0xAB, 0x55, 0xAA, 0x62, 0x98, 0x48, 0x57, 0x40, 0x14, 0xE8, 0x63, - 0x6A, 0x39, 0xCA, 0x55, 0xB6, 0x10, 0xAB, 0x2A, 0x34, 0x5C, 0xCC, 0xB4, 0xCE, 0xE8, 0x41, 0x11, - 0xAF, 0x86, 0x54, 0xA1, 0x93, 0xE9, 0x72, 0x7C, 0x11, 0x14, 0xEE, 0xB3, 0x2A, 0xBC, 0x6F, 0x63, - 0x5D, 0xC5, 0xA9, 0x2B, 0xF6, 0x31, 0x18, 0x74, 0x16, 0x3E, 0x5C, 0xCE, 0x1E, 0x93, 0x87, 0x9B, - 0x33, 0xBA, 0xD6, 0xAF, 0x5C, 0xCF, 0x24, 0x6C, 0x81, 0x53, 0x32, 0x7A, 0x77, 0x86, 0x95, 0x28, - 0x98, 0x48, 0x8F, 0x3B, 0xAF, 0xB9, 0x4B, 0x6B, 0x1B, 0xE8, 0xBF, 0xC4, 0x93, 0x21, 0x28, 0x66, - 0xCC, 0x09, 0xD8, 0x61, 0x91, 0xA9, 0x21, 0xFB, 0x60, 0xAC, 0x7C, 0x48, 0x32, 0x80, 0xEC, 0x5D, - 0x5D, 0x5D, 0x84, 0xEF, 0xB1, 0x75, 0x85, 0xE9, 0x02, 0x23, 0x26, 0xDC, 0x88, 0x1B, 0x65, 0xEB, - 0x81, 0x3E, 0x89, 0x23, 0xC5, 0xAC, 0x96, 0xD3, 0xF3, 0x6F, 0x6D, 0x0F, 0x39, 0x42, 0xF4, 0x83, - 0x82, 0x44, 0x0B, 0x2E, 0x04, 0x20, 0x84, 0xA4, 0x4A, 0xF0, 0xC8, 0x69, 0x5E, 0x9B, 0x1F, 0x9E, - 0x42, 0x68, 0xC6, 0x21, 0x9A, 0x6C, 0xE9, 0xF6, 0x61, 0x9C, 0x0C, 0x67, 0xF0, 0x88, 0xD3, 0xAB, - 0xD2, 0xA0, 0x51, 0x6A, 0x68, 0x2F, 0x54, 0xD8, 0x28, 0xA7, 0x0F, 0x96, 0xA3, 0x33, 0x51, 0xAB, - 0x6C, 0x0B, 0xEF, 0x6E, 0xE4, 0x3B, 0x7A, 0x13, 0x50, 0xF0, 0x3B, 0xBA, 0x98, 0x2A, 0xFB, 0x7E, - 0x1D, 0x65, 0xF1, 0xA1, 0x76, 0x01, 0xAF, 0x39, 0x3E, 0x59, 0xCA, 0x66, 0x88, 0x0E, 0x43, 0x82, - 0x19, 0x86, 0xEE, 0x8C, 0xB4, 0x9F, 0x6F, 0x45, 0xC3, 0xA5, 0x84, 0x7D, 0xBE, 0x5E, 0x8B, 0x3B, - 0xD8, 0x75, 0x6F, 0xE0, 0x73, 0x20, 0xC1, 0x85, 0x9F, 0x44, 0x1A, 0x40, 0xA6, 0x6A, 0xC1, 0x56, - 0x62, 0xAA, 0xD3, 0x4E, 0x06, 0x77, 0x3F, 0x36, 0x72, 0xDF, 0xFE, 0x1B, 0x3D, 0x02, 0x9B, 0x42, - 0x24, 0xD7, 0xD0, 0x37, 0x48, 0x12, 0x0A, 0xD0, 0xD3, 0xEA, 0x0F, 0xDB, 0x9B, 0xC0, 0xF1, 0x49, - 0xC9, 0x72, 0x53, 0x07, 0x7B, 0x1B, 0x99, 0x80, 0xD8, 0x79, 0xD4, 0x25, 0xF7, 0xDE, 0xE8, 0xF6, - 0x1A, 0x50, 0xFE, 0xE3, 0x3B, 0x4C, 0x79, 0xB6, 0xBD, 0xE0, 0x6C, 0x97, 0xBA, 0x06, 0xC0, 0x04, - 0xB6, 0x4F, 0xA9, 0xC1, 0xC4, 0x60, 0x9F, 0x40, 0xC2, 0x9E, 0x5C, 0x5E, 0x63, 0x24, 0x6A, 0x19, - 0xAF, 0x6F, 0xFB, 0x68, 0xB5, 0x53, 0x6C, 0x3E, 0xEB, 0xB2, 0x39, 0x13, 0x6F, 0xEC, 0x52, 0x3B, - 0x1F, 0x51, 0xFC, 0x6D, 0x2C, 0x95, 0x30, 0x9B, 0x44, 0x45, 0x81, 0xCC, 0x09, 0xBD, 0x5E, 0xAF, - 0x04, 0xD0, 0xE3, 0xBE, 0xFD, 0x4A, 0x33, 0xDE, 0x07, 0x28, 0x0F, 0x66, 0xB3, 0x4B, 0x2E, 0x19, - 0x57, 0xA8, 0xCB, 0xC0, 0x0F, 0x74, 0xC8, 0x45, 0x39, 0x5F, 0x0B, 0xD2, 0xDB, 0xFB, 0xD3, 0xB9, - 0xBD, 0xC0, 0x79, 0x55, 0x0A, 0x32, 0x60, 0x1A, 0xC6, 0x00, 0xA1, 0xD6, 0x79, 0x72, 0x2C, 0x40, - 0xFE, 0x25, 0x9F, 0x67, 0xCC, 0xA3, 0x1F, 0xFB, 0xF8, 0xE9, 0xA5, 0x8E, 0xF8, 0x22, 0x32, 0xDB, - 0xDF, 0x16, 0x75, 0x3C, 0x15, 0x6B, 0x61, 0xFD, 0xC8, 0x1E, 0x50, 0x2F, 0xAB, 0x52, 0x05, 0xAD, - 0xFA, 0xB5, 0x3D, 0x32, 0x60, 0x87, 0x23, 0xFD, 0x48, 0x7B, 0x31, 0x53, 0x82, 0xDF, 0x00, 0x3E, - 0xBB, 0x57, 0x5C, 0x9E, 0xA0, 0x8C, 0x6F, 0xCA, 0x2E, 0x56, 0x87, 0x1A, 0xDB, 0x69, 0x17, 0xDF, - 0xF6, 0xA8, 0x42, 0xD5, 0xC3, 0xFF, 0x7E, 0x28, 0xC6, 0x32, 0x67, 0xAC, 0x73, 0x55, 0x4F, 0x8C, - 0xB0, 0x27, 0x5B, 0x69, 0xC8, 0x58, 0xCA, 0xBB, 0x5D, 0xA3, 0xFF, 0xE1, 0xA0, 0x11, 0xF0, 0xB8, - 0x98, 0x3D, 0xFA, 0x10, 0xB8, 0x83, 0x21, 0xFD, 0x6C, 0xB5, 0xFC, 0x4A, 0x5B, 0xD3, 0xD1, 0x2D, - 0x79, 0xE4, 0x53, 0x9A, 0x65, 0x45, 0xF8, 0xB6, 0xBC, 0x49, 0x8E, 0xD2, 0x90, 0x97, 0xFB, 0x4B, - 0xDA, 0xF2, 0xDD, 0xE1, 0x33, 0x7E, 0xCB, 0xA4, 0x41, 0x13, 0xFB, 0x62, 0xE8, 0xC6, 0xE4, 0xCE, - 0xDA, 0xCA, 0x20, 0xEF, 0x01, 0x4C, 0x77, 0x36, 0xFE, 0x9E, 0x7E, 0xD0, 0xB4, 0x1F, 0xF1, 0x2B, - 0x4D, 0xDA, 0xDB, 0x95, 0x98, 0x91, 0x90, 0xAE, 0x71, 0x8E, 0xAD, 0xEA, 0xA0, 0xD5, 0x93, 0x6B, - 0xD0, 0xD1, 0x8E, 0xD0, 0xE0, 0x25, 0xC7, 0xAF, 0x2F, 0x5B, 0x3C, 0x8E, 0xB7, 0x94, 0x75, 0x8E, - 0xFB, 0xE2, 0xF6, 0x8F, 0x64, 0x2B, 0x12, 0xF2, 0x12, 0xB8, 0x88, 0x88, 0x1C, 0xF0, 0x0D, 0x90, - 0xA0, 0x5E, 0xAD, 0x4F, 0x1C, 0xC3, 0x8F, 0x68, 0x91, 0xF1, 0xCF, 0xD1, 0xAD, 0xC1, 0xA8, 0xB3, - 0x18, 0x22, 0x2F, 0x2F, 0x77, 0x17, 0x0E, 0xBE, 0xFE, 0x2D, 0x75, 0xEA, 0xA1, 0x1F, 0x02, 0x8B, - 0x0F, 0xCC, 0xA0, 0xE5, 0xE8, 0x74, 0x6F, 0xB5, 0xD6, 0xF3, 0xAC, 0x18, 0x99, 0xE2, 0x89, 0xCE, - 0xE0, 0x4F, 0xA8, 0xB4, 0xB7, 0xE0, 0x13, 0xFD, 0x81, 0x3B, 0xC4, 0x7C, 0xD9, 0xA8, 0xAD, 0xD2, - 0x66, 0xA2, 0x5F, 0x16, 0x05, 0x77, 0x95, 0x80, 0x14, 0x73, 0xCC, 0x93, 0x77, 0x14, 0x1A, 0x21, - 0x65, 0x20, 0xAD, 0xE6, 0x86, 0xFA, 0xB5, 0x77, 0xF5, 0x42, 0x54, 0xC7, 0xCF, 0x35, 0x9D, 0xFB, - 0x0C, 0xAF, 0xCD, 0xEB, 0xA0, 0x89, 0x3E, 0x7B, 0xD3, 0x1B, 0x41, 0xD6, 0x49, 0x7E, 0x1E, 0xAE, - 0x2D, 0x0E, 0x25, 0x00, 0x5E, 0xB3, 0x71, 0x20, 0xBB, 0x00, 0x68, 0x22, 0xAF, 0xE0, 0xB8, 0x57, - 0x9B, 0x36, 0x64, 0x24, 0x1E, 0xB9, 0x09, 0xF0, 0x1D, 0x91, 0x63, 0x55, 0xAA, 0xA6, 0xDF, 0x59, - 0x89, 0x43, 0xC1, 0x78, 0x7F, 0x53, 0x5A, 0xD9, 0xA2, 0x5B, 0x7D, 0x20, 0xC5, 0xB9, 0xE5, 0x02, - 0x76, 0x03, 0x26, 0x83, 0xA9, 0xCF, 0x95, 0x62, 0x68, 0x19, 0xC8, 0x11, 0x41, 0x4A, 0x73, 0x4E, - 0xCA, 0x2D, 0x47, 0xB3, 0x4A, 0xA9, 0x14, 0x7B, 0x52, 0x00, 0x51, 0x1B, 0x15, 0x29, 0x53, 0x9A, - 0x3F, 0x57, 0x0F, 0xD6, 0xE4, 0xC6, 0x9B, 0xBC, 0x76, 0xA4, 0x60, 0x2B, 0x00, 0x74, 0xE6, 0x81, - 0xB5, 0x6F, 0xBA, 0x08, 0x1F, 0xE9, 0x1B, 0x57, 0x6B, 0xEC, 0x96, 0xF2, 0x15, 0xD9, 0x0D, 0x2A, - 0x21, 0x65, 0x63, 0xB6, 0xB6, 0xF9, 0xB9, 0xE7, 0x2E, 0x05, 0x34, 0xFF, 0x64, 0x56, 0x85, 0xC5, - 0x5D, 0x2D, 0xB0, 0x53, 0xA1, 0x8F, 0x9F, 0xA9, 0x99, 0x47, 0xBA, 0x08, 0x6A, 0x07, 0x85, 0x6E, - 0xE9, 0x70, 0x7A, 0x4B, 0x44, 0x29, 0xB3, 0xB5, 0x2E, 0x09, 0x75, 0xDB, 0x23, 0x26, 0x19, 0xC4, - 0xB0, 0xA6, 0x6E, 0xAD, 0x7D, 0xDF, 0xA7, 0x49, 0xB8, 0x60, 0xEE, 0x9C, 0x66, 0xB2, 0xED, 0x8F, - 0x71, 0x8C, 0xAA, 0xEC, 0xFF, 0x17, 0x9A, 0x69, 0x6C, 0x52, 0x64, 0x56, 0xE1, 0x9E, 0xB1, 0xC2, - 0xA5, 0x02, 0x36, 0x19, 0x29, 0x4C, 0x09, 0x75, 0x40, 0x13, 0x59, 0xA0, 0x3E, 0x3A, 0x18, 0xE4, - 0x9A, 0x98, 0x54, 0x3F, 0x65, 0x9D, 0x42, 0x5B, 0xD6, 0xE4, 0x8F, 0x6B, 0xD6, 0x3F, 0xF7, 0x99, - 0x07, 0x9C, 0xD2, 0xA1, 0xF5, 0x30, 0xE8, 0xEF, 0xE6, 0x38, 0x2D, 0x4D, 0xC1, 0x5D, 0x25, 0xF0, - 0x86, 0x20, 0xDD, 0x4C, 0x26, 0xEB, 0x70, 0x84, 0xC6, 0xE9, 0x82, 0x63, 0x5E, 0xCC, 0x1E, 0x02, - 0x3F, 0x6B, 0x68, 0x09, 0xC9, 0xEF, 0xBA, 0x3E, 0x14, 0x18, 0x97, 0x3C, 0xA1, 0x70, 0x6A, 0x6B, - 0x84, 0x35, 0x7F, 0x68, 0x86, 0xE2, 0xA0, 0x52, 0x05, 0x53, 0x9C, 0xB7, 0x37, 0x07, 0x50, 0xAA, - 0x1C, 0x84, 0x07, 0x3E, 0x5C, 0xAE, 0xDE, 0x7F, 0xEC, 0x44, 0x7D, 0x8E, 0xB8, 0xF2, 0x16, 0x57, - 0x37, 0xDA, 0x3A, 0xB0, 0x0D, 0x0C, 0x50, 0xF0, 0x04, 0x1F, 0x1C, 0xF0, 0xFF, 0xB3, 0x00, 0x02, - 0x1A, 0xF5, 0x0C, 0xAE, 0xB2, 0x74, 0xB5, 0x3C, 0x58, 0x7A, 0x83, 0x25, 0xBD, 0x21, 0x09, 0xDC, - 0xF9, 0x13, 0x91, 0xD1, 0xF6, 0x2F, 0xA9, 0x7C, 0x73, 0x47, 0x32, 0x94, 0x01, 0x47, 0xF5, 0x22, - 0x81, 0xE5, 0xE5, 0x3A, 0xDC, 0xDA, 0xC2, 0x37, 0x34, 0x76, 0xB5, 0xC8, 0xA7, 0xDD, 0xF3, 0x9A, - 0x46, 0x61, 0x44, 0xA9, 0x0E, 0x03, 0xD0, 0x0F, 0x3E, 0xC7, 0xC8, 0xEC, 0x41, 0x1E, 0x75, 0xA4, - 0x99, 0xCD, 0x38, 0xE2, 0x2F, 0x0E, 0xEA, 0x3B, 0xA1, 0xBB, 0x80, 0x32, 0x31, 0xB3, 0x3E, 0x18, - 0x38, 0x8B, 0x54, 0x4E, 0x08, 0xB9, 0x6D, 0x4F, 0x03, 0x0D, 0x42, 0x6F, 0xBF, 0x04, 0x0A, 0xF6, - 0x90, 0x12, 0xB8, 0x2C, 0x79, 0x7C, 0x97, 0x24, 0x72, 0xB0, 0x79, 0x56, 0xAF, 0x89, 0xAF, 0xBC, - 0x1F, 0x77, 0x9A, 0xDE, 0x10, 0x08, 0x93, 0xD9, 0x12, 0xAE, 0x8B, 0xB3, 0x2E, 0x3F, 0xCF, 0xDC, - 0x1F, 0x72, 0x12, 0x55, 0x24, 0x71, 0x6B, 0x2E, 0xE6, 0xDD, 0x1A, 0x50, 0x87, 0xCD, 0x84, 0x9F, - 0x18, 0x47, 0x58, 0x7A, 0x17, 0xDA, 0x08, 0x74, 0xBC, 0x9A, 0x9F, 0xBC, 0x8C, 0x7D, 0x4B, 0xE9, - 0x3A, 0xEC, 0x7A, 0xEC, 0xFA, 0x1D, 0x85, 0xDB, 0x66, 0x43, 0x09, 0x63, 0xD2, 0xC3, 0x64, 0xC4, - 0x47, 0x18, 0x1C, 0xEF, 0x08, 0xD9, 0x15, 0x32, 0x37, 0x3B, 0x43, 0xDD, 0x16, 0xBA, 0xC2, 0x24, - 0x43, 0x4D, 0xA1, 0x12, 0x51, 0xC4, 0x65, 0x2A, 0x02, 0x00, 0x94, 0x50, 0xDD, 0xE4, 0x3A, 0x13, - 0x9E, 0xF8, 0xDF, 0x71, 0x55, 0x4E, 0x31, 0x10, 0xD6, 0x77, 0xAC, 0x81, 0x9B, 0x19, 0x11, 0x5F, - 0xF1, 0x56, 0x35, 0x04, 0x6B, 0xC7, 0xA3, 0xD7, 0x3B, 0x18, 0x11, 0x3C, 0x09, 0xA5, 0x24, 0x59, - 0xED, 0xE6, 0x8F, 0xF2, 0xFA, 0xFB, 0xF1, 0x97, 0x2C, 0xBF, 0xBA, 0x9E, 0x6E, 0x3C, 0x15, 0x1E, - 0x70, 0x45, 0xE3, 0x86, 0xB1, 0x6F, 0xE9, 0xEA, 0x0A, 0x5E, 0x0E, 0x86, 0xB3, 0x2A, 0x3E, 0x5A, - 0x1C, 0xE7, 0x1F, 0x77, 0xFA, 0x06, 0x3D, 0x4E, 0xB9, 0xDC, 0x65, 0x29, 0x0F, 0x1D, 0xE7, 0x99, - 0xD6, 0x89, 0x3E, 0x80, 0x25, 0xC8, 0x66, 0x52, 0x78, 0xC9, 0x4C, 0x2E, 0x6A, 0xB3, 0x10, 0x9C, - 0xBA, 0x0E, 0x15, 0xC6, 0x78, 0xEA, 0xE2, 0x94, 0x53, 0x3C, 0xFC, 0xA5, 0xF4, 0x2D, 0x0A, 0x1E, - 0xA7, 0x4E, 0xF7, 0xF2, 0x3D, 0x2B, 0x1D, 0x36, 0x0F, 0x26, 0x39, 0x19, 0x60, 0x79, 0xC2, 0x19, - 0x08, 0xA7, 0x23, 0x52, 0xB6, 0x12, 0x13, 0xF7, 0x6E, 0xFE, 0xAD, 0xEB, 0x66, 0x1F, 0xC3, 0xEA, - 0x95, 0x45, 0xBC, 0xE3, 0x83, 0xC8, 0x7B, 0xA6, 0xD1, 0x37, 0x7F, 0xB1, 0x28, 0xFF, 0x8C, 0x01, - 0xEF, 0xDD, 0x32, 0xC3, 0xA5, 0x5A, 0x6C, 0xBE, 0x85, 0x21, 0x58, 0x65, 0x02, 0x98, 0xAB, 0x68, - 0x0F, 0xA5, 0xCE, 0xEE, 0x3B, 0x95, 0x2F, 0xDB, 0xAD, 0x7D, 0xEF, 0x2A, 0x84, 0x2F, 0x6E, 0x5B, - 0x28, 0xB6, 0x21, 0x15, 0x70, 0x61, 0x07, 0x29, 0x75, 0x47, 0xDD, 0xEC, 0x10, 0x15, 0x9F, 0x61, - 0x30, 0xA8, 0xCC, 0x13, 0x96, 0xBD, 0x61, 0xEB, 0x1E, 0xFE, 0x34, 0x03, 0xCF, 0x63, 0x03, 0xAA, - 0x90, 0x5C, 0x73, 0xB5, 0x39, 0xA2, 0x70, 0x4C, 0x0B, 0x9E, 0x9E, 0xD5, 0x14, 0xDE, 0xAA, 0xCB, - 0xBC, 0x86, 0xCC, 0xEE, 0xA7, 0x2C, 0x62, 0x60, 0xAB, 0x5C, 0xAB, 0x9C, 0x6E, 0x84, 0xF3, 0xB2, - 0xAF, 0x1E, 0x8B, 0x64, 0xCA, 0xF0, 0xBD, 0x19, 0xB9, 0x69, 0x23, 0xA0, 0x50, 0xBB, 0x5A, 0x65, - 0x32, 0x5A, 0x68, 0x40, 0xB3, 0xB4, 0x2A, 0x3C, 0xD5, 0xE9, 0x9E, 0x31, 0xF7, 0xB8, 0x21, 0xC0, - 0x19, 0x0B, 0x54, 0x9B, 0x99, 0xA0, 0x5F, 0x87, 0x7E, 0x99, 0xF7, 0x95, 0xA8, 0x7D, 0x3D, 0x62, - 0x9A, 0x88, 0x37, 0xF8, 0x77, 0x2D, 0xE3, 0x97, 0x5F, 0x93, 0xED, 0x11, 0x81, 0x12, 0x68, 0x16, - 0x29, 0x88, 0x35, 0x0E, 0xD6, 0x1F, 0xE6, 0xC7, 0xA1, 0xDF, 0xDE, 0x96, 0x99, 0xBA, 0x58, 0x78, - 0xA5, 0x84, 0xF5, 0x57, 0x63, 0x72, 0x22, 0x1B, 0xFF, 0xC3, 0x83, 0x9B, 0x96, 0x46, 0xC2, 0x1A, - 0xEB, 0x0A, 0xB3, 0xCD, 0x54, 0x30, 0x2E, 0x53, 0xE4, 0x48, 0xD9, 0x8F, 0x28, 0x31, 0xBC, 0x6D, - 0xEF, 0xF2, 0xEB, 0x58, 0xEA, 0xFF, 0xC6, 0x34, 0x61, 0xED, 0x28, 0xFE, 0x73, 0x3C, 0x7C, 0xEE, - 0xD9, 0x14, 0x4A, 0x5D, 0xE3, 0xB7, 0x64, 0xE8, 0x14, 0x5D, 0x10, 0x42, 0xE0, 0x13, 0x3E, 0x20, - 0xB6, 0xE2, 0xEE, 0x45, 0xEA, 0xAB, 0xAA, 0xA3, 0x15, 0x4F, 0x6C, 0xDB, 0xD0, 0x4F, 0xCB, 0xFA, - 0x42, 0xF4, 0x42, 0xC7, 0xB5, 0xBB, 0x6A, 0xEF, 0x1D, 0x3B, 0x4F, 0x65, 0x05, 0x21, 0xCD, 0x41, - 0x9E, 0x79, 0x1E, 0xD8, 0xC7, 0x4D, 0x85, 0x86, 0x6A, 0x47, 0x4B, 0xE4, 0x50, 0x62, 0x81, 0x3D, - 0xF2, 0xA1, 0x62, 0xCF, 0x46, 0x26, 0x8D, 0x5B, 0xA0, 0x83, 0x88, 0xFC, 0xA3, 0xB6, 0xC7, 0xC1, - 0xC3, 0x24, 0x15, 0x7F, 0x92, 0x74, 0xCB, 0x69, 0x0B, 0x8A, 0x84, 0x47, 0x85, 0xB2, 0x92, 0x56, - 0x00, 0xBF, 0x5B, 0x09, 0x9D, 0x48, 0x19, 0xAD, 0x74, 0xB1, 0x62, 0x14, 0x00, 0x0E, 0x82, 0x23, - 0x2A, 0x8D, 0x42, 0x58, 0xEA, 0xF5, 0x55, 0x0C, 0x3E, 0xF4, 0xAD, 0x1D, 0x61, 0x70, 0x3F, 0x23, - 0x92, 0xF0, 0x72, 0x33, 0x41, 0x7E, 0x93, 0x8D, 0xF1, 0xEC, 0x5F, 0xD6, 0xDB, 0x3B, 0x22, 0x6C, - 0x59, 0x37, 0xDE, 0x7C, 0x60, 0x74, 0xEE, 0xCB, 0xA7, 0xF2, 0x85, 0x40, 0x6E, 0x32, 0x77, 0xCE, - 0x84, 0x80, 0x07, 0xA6, 0x9E, 0x50, 0xF8, 0x19, 0x55, 0xD8, 0xEF, 0xE8, 0x35, 0x97, 0xD9, 0x61, - 0xAA, 0xA7, 0x69, 0xA9, 0xC2, 0x06, 0x0C, 0xC5, 0xFC, 0xAB, 0x04, 0x5A, 0xDC, 0xCA, 0x0B, 0x80, - 0x2E, 0x7A, 0x44, 0x9E, 0x84, 0x34, 0x45, 0xC3, 0x05, 0x67, 0xD5, 0xFD, 0xC9, 0x9E, 0x1E, 0x0E, - 0xD3, 0xDB, 0x73, 0xDB, 0xCD, 0x88, 0x55, 0x10, 0x79, 0xDA, 0x5F, 0x67, 0x40, 0x43, 0x67, 0xE3, - 0x65, 0x34, 0xC4, 0xC5, 0xD8, 0x38, 0x3E, 0x71, 0x9E, 0xF8, 0x28, 0x3D, 0x20, 0xFF, 0x6D, 0xF1, - 0xE7, 0x21, 0x3E, 0x15, 0x4A, 0x3D, 0xB0, 0x8F, 0x2B, 0x9F, 0xE3, 0xE6, 0xF7, 0xAD, 0x83, 0xDB, - 0x68, 0x5A, 0x3D, 0xE9, 0xF7, 0x40, 0x81, 0x94, 0x1C, 0x26, 0x4C, 0xF6, 0x34, 0x29, 0x69, 0x94, - 0xF7, 0x20, 0x15, 0x41, 0xF7, 0xD4, 0x02, 0x76, 0x2E, 0x6B, 0xF4, 0xBC, 0x68, 0x00, 0xA2, 0xD4, - 0x71, 0x24, 0x08, 0xD4, 0x6A, 0xF4, 0x20, 0x33, 0xB7, 0xD4, 0xB7, 0x43, 0xAF, 0x61, 0x00, 0x50, - 0x2E, 0xF6, 0x39, 0x1E, 0x46, 0x45, 0x24, 0x97, 0x74, 0x4F, 0x21, 0x14, 0x40, 0x88, 0x8B, 0xBF, - 0x1D, 0xFC, 0x95, 0x4D, 0xAF, 0x91, 0xB5, 0x96, 0xD3, 0xDD, 0xF4, 0x70, 0x45, 0x2F, 0xA0, 0x66, - 0xEC, 0x09, 0xBC, 0xBF, 0x85, 0x97, 0xBD, 0x03, 0xD0, 0x6D, 0xAC, 0x7F, 0x04, 0x85, 0xCB, 0x31, - 0xB3, 0x27, 0xEB, 0x96, 0x41, 0x39, 0xFD, 0x55, 0xE6, 0x47, 0x25, 0xDA, 0x9A, 0x0A, 0xCA, 0xAB, - 0x25, 0x78, 0x50, 0x28, 0xF4, 0x29, 0x04, 0x53, 0xDA, 0x86, 0x2C, 0x0A, 0xFB, 0x6D, 0xB6, 0xE9, - 0x62, 0x14, 0xDC, 0x68, 0x00, 0x69, 0x48, 0xD7, 0xA4, 0xC0, 0x0E, 0x68, 0xEE, 0x8D, 0xA1, 0x27, - 0xA2, 0xFE, 0x3F, 0x4F, 0x8C, 0xAD, 0x87, 0xE8, 0x06, 0xE0, 0x8C, 0xB5, 0xB6, 0xD6, 0xF4, 0x7A, - 0x7C, 0x1E, 0xCE, 0xAA, 0xEC, 0x5F, 0x37, 0xD3, 0x99, 0xA3, 0x78, 0xCE, 0x42, 0x2A, 0x6B, 0x40, - 0x35, 0x9E, 0xFE, 0x20, 0xB9, 0x85, 0xF3, 0xD9, 0xAB, 0xD7, 0x39, 0xEE, 0x8B, 0x4E, 0x12, 0x3B, - 0xF7, 0xFA, 0xC9, 0x1D, 0x56, 0x18, 0x6D, 0x4B, 0x31, 0x66, 0xA3, 0x26, 0xB2, 0x97, 0xE3, 0xEA, - 0x74, 0xFA, 0x6E, 0x3A, 0x32, 0x43, 0x5B, 0xDD, 0xF7, 0xE7, 0x41, 0x68, 0xFB, 0x20, 0x78, 0xCA, - 0x4E, 0xF5, 0x0A, 0xFB, 0x97, 0xB3, 0xFE, 0xD8, 0xAC, 0x56, 0x40, 0x45, 0x27, 0x95, 0x48, 0xBA, - 0x3A, 0x3A, 0x53, 0x55, 0x87, 0x8D, 0x83, 0x20, 0xB7, 0xA9, 0x6B, 0xFE, 0x4B, 0x95, 0x96, 0xD0, - 0xBC, 0x67, 0xA8, 0x55, 0x58, 0x9A, 0x15, 0xA1, 0x63, 0x29, 0xA9, 0xCC, 0x33, 0xDB, 0xE1, 0x99, - 0x56, 0x4A, 0x2A, 0xA6, 0xF9, 0x25, 0x31, 0x3F, 0x1C, 0x7E, 0xF4, 0x5E, 0x7C, 0x31, 0x29, 0x90, - 0x02, 0xE8, 0xF8, 0xFD, 0x70, 0x2F, 0x27, 0x04, 0x5C, 0x15, 0xBB, 0x80, 0xE3, 0x2C, 0x28, 0x05, - 0x48, 0x15, 0xC1, 0x95, 0x22, 0x6D, 0xC6, 0xE4, 0x3F, 0x13, 0xC1, 0x48, 0xDC, 0x86, 0x0F, 0xC7, - 0xEE, 0xC9, 0xF9, 0x07, 0x0F, 0x1F, 0x04, 0x41, 0xA4, 0x79, 0x47, 0x40, 0x17, 0x6E, 0x88, 0x5D, - 0xEB, 0x51, 0x5F, 0x32, 0xD1, 0xC0, 0x9B, 0xD5, 0x8F, 0xC1, 0xBC, 0xF2, 0x64, 0x35, 0x11, 0x41, - 0x34, 0x78, 0x7B, 0x25, 0x60, 0x9C, 0x2A, 0x60, 0xA3, 0xE8, 0xF8, 0xDF, 0x1B, 0x6C, 0x63, 0x1F, - 0xC2, 0xB4, 0x12, 0x0E, 0x9E, 0x32, 0xE1, 0x02, 0xD1, 0x4F, 0x66, 0xAF, 0x15, 0x81, 0xD1, 0xCA, - 0xE0, 0x95, 0x23, 0x6B, 0xE1, 0x92, 0x3E, 0x33, 0x62, 0x0B, 0x24, 0x3B, 0x22, 0xB9, 0xBE, 0xEE, - 0x0E, 0xA2, 0xB2, 0x85, 0x99, 0x0D, 0xBA, 0xE6, 0x8C, 0x0C, 0x72, 0xDE, 0x28, 0xF7, 0xA2, 0x2D, - 0x45, 0x78, 0x12, 0xD0, 0xFD, 0x94, 0xB7, 0x95, 0x62, 0x08, 0x7D, 0x64, 0xF0, 0xF5, 0xCC, 0xE7, - 0x6F, 0xA3, 0x49, 0x54, 0xFA, 0x48, 0x7D, 0x87, 0x27, 0xFD, 0x9D, 0xC3, 0x1E, 0x8D, 0x3E, 0xF3, - 0x41, 0x63, 0x47, 0x0A, 0x74, 0xFF, 0x2E, 0x99, 0xAB, 0x6E, 0x6F, 0x3A, 0x37, 0xFD, 0xF8, 0xF4, - 0x60, 0xDC, 0x12, 0xA8, 0xF8, 0xDD, 0xEB, 0xA1, 0x4C, 0xE1, 0x1B, 0x99, 0x0D, 0x6B, 0x6E, 0xDB, - 0x10, 0x55, 0x7B, 0xC6, 0x37, 0x2C, 0x67, 0x6D, 0x3B, 0xD4, 0x65, 0x27, 0x04, 0xE8, 0xD0, 0xDC, - 0xC7, 0x0D, 0x29, 0xF1, 0xA3, 0xFF, 0x00, 0xCC, 0x92, 0x0F, 0x39, 0xB5, 0x0B, 0xED, 0x0F, 0x69, - 0xFB, 0x9F, 0x7B, 0x66, 0x9C, 0x7D, 0xDB, 0xCE, 0x0B, 0xCF, 0x91, 0xA0, 0xA3, 0x5E, 0x15, 0xD9, - 0x88, 0x2F, 0x13, 0xBB, 0x24, 0xAD, 0x5B, 0x51, 0xBF, 0x79, 0x94, 0x7B, 0xEB, 0xD6, 0x3B, 0x76, - 0xB3, 0x2E, 0x39, 0x37, 0x79, 0x59, 0x11, 0xCC, 0x97, 0xE2, 0x26, 0x80, 0x2D, 0x31, 0x2E, 0xF4, - 0xA7, 0xAD, 0x42, 0x68, 0x3B, 0x2B, 0x6A, 0xC6, 0xCC, 0x4C, 0x75, 0x12, 0x1C, 0xF1, 0x2E, 0x78, - 0x37, 0x42, 0x12, 0x6A, 0xE7, 0x51, 0x92, 0xB7, 0xE6, 0xBB, 0xA1, 0x06, 0x50, 0x63, 0xFB, 0x4B, - 0x18, 0x10, 0x6B, 0x1A, 0xFA, 0xED, 0xCA, 0x11, 0xD8, 0xBD, 0x25, 0x3D, 0xC9, 0xC3, 0xE1, 0xE2, - 0x59, 0x16, 0x42, 0x44, 0x86, 0x13, 0x12, 0x0A, 0x6E, 0xEC, 0x0C, 0xD9, 0x2A, 0xEA, 0xAB, 0xD5, - 0x4E, 0x67, 0xAF, 0x64, 0x5F, 0xA8, 0x86, 0xDA, 0x88, 0xE9, 0xBF, 0xBE, 0xFE, 0xC3, 0xE4, 0x64, - 0x57, 0x80, 0xBC, 0x9D, 0x86, 0xC0, 0xF7, 0xF0, 0xF8, 0x7B, 0x78, 0x60, 0x4D, 0x60, 0x03, 0x60, - 0x46, 0x83, 0xFD, 0xD1, 0xB0, 0x1F, 0x38, 0xF6, 0x04, 0xAE, 0x45, 0x77, 0xCC, 0xFC, 0x36, 0xD7, - 0x33, 0x6B, 0x42, 0x83, 0x71, 0xAB, 0x1E, 0xF0, 0x87, 0x41, 0x80, 0xB0, 0x5F, 0x5E, 0x00, 0x3C, - 0xBE, 0x57, 0xA0, 0x77, 0x24, 0xAE, 0xE8, 0xBD, 0x99, 0x42, 0x46, 0x55, 0x61, 0x2E, 0x58, 0xBF, - 0x8F, 0xF4, 0x58, 0x4E, 0xA2, 0xFD, 0xDD, 0xF2, 0x38, 0xEF, 0x74, 0xF4, 0xC2, 0xBD, 0x89, 0x87, - 0xC3, 0xF9, 0x66, 0x53, 0x74, 0x8E, 0xB3, 0xC8, 0x55, 0xF2, 0x75, 0xB4, 0xB9, 0xD9, 0xFC, 0x46, - 0x61, 0x26, 0xEB, 0x7A, 0x84, 0xDF, 0x1D, 0x8B, 0x79, 0x0E, 0x6A, 0x84, 0xE2, 0x95, 0x5F, 0x91, - 0x8E, 0x59, 0x6E, 0x46, 0x70, 0x57, 0xB4, 0x20, 0x91, 0x55, 0xD5, 0x8C, 0x4C, 0xDE, 0x02, 0xC9, - 0xE1, 0xAC, 0x0B, 0xB9, 0xD0, 0x05, 0x82, 0xBB, 0x48, 0x62, 0xA8, 0x11, 0x9E, 0xA9, 0x74, 0x75, - 0xB6, 0x19, 0x7F, 0xB7, 0x09, 0xDC, 0xA9, 0xE0, 0xA1, 0x09, 0x2D, 0x66, 0x33, 0x46, 0x32, 0xC4, - 0x02, 0x1F, 0x5A, 0xE8, 0x8C, 0xBE, 0xF0, 0x09, 0x25, 0xA0, 0x99, 0x4A, 0x10, 0xFE, 0x6E, 0x1D, - 0x1D, 0x3D, 0xB9, 0x1A, 0xDF, 0xA4, 0xA5, 0x0B, 0x0F, 0xF2, 0x86, 0xA1, 0x69, 0xF1, 0x68, 0x28, - 0x83, 0xDA, 0xB7, 0xDC, 0xFE, 0x06, 0x39, 0x57, 0x9B, 0xCE, 0xE2, 0xA1, 0x52, 0x7F, 0xCD, 0x4F, - 0x01, 0x5E, 0x11, 0x50, 0xFA, 0x83, 0x06, 0xA7, 0xC4, 0xB5, 0x02, 0xA0, 0x27, 0xD0, 0xE6, 0x0D, - 0x27, 0x8C, 0xF8, 0x9A, 0x41, 0x86, 0x3F, 0x77, 0x06, 0x4C, 0x60, 0xC3, 0xB5, 0x06, 0xA8, 0x61, - 0x28, 0x7A, 0x17, 0xF0, 0xE0, 0x86, 0xF5, 0xC0, 0xAA, 0x58, 0x60, 0x00, 0x62, 0x7D, 0xDC, 0x30, - 0xD7, 0x9E, 0xE6, 0x11, 0x63, 0xEA, 0x38, 0x23, 0x94, 0xDD, 0xC2, 0x53, 0x34, 0x16, 0xC2, 0xC2, - 0x56, 0xEE, 0xCB, 0xBB, 0xDE, 0xB6, 0xBC, 0x90, 0xA1, 0x7D, 0xFC, 0xEB, 0x76, 0x1D, 0x59, 0xCE, - 0x09, 0xE4, 0x05, 0x6F, 0x88, 0x01, 0x7C, 0x4B, 0x3D, 0x0A, 0x72, 0x39, 0x24, 0x7C, 0x92, 0x7C, - 0x5F, 0x72, 0xE3, 0x86, 0xB9, 0x9D, 0x4D, 0x72, 0xB4, 0x5B, 0xC1, 0x1A, 0xFC, 0xB8, 0x9E, 0xD3, - 0x78, 0x55, 0x54, 0xED, 0xB5, 0xA5, 0xFC, 0x08, 0xD3, 0x7C, 0x3D, 0xD8, 0xC4, 0x0F, 0xAD, 0x4D, - 0x5E, 0xEF, 0x50, 0x1E, 0xF8, 0xE6, 0x61, 0xB1, 0xD9, 0x14, 0x85, 0xA2, 0x3C, 0x13, 0x51, 0x6C, - 0xE7, 0xC7, 0xD5, 0x6F, 0xC4, 0x4E, 0xE1, 0x56, 0xCE, 0xBF, 0x2A, 0x36, 0x37, 0xC8, 0xC6, 0xDD, - 0x34, 0x32, 0x9A, 0xD7, 0x12, 0x82, 0x63, 0x92, 0x8E, 0xFA, 0x0E, 0x67, 0xE0, 0x00, 0x60, 0x40, - 0x37, 0xCE, 0x39, 0x3A, 0xCF, 0xF5, 0xFA, 0xD3, 0x37, 0x77, 0xC2, 0xAB, 0x1B, 0x2D, 0xC5, 0x5A, - 0x9E, 0x67, 0xB0, 0x5C, 0x42, 0x37, 0xA3, 0x4F, 0x40, 0x27, 0x82, 0xD3, 0xBE, 0x9B, 0xBC, 0x99, - 0x9D, 0x8E, 0x11, 0xD5, 0x15, 0x73, 0x0F, 0xBF, 0x7E, 0x1C, 0x2D, 0xD6, 0x7B, 0xC4, 0x00, 0xC7, - 0x6B, 0x1B, 0x8C, 0xB7, 0x45, 0x90, 0xA1, 0x21, 0xBE, 0xB1, 0x6E, 0xB2, 0xB4, 0x6E, 0x36, 0x6A, - 0x2F, 0xAB, 0x48, 0x57, 0x79, 0x6E, 0x94, 0xBC, 0xD2, 0x76, 0xA3, 0xC6, 0xC8, 0xC2, 0x49, 0x65, - 0xEE, 0xF8, 0x0F, 0x53, 0x7D, 0xDE, 0x8D, 0x46, 0x1D, 0x0A, 0x73, 0xD5, 0xC6, 0x4D, 0xD0, 0x4C, - 0xDB, 0xBB, 0x39, 0x29, 0x50, 0x46, 0xBA, 0xA9, 0xE8, 0x26, 0x95, 0xAC, 0x04, 0xE3, 0x5E, 0xBE, - 0xF0, 0xD5, 0xFA, 0xA1, 0x9A, 0x51, 0x2D, 0x6A, 0xE2, 0x8C, 0xEF, 0x63, 0x22, 0xEE, 0x86, 0x9A, - 0xB8, 0xC2, 0x89, 0xC0, 0xF6, 0x2E, 0x24, 0x43, 0xAA, 0x03, 0x1E, 0xA5, 0xA4, 0xD0, 0xF2, 0x9C, - 0xBA, 0x61, 0xC0, 0x83, 0x4D, 0x6A, 0xE9, 0x9B, 0x50, 0x15, 0xE5, 0x8F, 0xD6, 0x5B, 0x64, 0xBA, - 0xF9, 0xA2, 0x26, 0x28, 0xE1, 0x3A, 0x3A, 0xA7, 0x86, 0x95, 0xA9, 0x4B, 0xE9, 0x62, 0x55, 0xEF, - 0xD3, 0xEF, 0x2F, 0xC7, 0xDA, 0xF7, 0x52, 0xF7, 0x69, 0x6F, 0x04, 0x3F, 0x59, 0x0A, 0xFA, 0x77, - 0x15, 0xA9, 0xE4, 0x80, 0x01, 0x86, 0xB0, 0x87, 0xAD, 0xE6, 0x09, 0x9B, 0x93, 0xE5, 0x3E, 0x3B, - 0x5A, 0xFD, 0x90, 0xE9, 0x97, 0xD7, 0x34, 0x9E, 0xD9, 0xB7, 0xF0, 0x2C, 0x51, 0x8B, 0x2B, 0x02, - 0x3A, 0xAC, 0xD5, 0x96, 0x7D, 0xA6, 0x7D, 0x01, 0xD6, 0x3E, 0xCF, 0xD1, 0x28, 0x2D, 0x7D, 0x7C, - 0xCF, 0x25, 0x9F, 0x1F, 0x9B, 0xB8, 0xF2, 0xAD, 0x72, 0xB4, 0xD6, 0x5A, 0x4C, 0xF5, 0x88, 0x5A, - 0x71, 0xAC, 0x29, 0xE0, 0xE6, 0xA5, 0x19, 0xE0, 0xFD, 0xAC, 0xB0, 0x47, 0x9B, 0xFA, 0x93, 0xED, - 0x8D, 0xC4, 0xD3, 0xE8, 0xCC, 0x57, 0x3B, 0x28, 0x29, 0x66, 0xD5, 0xF8, 0x28, 0x2E, 0x13, 0x79, - 0x91, 0x01, 0x5F, 0x78, 0x55, 0x60, 0x75, 0xED, 0x44, 0x0E, 0x96, 0xF7, 0x8C, 0x5E, 0xD3, 0xE3, - 0xD4, 0x6D, 0x05, 0x15, 0xBA, 0x6D, 0xF4, 0x88, 0x25, 0x61, 0xA1, 0x03, 0xBD, 0xF0, 0x64, 0x05, - 0x15, 0x9E, 0xEB, 0xC3, 0xA2, 0x57, 0x90, 0x3C, 0xEC, 0x1A, 0x27, 0x97, 0x2A, 0x07, 0x3A, 0xA9, - 0x9B, 0x6D, 0x3F, 0x1B, 0xF5, 0x21, 0x63, 0x1E, 0xFB, 0x66, 0x9C, 0xF5, 0x19, 0xF3, 0xDC, 0x26, - 0x28, 0xD9, 0x33, 0x75, 0xF5, 0xFD, 0x55, 0xB1, 0x82, 0x34, 0x56, 0x03, 0xBB, 0x3C, 0xBA, 0x8A, - 0x11, 0x77, 0x51, 0x28, 0xF8, 0xD9, 0x0A, 0xC2, 0x67, 0x51, 0xCC, 0xAB, 0x5F, 0x92, 0xAD, 0xCC, - 0x51, 0x17, 0xE8, 0x4D, 0x8E, 0xDC, 0x30, 0x38, 0x62, 0x58, 0x9D, 0x37, 0x91, 0xF9, 0x20, 0x93, - 0xC2, 0x90, 0x7A, 0xEA, 0xCE, 0x7B, 0x3E, 0xFB, 0x64, 0xCE, 0x21, 0x51, 0x32, 0xBE, 0x4F, 0x77, - 0x7E, 0xE3, 0xB6, 0xA8, 0x46, 0x3D, 0x29, 0xC3, 0x69, 0x53, 0xDE, 0x48, 0x80, 0xE6, 0x13, 0x64, - 0x10, 0x08, 0xAE, 0xA2, 0x24, 0xB2, 0x6D, 0xDD, 0xFD, 0x2D, 0x85, 0x69, 0x66, 0x21, 0x07, 0x09, - 0x0A, 0x46, 0x9A, 0xB3, 0xDD, 0xC0, 0x45, 0x64, 0xCF, 0xDE, 0x6C, 0x58, 0xAE, 0xC8, 0x20, 0x1C, - 0xDD, 0xF7, 0xBE, 0x5B, 0x40, 0x8D, 0x58, 0x1B, 0x7F, 0x01, 0xD2, 0xCC, 0xBB, 0xE3, 0xB4, 0x6B, - 0x7E, 0x6A, 0xA2, 0xDD, 0x45, 0xFF, 0x59, 0x3A, 0x44, 0x0A, 0x35, 0x3E, 0xD5, 0xCD, 0xB4, 0xBC, - 0xA8, 0xCE, 0xEA, 0x72, 0xBB, 0x84, 0x64, 0xFA, 0xAE, 0x12, 0x66, 0x8D, 0x47, 0x6F, 0x3C, 0xBF, - 0x63, 0xE4, 0x9B, 0xD2, 0x9E, 0x5D, 0x2F, 0x54, 0x1B, 0x77, 0xC2, 0xAE, 0x70, 0x63, 0x4E, 0xF6, - 0x8D, 0x0D, 0x0E, 0x74, 0x57, 0x13, 0x5B, 0xE7, 0x71, 0x16, 0x72, 0xF8, 0x5D, 0x7D, 0x53, 0xAF, - 0x08, 0xCB, 0x40, 0x40, 0xCC, 0xE2, 0xB4, 0x4E, 0x6A, 0x46, 0xD2, 0x34, 0x84, 0xAF, 0x15, 0x01, - 0x28, 0x04, 0xB0, 0xE1, 0x1D, 0x3A, 0x98, 0x95, 0xB4, 0x9F, 0xB8, 0x06, 0x48, 0xA0, 0x6E, 0xCE, - 0x82, 0x3B, 0x3F, 0x6F, 0x82, 0xAB, 0x20, 0x35, 0x4B, 0x1D, 0x1A, 0x01, 0xF8, 0x27, 0x72, 0x27, - 0xB1, 0x60, 0x15, 0x61, 0xDC, 0x3F, 0x93, 0xE7, 0x2B, 0x79, 0x3A, 0xBB, 0xBD, 0x25, 0x45, 0x34, - 0xE1, 0x39, 0x88, 0xA0, 0x4B, 0x79, 0xCE, 0x51, 0xB7, 0xC9, 0x32, 0x2F, 0xC9, 0xBA, 0x1F, 0xA0, - 0x7E, 0xC8, 0x1C, 0xE0, 0xF6, 0xD1, 0xC7, 0xBC, 0xC3, 0x11, 0x01, 0xCF, 0xC7, 0xAA, 0xE8, 0xA1, - 0x49, 0x87, 0x90, 0x1A, 0x9A, 0xBD, 0x4F, 0xD4, 0xCB, 0xDE, 0xDA, 0xD0, 0x38, 0xDA, 0x0A, 0xD5, - 0x2A, 0xC3, 0x39, 0x03, 0x67, 0x36, 0x91, 0xC6, 0x7C, 0x31, 0xF9, 0x8D, 0x4F, 0x2B, 0xB1, 0xE0, - 0xB7, 0x59, 0x9E, 0xF7, 0x3A, 0xBB, 0xF5, 0x43, 0xFF, 0x19, 0xD5, 0xF2, 0x9C, 0x45, 0xD9, 0x27, - 0x2C, 0x22, 0x97, 0xBF, 0x2A, 0xFC, 0xE6, 0x15, 0x71, 0xFC, 0x91, 0x0F, 0x25, 0x15, 0x94, 0x9B, - 0x61, 0x93, 0xE5, 0xFA, 0xEB, 0x9C, 0xB6, 0xCE, 0x59, 0x64, 0xA8, 0xC2, 0xD1, 0xA8, 0xBA, 0x12, - 0x5E, 0x07, 0xC1, 0xB6, 0x0C, 0x6A, 0x05, 0xE3, 0x65, 0x50, 0xD2, 0x10, 0x42, 0xA4, 0x03, 0xCB, - 0x0E, 0x6E, 0xEC, 0xE0, 0x3B, 0xDB, 0x98, 0x16, 0xBE, 0xA0, 0x98, 0x4C, 0x64, 0xE9, 0x78, 0x32, - 0x32, 0x95, 0x1F, 0x9F, 0xDF, 0x92, 0xD3, 0xE0, 0x2B, 0x34, 0xA0, 0xD3, 0x1E, 0xF2, 0x71, 0x89, - 0x41, 0x74, 0x0A, 0x1B, 0x8C, 0x34, 0xA3, 0x4B, 0x20, 0x71, 0xBE, 0xC5, 0xD8, 0x32, 0x76, 0xC3, - 0x8D, 0x9F, 0x35, 0xDF, 0x2E, 0x2F, 0x99, 0x9B, 0x47, 0x6F, 0x0B, 0xE6, 0x1D, 0xF1, 0xE3, 0x0F, - 0x54, 0xDA, 0x4C, 0xE5, 0x91, 0xD8, 0xDA, 0x1E, 0xCF, 0x79, 0x62, 0xCE, 0x6F, 0x7E, 0x3E, 0xCD, - 0x66, 0xB1, 0x18, 0x16, 0x05, 0x1D, 0x2C, 0xFD, 0xC5, 0xD2, 0x8F, 0x84, 0x99, 0x22, 0xFB, 0xF6, - 0x57, 0xF3, 0x23, 0xF5, 0x23, 0x76, 0x32, 0xA6, 0x31, 0x35, 0xA8, 0x93, 0x02, 0xCD, 0xCC, 0x56, - 0x62, 0x81, 0xF0, 0xAC, 0xB5, 0xEB, 0x75, 0x5A, 0x97, 0x36, 0x16, 0x6E, 0xCC, 0x73, 0xD2, 0x88, - 0x92, 0x62, 0x96, 0xDE, 0xD0, 0x49, 0xB9, 0x81, 0x1B, 0x90, 0x50, 0x4C, 0x14, 0x56, 0xC6, 0x71, - 0xBD, 0xC7, 0xC6, 0xE6, 0x0A, 0x14, 0x7A, 0x32, 0x06, 0xD0, 0xE1, 0x45, 0x9A, 0x7B, 0xF2, 0xC3, - 0xFD, 0x53, 0xAA, 0xC9, 0x00, 0x0F, 0xA8, 0x62, 0xE2, 0xBF, 0x25, 0xBB, 0xF6, 0xD2, 0xBD, 0x35, - 0x05, 0x69, 0x12, 0x71, 0x22, 0x02, 0x04, 0xB2, 0x7C, 0xCF, 0xCB, 0xB6, 0x2B, 0x9C, 0x76, 0xCD, - 0xC0, 0x3E, 0x11, 0x53, 0xD3, 0xE3, 0x40, 0x16, 0x60, 0xBD, 0xAB, 0x38, 0xF0, 0xAD, 0x47, 0x25, - 0x9C, 0x20, 0x38, 0xBA, 0x76, 0xCE, 0x46, 0xF7, 0xC5, 0xA1, 0xAF, 0x77, 0x60, 0x60, 0x75, 0x20, - 0x4E, 0xFE, 0xCB, 0x85, 0xD8, 0x8D, 0xE8, 0x8A, 0xB0, 0xF9, 0xAA, 0x7A, 0x7E, 0xAA, 0xF9, 0x4C, - 0x5C, 0xC2, 0x48, 0x19, 0x8C, 0x8A, 0xFB, 0x02, 0xE4, 0x6A, 0xC3, 0x01, 0xF9, 0xE1, 0xEB, 0xD6, - 0x69, 0xF8, 0xD4, 0x90, 0xA0, 0xDE, 0x5C, 0xA6, 0x2D, 0x25, 0x09, 0x3F, 0x9F, 0xE6, 0x08, 0xC2, - 0x32, 0x61, 0x4E, 0xB7, 0x5B, 0xE2, 0x77, 0xCE, 0xE3, 0xDF, 0x8F, 0x57, 0xE6, 0x72, 0xC3, 0x3A - }; - - #endregion - - public Blowfish(byte[] key) - { - initializeBlowfish(key); - } - - public void Encipher(byte[] data, int offset, int length) - { - if ((length - offset) % 8 != 0) - throw new ArgumentException("Needs to be a multiple of 8"); - - for (int i = offset; i < offset + length; i += 8) - { - uint xl = (uint)((data[i + 0]) | (data[i + 1] << 8) | (data[i + 2] << 16) | (data[i + 3] << 24)); - uint xr = (uint)((data[i + 4]) | (data[i + 5] << 8) | (data[i + 6] << 16) | (data[i + 7] << 24)); - blowfish_encipher(ref xl, ref xr); - data[i + 0] = (byte)(xl >> 0); - data[i + 1] = (byte)(xl >> 8); - data[i + 2] = (byte)(xl >> 16); - data[i + 3] = (byte)(xl >> 24); - data[i + 4] = (byte)(xr >> 0); - data[i + 5] = (byte)(xr >> 8); - data[i + 6] = (byte)(xr >> 16); - data[i + 7] = (byte)(xr >> 24); - } - } - - public void Decipher(byte[] data, int offset, int length) - { - if ((length - offset) % 8 != 0) - throw new ArgumentException("Needs to be a multiple of 8"); - - for (int i = offset; i < offset + length; i += 8) - { - uint xl = (uint)((data[i + 0]) | (data[i + 1] << 8) | (data[i + 2] << 16) | (data[i + 3] << 24)); - uint xr = (uint)((data[i + 4]) | (data[i + 5] << 8) | (data[i + 6] << 16) | (data[i + 7] << 24)); - blowfish_decipher(ref xl, ref xr); - data[i + 0] = (byte)(xl >> 0); - data[i + 1] = (byte)(xl >> 8); - data[i + 2] = (byte)(xl >> 16); - data[i + 3] = (byte)(xl >> 24); - data[i + 4] = (byte)(xr >> 0); - data[i + 5] = (byte)(xr >> 8); - data[i + 6] = (byte)(xr >> 16); - data[i + 7] = (byte)(xr >> 24); - } - } - - private UInt32 F(UInt32 x) - { - UInt16 a; - UInt16 b; - UInt16 c; - UInt16 d; - UInt32 y; - - d = (UInt16)(x & 0x00FF); - x >>= 8; - c = (UInt16)(x & 0x00FF); - x >>= 8; - b = (UInt16)(x & 0x00FF); - x >>= 8; - a = (UInt16)(x & 0x00FF); - //y = ((S[0][a] + S[1][b]) ^ S[2][c]) + S[3][d]; - y = S[0,a] + S[1,b]; - y = y ^ S[2,c]; - y = y + S[3,d]; - - return y; - } - - private void blowfish_encipher(ref UInt32 xl, ref UInt32 xr) - { - UInt32 temp; - Int32 i; - - for (i = 0; i < N; ++i) { - xl = xl ^ P[i]; - xr = F(xl) ^ xr; - - temp = xl; - xl = xr; - xr = temp; - } - - temp = xl; - xl = xr; - xr = temp; - - xr = xr ^ P[N]; - xl = xl ^ P[N + 1]; - - } - - private void blowfish_decipher(ref UInt32 xl, ref UInt32 xr) - { - UInt32 temp; - Int32 i; - - for (i = N + 1; i > 1; --i) { - xl = xl ^ P[i]; - xr = F(xl) ^ xr; - - /* Exchange xl and xr */ - temp = xl; - xl = xr; - xr = temp; - } - - /* Exchange xl and xr */ - temp = xl; - xl = xr; - xr = temp; - - xr = xr ^ P[1]; - xl = xl ^ P[0]; - - } - - private int initializeBlowfish(byte [] key) - { - Int16 i; - Int16 j; - Int16 k; - - int data; - uint datal; - uint datar; - - Buffer.BlockCopy(P_values, 0, P, 0, P_values.Length); - Buffer.BlockCopy(S_values, 0, S, 0, S_values.Length); - - j = 0; - for (i = 0; i < N + 2; ++i) - { - data = 0x00000000; - for (k = 0; k < 4; ++k) - { - data = (data << 8) | (SByte)key[j]; - j = (short)(j + 1); - if (j >= key.Length) - { - j = 0; - } - } - P[i] = P[i] ^ (uint)data; - } - - datal = 0x00000000; - datar = 0x00000000; - - for (i = 0; i < N + 2; i += 2) - { - blowfish_encipher(ref datal, ref datar); - - P[i] = datal; - P[i + 1] = datar; - } - - for (i = 0; i < 4; ++i) - { - for (j = 0; j < 256; j += 2) - { - blowfish_encipher(ref datal, ref datar); - S[i,j] = datal; - S[i,j + 1] = datar; - } - } - - return 0; - } - - } -} diff --git a/FFXIVClassic Lobby Server/common/Log.cs b/FFXIVClassic Lobby Server/common/Log.cs deleted file mode 100644 index a5b6164a..00000000 --- a/FFXIVClassic Lobby Server/common/Log.cs +++ /dev/null @@ -1,72 +0,0 @@ -using System; -using System.IO; -using System.Text; - -namespace FFXIVClassic_Lobby_Server.common -{ - class Log - { - public enum LogType - { - Status = ConsoleColor.Green, - Sql = ConsoleColor.Magenta, - Info = ConsoleColor.White, - Debug = ConsoleColor.Cyan, - Error = ConsoleColor.Red - } - - public static void Status(String message) - { - LogFile(message, LogType.Status); - } - - public static void Sql(String message) - { - LogFile(message, LogType.Sql); - } - - public static void Info(String message) - { - LogFile(message, LogType.Info); - } - - public static void Debug(String message) - { -#if DEBUG - LogFile(message, LogType.Debug); -#endif - } - - public static void Error(String message) - { - LogFile(message, LogType.Error); - } - - private static void LogFile(String message, LogType type) - { - string timestamp = String.Format("[{0}]", DateTime.Now.ToString("MM/dd/yyyy HH:mm:ss")); - string messageType = String.Format("[{0}] ", type.ToString().ToUpper()); - - Console.Write(timestamp); - Console.ForegroundColor = (ConsoleColor)type; - Console.Write(messageType); - Console.ForegroundColor = ConsoleColor.Gray; - Console.WriteLine(message); - - StringBuilder sb = new StringBuilder(); - - sb.AppendLine(String.Format("{0}{1}{2}", timestamp, messageType, message)); - - if (!Directory.Exists(ConfigConstants.OPTIONS_LOGPATH)) - { - Directory.CreateDirectory(ConfigConstants.OPTIONS_LOGPATH); - } - - using (FileStream fs = new FileStream(Path.Combine(ConfigConstants.OPTIONS_LOGPATH, ConfigConstants.OPTIONS_LOGFILE), FileMode.Append, FileAccess.Write)) - using (StreamWriter sw = new StreamWriter(fs)) - { - sw.WriteLine(sb.ToString()); - } - } - } -} \ No newline at end of file diff --git a/FFXIVClassic Lobby Server/common/STA_INIFile.cs b/FFXIVClassic Lobby Server/common/STA_INIFile.cs deleted file mode 100644 index 52f1f188..00000000 --- a/FFXIVClassic Lobby Server/common/STA_INIFile.cs +++ /dev/null @@ -1,533 +0,0 @@ -// ******************************* -// *** INIFile class V2.1 *** -// ******************************* -// *** (C)2009-2013 S.T.A. snc *** -// ******************************* -using System; -using System.Collections.Generic; -using System.Globalization; -using System.IO; -using System.Text; - -namespace STA.Settings -{ - - internal class INIFile - { - -#region "Declarations" - - // *** Lock for thread-safe access to file and local cache *** - private object m_Lock = new object(); - - // *** File name *** - private string m_FileName = null; - internal string FileName - { - get - { - return m_FileName; - } - } - - // *** Lazy loading flag *** - private bool m_Lazy = false; - - // *** Automatic flushing flag *** - private bool m_AutoFlush = false; - - // *** Local cache *** - private Dictionary> m_Sections = new Dictionary>(); - private Dictionary> m_Modified = new Dictionary>(); - - // *** Local cache modified flag *** - private bool m_CacheModified = false; - -#endregion - -#region "Methods" - - // *** Constructor *** - public INIFile(string FileName) - { - Initialize(FileName, false, false); - } - - public INIFile(string FileName, bool Lazy, bool AutoFlush) - { - Initialize(FileName, Lazy, AutoFlush); - } - - // *** Initialization *** - private void Initialize(string FileName, bool Lazy, bool AutoFlush) - { - m_FileName = FileName; - m_Lazy = Lazy; - m_AutoFlush = AutoFlush; - if (!m_Lazy) Refresh(); - } - - // *** Parse section name *** - private string ParseSectionName(string Line) - { - if (!Line.StartsWith("[")) return null; - if (!Line.EndsWith("]")) return null; - if (Line.Length < 3) return null; - return Line.Substring(1, Line.Length - 2); - } - - // *** Parse key+value pair *** - private bool ParseKeyValuePair(string Line, ref string Key, ref string Value) - { - // *** Check for key+value pair *** - int i; - if ((i = Line.IndexOf('=')) <= 0) return false; - - int j = Line.Length - i - 1; - Key = Line.Substring(0, i).Trim(); - if (Key.Length <= 0) return false; - - Value = (j > 0) ? (Line.Substring(i + 1, j).Trim()) : (""); - return true; - } - - // *** Read file contents into local cache *** - internal void Refresh() - { - lock (m_Lock) - { - StreamReader sr = null; - try - { - // *** Clear local cache *** - m_Sections.Clear(); - m_Modified.Clear(); - - // *** Open the INI file *** - try - { - sr = new StreamReader(m_FileName); - } - catch (FileNotFoundException) - { - return; - } - - // *** Read up the file content *** - Dictionary CurrentSection = null; - string s; - string SectionName; - string Key = null; - string Value = null; - while ((s = sr.ReadLine()) != null) - { - s = s.Trim(); - - // *** Check for section names *** - SectionName = ParseSectionName(s); - if (SectionName != null) - { - // *** Only first occurrence of a section is loaded *** - if (m_Sections.ContainsKey(SectionName)) - { - CurrentSection = null; - } - else - { - CurrentSection = new Dictionary(); - m_Sections.Add(SectionName, CurrentSection); - } - } - else if (CurrentSection != null) - { - // *** Check for key+value pair *** - if (ParseKeyValuePair(s, ref Key, ref Value)) - { - // *** Only first occurrence of a key is loaded *** - if (!CurrentSection.ContainsKey(Key)) - { - CurrentSection.Add(Key, Value); - } - } - } - } - } - finally - { - // *** Cleanup: close file *** - if (sr != null) sr.Close(); - sr = null; - } - } - } - - // *** Flush local cache content *** - internal void Flush() - { - lock (m_Lock) - { - PerformFlush(); - } - } - - private void PerformFlush() - { - // *** If local cache was not modified, exit *** - if (!m_CacheModified) return; - m_CacheModified = false; - - // *** Check if original file exists *** - bool OriginalFileExists = File.Exists(m_FileName); - - // *** Get temporary file name *** - string TmpFileName = Path.ChangeExtension(m_FileName, "$n$"); - - // *** Copy content of original file to temporary file, replace modified values *** - StreamWriter sw = null; - - // *** Create the temporary file *** - sw = new StreamWriter(TmpFileName); - - try - { - Dictionary CurrentSection = null; - if (OriginalFileExists) - { - StreamReader sr = null; - try - { - // *** Open the original file *** - sr = new StreamReader(m_FileName); - - // *** Read the file original content, replace changes with local cache values *** - string s; - string SectionName; - string Key = null; - string Value = null; - bool Unmodified; - bool Reading = true; - while (Reading) - { - s = sr.ReadLine(); - Reading = (s != null); - - // *** Check for end of file *** - if (Reading) - { - Unmodified = true; - s = s.Trim(); - SectionName = ParseSectionName(s); - } - else - { - Unmodified = false; - SectionName = null; - } - - // *** Check for section names *** - if ((SectionName != null) || (!Reading)) - { - if (CurrentSection != null) - { - // *** Write all remaining modified values before leaving a section **** - if (CurrentSection.Count > 0) - { - foreach (string fkey in CurrentSection.Keys) - { - if (CurrentSection.TryGetValue(fkey, out Value)) - { - sw.Write(fkey); - sw.Write('='); - sw.WriteLine(Value); - } - } - sw.WriteLine(); - CurrentSection.Clear(); - } - } - - if (Reading) - { - // *** Check if current section is in local modified cache *** - if (!m_Modified.TryGetValue(SectionName, out CurrentSection)) - { - CurrentSection = null; - } - } - } - else if (CurrentSection != null) - { - // *** Check for key+value pair *** - if (ParseKeyValuePair(s, ref Key, ref Value)) - { - if (CurrentSection.TryGetValue(Key, out Value)) - { - // *** Write modified value to temporary file *** - Unmodified = false; - CurrentSection.Remove(Key); - - sw.Write(Key); - sw.Write('='); - sw.WriteLine(Value); - } - } - } - - // *** Write unmodified lines from the original file *** - if (Unmodified) - { - sw.WriteLine(s); - } - } - - // *** Close the original file *** - sr.Close(); - sr = null; - } - finally - { - // *** Cleanup: close files *** - if (sr != null) sr.Close(); - sr = null; - } - } - - // *** Cycle on all remaining modified values *** - foreach (KeyValuePair> SectionPair in m_Modified) - { - CurrentSection = SectionPair.Value; - if (CurrentSection.Count > 0) - { - sw.WriteLine(); - - // *** Write the section name *** - sw.Write('['); - sw.Write(SectionPair.Key); - sw.WriteLine(']'); - - // *** Cycle on all key+value pairs in the section *** - foreach (KeyValuePair ValuePair in CurrentSection) - { - // *** Write the key+value pair *** - sw.Write(ValuePair.Key); - sw.Write('='); - sw.WriteLine(ValuePair.Value); - } - CurrentSection.Clear(); - } - } - m_Modified.Clear(); - - // *** Close the temporary file *** - sw.Close(); - sw = null; - - // *** Rename the temporary file *** - File.Copy(TmpFileName, m_FileName, true); - - // *** Delete the temporary file *** - File.Delete(TmpFileName); - } - finally - { - // *** Cleanup: close files *** - if (sw != null) sw.Close(); - sw = null; - } - } - - // *** Read a value from local cache *** - internal string GetValue(string SectionName, string Key, string DefaultValue) - { - // *** Lazy loading *** - if (m_Lazy) - { - m_Lazy = false; - Refresh(); - } - - lock (m_Lock) - { - // *** Check if the section exists *** - Dictionary Section; - if (!m_Sections.TryGetValue(SectionName, out Section)) return DefaultValue; - - // *** Check if the key exists *** - string Value; - if (!Section.TryGetValue(Key, out Value)) return DefaultValue; - - // *** Return the found value *** - return Value; - } - } - - // *** Insert or modify a value in local cache *** - internal void SetValue(string SectionName, string Key, string Value) - { - // *** Lazy loading *** - if (m_Lazy) - { - m_Lazy = false; - Refresh(); - } - - lock (m_Lock) - { - // *** Flag local cache modification *** - m_CacheModified = true; - - // *** Check if the section exists *** - Dictionary Section; - if (!m_Sections.TryGetValue(SectionName, out Section)) - { - // *** If it doesn't, add it *** - Section = new Dictionary(); - m_Sections.Add(SectionName,Section); - } - - // *** Modify the value *** - if (Section.ContainsKey(Key)) Section.Remove(Key); - Section.Add(Key, Value); - - // *** Add the modified value to local modified values cache *** - if (!m_Modified.TryGetValue(SectionName, out Section)) - { - Section = new Dictionary(); - m_Modified.Add(SectionName, Section); - } - - if (Section.ContainsKey(Key)) Section.Remove(Key); - Section.Add(Key, Value); - - // *** Automatic flushing : immediately write any modification to the file *** - if (m_AutoFlush) PerformFlush(); - } - } - - // *** Encode byte array *** - private string EncodeByteArray(byte[] Value) - { - if (Value == null) return null; - - StringBuilder sb = new StringBuilder(); - foreach (byte b in Value) - { - string hex = Convert.ToString(b, 16); - int l = hex.Length; - if (l > 2) - { - sb.Append(hex.Substring(l - 2, 2)); - } - else - { - if (l < 2) sb.Append("0"); - sb.Append(hex); - } - } - return sb.ToString(); - } - - // *** Decode byte array *** - private byte[] DecodeByteArray(string Value) - { - if (Value == null) return null; - - int l = Value.Length; - if (l < 2) return new byte[] { }; - - l /= 2; - byte[] Result = new byte[l]; - for (int i = 0; i < l; i++) Result[i] = Convert.ToByte(Value.Substring(i * 2, 2), 16); - return Result; - } - - // *** Getters for various types *** - internal bool GetValue(string SectionName, string Key, bool DefaultValue) - { - string StringValue = GetValue(SectionName, Key, DefaultValue.ToString(System.Globalization.CultureInfo.InvariantCulture)); - int Value; - if (int.TryParse(StringValue, out Value)) return (Value != 0); - return DefaultValue; - } - - internal int GetValue(string SectionName, string Key, int DefaultValue) - { - string StringValue = GetValue(SectionName, Key, DefaultValue.ToString(CultureInfo.InvariantCulture)); - int Value; - if (int.TryParse(StringValue, NumberStyles.Any, CultureInfo.InvariantCulture, out Value)) return Value; - return DefaultValue; - } - - internal long GetValue(string SectionName, string Key, long DefaultValue) - { - string StringValue = GetValue(SectionName, Key, DefaultValue.ToString(CultureInfo.InvariantCulture)); - long Value; - if (long.TryParse(StringValue, NumberStyles.Any, CultureInfo.InvariantCulture, out Value)) return Value; - return DefaultValue; - } - - internal double GetValue(string SectionName, string Key, double DefaultValue) - { - string StringValue = GetValue(SectionName, Key, DefaultValue.ToString(CultureInfo.InvariantCulture)); - double Value; - if (double.TryParse(StringValue, NumberStyles.Any, CultureInfo.InvariantCulture, out Value)) return Value; - return DefaultValue; - } - - internal byte[] GetValue(string SectionName, string Key, byte[] DefaultValue) - { - string StringValue = GetValue(SectionName, Key, EncodeByteArray(DefaultValue)); - try - { - return DecodeByteArray(StringValue); - } - catch (FormatException) - { - return DefaultValue; - } - } - - internal DateTime GetValue(string SectionName, string Key, DateTime DefaultValue) - { - string StringValue = GetValue(SectionName, Key, DefaultValue.ToString(CultureInfo.InvariantCulture)); - DateTime Value; - if (DateTime.TryParse(StringValue, CultureInfo.InvariantCulture, DateTimeStyles.AllowWhiteSpaces | DateTimeStyles.NoCurrentDateDefault | DateTimeStyles.AssumeLocal, out Value)) return Value; - return DefaultValue; - } - - // *** Setters for various types *** - internal void SetValue(string SectionName, string Key, bool Value) - { - SetValue(SectionName, Key, (Value) ? ("1") : ("0")); - } - - internal void SetValue(string SectionName, string Key, int Value) - { - SetValue(SectionName, Key, Value.ToString(CultureInfo.InvariantCulture)); - } - - internal void SetValue(string SectionName, string Key, long Value) - { - SetValue(SectionName, Key, Value.ToString(CultureInfo.InvariantCulture)); - } - - internal void SetValue(string SectionName, string Key, double Value) - { - SetValue(SectionName, Key, Value.ToString(CultureInfo.InvariantCulture)); - } - - internal void SetValue(string SectionName, string Key, byte[] Value) - { - SetValue(SectionName, Key, EncodeByteArray(Value)); - } - - internal void SetValue(string SectionName, string Key, DateTime Value) - { - SetValue(SectionName, Key, Value.ToString(CultureInfo.InvariantCulture)); - } - -#endregion - - } - -} diff --git a/FFXIVClassic Lobby Server/dataobjects/CharaInfo.cs b/FFXIVClassic Lobby Server/dataobjects/CharaInfo.cs index 746c7568..835436ee 100644 --- a/FFXIVClassic Lobby Server/dataobjects/CharaInfo.cs +++ b/FFXIVClassic Lobby Server/dataobjects/CharaInfo.cs @@ -1,5 +1,5 @@ using System; -using FFXIVClassic_Lobby_Server.common; +using FFXIVClassic.Common; using System.IO; namespace FFXIVClassic_Lobby_Server.dataobjects @@ -227,7 +227,7 @@ namespace FFXIVClassic_Lobby_Server.dataobjects { byte[] bytes = File.ReadAllBytes("./packets/charaappearance.bin"); - Log.Debug(Utils.ByteArrayToHex(bytes)); + Program.Log.Debug(Utils.ByteArrayToHex(bytes)); return Convert.ToBase64String(bytes).Replace('+', '-').Replace('/', '_'); } diff --git a/FFXIVClassic Lobby Server/dataobjects/Character.cs b/FFXIVClassic Lobby Server/dataobjects/Character.cs index 5789009f..e120d431 100644 --- a/FFXIVClassic Lobby Server/dataobjects/Character.cs +++ b/FFXIVClassic Lobby Server/dataobjects/Character.cs @@ -1,5 +1,5 @@ using System; -using FFXIVClassic_Lobby_Server.common; +using FFXIVClassic.Common; using FFXIVClassic_Lobby_Server.dataobjects; namespace FFXIVClassic_Lobby_Server @@ -33,9 +33,9 @@ namespace FFXIVClassic_Lobby_Server charaInfo.Replace("/", "_"); byte[] data = System.Convert.FromBase64String(charaInfo); - Log.Debug("------------Base64 printout------------------"); - Log.Debug(Utils.ByteArrayToHex(data)); - Log.Debug("------------Base64 printout------------------"); + Program.Log.Debug("------------Base64 printout------------------"); + Program.Log.Debug(Utils.ByteArrayToHex(data)); + Program.Log.Debug("------------Base64 printout------------------"); CharaInfo chara = new CharaInfo(); diff --git a/FFXIVClassic Lobby Server/packets/BasePacket.cs b/FFXIVClassic Lobby Server/packets/BasePacket.cs index d0d3df2e..956af8ee 100644 --- a/FFXIVClassic Lobby Server/packets/BasePacket.cs +++ b/FFXIVClassic Lobby Server/packets/BasePacket.cs @@ -2,7 +2,7 @@ using System.Collections.Generic; using System.Runtime.InteropServices; using System.Diagnostics; -using FFXIVClassic_Lobby_Server.common; +using FFXIVClassic.Common; using System.IO; namespace FFXIVClassic_Lobby_Server.packets @@ -336,7 +336,7 @@ namespace FFXIVClassic_Lobby_Server.packets #if DEBUG Console.BackgroundColor = ConsoleColor.DarkYellow; - Log.Debug(String.Format("IsAuth: {0} Size: 0x{1:X}, NumSubpackets: {2}{3}{4}", header.isAuthenticated, header.packetSize, header.numSubpackets, Environment.NewLine, Utils.ByteArrayToHex(getHeaderBytes()))); + Program.Log.Debug(String.Format("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()) { diff --git a/FFXIVClassic Lobby Server/packets/SubPacket.cs b/FFXIVClassic Lobby Server/packets/SubPacket.cs index 18bdb652..c9263b19 100644 --- a/FFXIVClassic Lobby Server/packets/SubPacket.cs +++ b/FFXIVClassic Lobby Server/packets/SubPacket.cs @@ -1,6 +1,6 @@ using System; using System.Runtime.InteropServices; -using FFXIVClassic_Lobby_Server.common; +using FFXIVClassic.Common; namespace FFXIVClassic_Lobby_Server.packets { @@ -142,16 +142,16 @@ namespace FFXIVClassic_Lobby_Server.packets #if DEBUG Console.BackgroundColor = ConsoleColor.DarkRed; - Log.Debug(String.Format("Size: 0x{0:X}{1}{2}", header.subpacketSize, Environment.NewLine, Utils.ByteArrayToHex(getHeaderBytes()))); + Program.Log.Debug(String.Format("Size: 0x{0:X}{1}{2}", header.subpacketSize, Environment.NewLine, Utils.ByteArrayToHex(getHeaderBytes()))); if (header.type == 0x03) { - Log.Debug(String.Format("Opcode: 0x{0:X}{1}{2}", gameMessage.opcode, Environment.NewLine, Utils.ByteArrayToHex(getGameMessageBytes(), SUBPACKET_SIZE))); + Program.Log.Debug(String.Format("Opcode: 0x{0:X}{1}{2}", gameMessage.opcode, Environment.NewLine, Utils.ByteArrayToHex(getGameMessageBytes(), SUBPACKET_SIZE))); } Console.BackgroundColor = ConsoleColor.DarkMagenta; - Log.Debug(String.Format("Data: {0}{1}", Environment.NewLine, Utils.ByteArrayToHex(data, SUBPACKET_SIZE + GAMEMESSAGE_SIZE))); + Program.Log.Debug(String.Format("Data: {0}{1}", Environment.NewLine, Utils.ByteArrayToHex(data, SUBPACKET_SIZE + GAMEMESSAGE_SIZE))); Console.BackgroundColor = ConsoleColor.Black; #endif diff --git a/FFXIVClassic Map Server/ClientConnection.cs b/FFXIVClassic Map Server/ClientConnection.cs index 9acf0918..67b2a04c 100644 --- a/FFXIVClassic Map Server/ClientConnection.cs +++ b/FFXIVClassic Map Server/ClientConnection.cs @@ -1,7 +1,7 @@ using System; using System.Net.Sockets; using FFXIVClassic_Map_Server.packets; -using FFXIVClassic_Map_Server.common; +using FFXIVClassic.Common; using System.Collections.Concurrent; using System.Net; @@ -46,7 +46,7 @@ namespace FFXIVClassic_Map_Server socket.Send(packetBytes); } catch (Exception e) - { Log.Error(String.Format("Weird case, socket was d/ced: {0}", e)); } + { Program.Log.Error(String.Format("Weird case, socket was d/ced: {0}", e)); } } } diff --git a/FFXIVClassic Map Server/CommandProcessor.cs b/FFXIVClassic Map Server/CommandProcessor.cs index d2ca6d24..79db6b74 100644 --- a/FFXIVClassic Map Server/CommandProcessor.cs +++ b/FFXIVClassic Map Server/CommandProcessor.cs @@ -1,7 +1,7 @@ using System; using System.Collections.Generic; using System.Linq; -using FFXIVClassic_Map_Server.common; +using FFXIVClassic.Common; using FFXIVClassic_Map_Server.dataobjects; using FFXIVClassic_Map_Server.packets; using FFXIVClassic_Map_Server.packets.send.actor; @@ -116,7 +116,7 @@ namespace FFXIVClassic_Map_Server { if (client != null) client.queuePacket(BasePacket.createPacket(SendMessagePacket.buildPacket(client.actorID, client.actorID, SendMessagePacket.MESSAGE_TYPE_GENERAL_INFO, "", "Zone does not exist or setting isn't valid."), true, false)); - Log.Error("Zone does not exist or setting isn't valid."); + Program.Log.Error("Zone does not exist or setting isn't valid."); } if (client != null) @@ -142,7 +142,7 @@ namespace FFXIVClassic_Map_Server foreach (KeyValuePair entry in mConnectedPlayerList) { Player p = entry.Value.getActor(); - Log.Info(String.Format("{0}\'s position: ZoneID: {1}, X: {2}, Y: {3}, Z: {4}, Rotation: {5}", p.customDisplayName, p.zoneId, p.positionX, p.positionY, p.positionZ, p.rotation)); + Program.Log.Info(String.Format("{0}\'s position: ZoneID: {1}, X: {2}, Y: {3}, Z: {4}, Rotation: {5}", p.customDisplayName, p.zoneId, p.positionX, p.positionY, p.positionZ, p.rotation)); } } } @@ -578,7 +578,7 @@ namespace FFXIVClassic_Map_Server } catch (Exception e) { - Log.Error("Could not change weather: " + e); + Program.Log.Error("Could not change weather: " + e); } } #endregion @@ -597,7 +597,7 @@ namespace FFXIVClassic_Map_Server } catch (Exception e) { - Log.Error("Could not load packet: " + e); + Program.Log.Error("Could not load packet: " + e); } } #endregion @@ -607,7 +607,7 @@ namespace FFXIVClassic_Map_Server { if (client != null) { - Log.Info(String.Format("Got request to reset zone: {0}", client.getActor().zoneId)); + Program.Log.Info(String.Format("Got request to reset zone: {0}", client.getActor().zoneId)); client.getActor().zone.clear(); client.getActor().zone.addActorToZone(client.getActor()); client.getActor().sendInstanceUpdate(); @@ -621,11 +621,11 @@ namespace FFXIVClassic_Map_Server #region !reloaditems else if (split[0].Equals("reloaditems")) { - Log.Info(String.Format("Got request to reload item gamedata")); + Program.Log.Info(String.Format("Got request to reload item gamedata")); sendMessage(client, "Reloading Item Gamedata..."); gamedataItems.Clear(); gamedataItems = Database.getItemGamedata(); - Log.Info(String.Format("Loaded {0} items.", gamedataItems.Count)); + Program.Log.Info(String.Format("Loaded {0} items.", gamedataItems.Count)); sendMessage(client, String.Format("Loaded {0} items.", gamedataItems.Count)); return true; } @@ -644,7 +644,7 @@ namespace FFXIVClassic_Map_Server } catch (Exception e) { - Log.Error("Could not load packet: " + e); + Program.Log.Error("Could not load packet: " + e); } } #endregion @@ -660,7 +660,7 @@ namespace FFXIVClassic_Map_Server } catch (Exception e) { - Log.Error("Could not give item."); + Program.Log.Error("Could not give item."); } } #endregion @@ -680,7 +680,7 @@ namespace FFXIVClassic_Map_Server } catch (Exception e) { - Log.Error("Could not give item."); + Program.Log.Error("Could not give item."); } } #endregion @@ -703,7 +703,7 @@ namespace FFXIVClassic_Map_Server } catch (Exception e) { - Log.Error("Could not remove item."); + Program.Log.Error("Could not remove item."); } } #endregion @@ -718,7 +718,7 @@ namespace FFXIVClassic_Map_Server } catch (Exception e) { - Log.Error("Could not give keyitem."); + Program.Log.Error("Could not give keyitem."); } } #endregion @@ -737,7 +737,7 @@ namespace FFXIVClassic_Map_Server } catch (Exception e) { - Log.Error("Could not remove keyitem."); + Program.Log.Error("Could not remove keyitem."); } } #endregion @@ -754,7 +754,7 @@ namespace FFXIVClassic_Map_Server } catch (Exception e) { - Log.Error("Could not give currency."); + Program.Log.Error("Could not give currency."); } } #endregion @@ -775,7 +775,7 @@ namespace FFXIVClassic_Map_Server } catch (Exception e) { - Log.Error("Could not remove currency."); + Program.Log.Error("Could not remove currency."); } } #endregion @@ -793,7 +793,7 @@ namespace FFXIVClassic_Map_Server } catch (Exception e) { - Log.Error("Could not change music: " + e); + Program.Log.Error("Could not change music: " + e); } } #endregion diff --git a/FFXIVClassic Map Server/ConfigConstants.cs b/FFXIVClassic Map Server/ConfigConstants.cs index 39583def..1143c1f6 100644 --- a/FFXIVClassic Map Server/ConfigConstants.cs +++ b/FFXIVClassic Map Server/ConfigConstants.cs @@ -1,4 +1,4 @@ -using STA.Settings; +using FFXIVClassic.Common; using System; using System.IO; @@ -9,8 +9,9 @@ namespace FFXIVClassic_Map_Server public static String OPTIONS_BINDIP; public static String OPTIONS_PORT; public static bool OPTIONS_TIMESTAMP = false; - public static String OPTIONS_LOGPATH; + public static String OPTIONS_LOGPATH; public static String OPTIONS_LOGFILE; + public static String OPTIONS_LOGLEVEL; public static uint DATABASE_WORLDID; public static String DATABASE_HOST; @@ -36,10 +37,11 @@ namespace FFXIVClassic_Map_Server ConfigConstants.OPTIONS_BINDIP = configIni.GetValue("General", "server_ip", "127.0.0.1"); ConfigConstants.OPTIONS_PORT = configIni.GetValue("General", "server_port", "54992"); ConfigConstants.OPTIONS_TIMESTAMP = configIni.GetValue("General", "showtimestamp", "true").ToLower().Equals("true"); - ConfigConstants.OPTIONS_LOGPATH = configIni.GetValue("General", "log_path", "./logs/"); + ConfigConstants.OPTIONS_LOGPATH = configIni.GetValue("General", "log_path", "./logs/"); ConfigConstants.OPTIONS_LOGFILE = configIni.GetValue("General", "log_file_name", String.Format("map_{0}_{1}.log", OPTIONS_BINDIP, OPTIONS_PORT)); + ConfigConstants.OPTIONS_LOGLEVEL = configIni.GetValue("General", "log_level", "127"); - ConfigConstants.DATABASE_WORLDID = configIni.GetValue("Database", "worldid", (uint)0); + ConfigConstants.DATABASE_WORLDID = UInt32.Parse(configIni.GetValue("Database", "worldid", "0")); ConfigConstants.DATABASE_HOST = configIni.GetValue("Database", "host", ""); ConfigConstants.DATABASE_PORT = configIni.GetValue("Database", "port", ""); ConfigConstants.DATABASE_NAME = configIni.GetValue("Database", "database", ""); diff --git a/FFXIVClassic Map Server/Database.cs b/FFXIVClassic Map Server/Database.cs index b8a01d61..d022516c 100644 --- a/FFXIVClassic Map Server/Database.cs +++ b/FFXIVClassic Map Server/Database.cs @@ -3,7 +3,7 @@ using Dapper; using System; using System.Collections.Generic; using System.Linq; -using FFXIVClassic_Map_Server.common; +using FFXIVClassic.Common; using FFXIVClassic_Map_Server.utils; using FFXIVClassic_Map_Server.packets; using FFXIVClassic_Map_Server.packets.send.player; @@ -37,7 +37,7 @@ namespace FFXIVClassic_Map_Server } catch (MySqlException e) { - Log.Error(e.ToString()); + Program.Log.Error(e.ToString()); } finally { @@ -59,7 +59,7 @@ namespace FFXIVClassic_Map_Server } catch (MySqlException e) { - Log.Error(e.ToString()); + Program.Log.Error(e.ToString()); } finally { @@ -82,7 +82,7 @@ namespace FFXIVClassic_Map_Server } catch (MySqlException e) { - Log.Error(e.ToString()); + Program.Log.Error(e.ToString()); } finally { @@ -138,7 +138,7 @@ namespace FFXIVClassic_Map_Server } catch (MySqlException e) { - Log.Error(e.ToString()); + Program.Log.Error(e.ToString()); } finally { @@ -196,7 +196,7 @@ namespace FFXIVClassic_Map_Server } catch (MySqlException e) { - Log.Error(e.ToString()); + Program.Log.Error(e.ToString()); } finally { @@ -232,7 +232,7 @@ namespace FFXIVClassic_Map_Server } catch (MySqlException e) { - Log.Error(e.ToString()); + Program.Log.Error(e.ToString()); } finally { @@ -274,7 +274,7 @@ namespace FFXIVClassic_Map_Server } catch (MySqlException e) { - Log.Error(e.ToString()); + Program.Log.Error(e.ToString()); } finally { @@ -308,7 +308,7 @@ namespace FFXIVClassic_Map_Server } catch (MySqlException e) { - Log.Error(e.ToString()); + Program.Log.Error(e.ToString()); } finally { @@ -322,7 +322,7 @@ namespace FFXIVClassic_Map_Server int slot = player.getQuestSlot(quest.actorId); if (slot == -1) { - Log.Error(String.Format("Tried saving quest player didn't have: Player: {0:x}, QuestId: {0:x}", player.actorId, quest.actorId)); + Program.Log.Error(String.Format("Tried saving quest player didn't have: Player: {0:x}, QuestId: {0:x}", player.actorId, quest.actorId)); return; } else @@ -360,7 +360,7 @@ namespace FFXIVClassic_Map_Server } catch (MySqlException e) { - Log.Error(e.ToString()); + Program.Log.Error(e.ToString()); } finally { @@ -790,7 +790,7 @@ namespace FFXIVClassic_Map_Server } catch (MySqlException e) { - Log.Error(e.ToString()); + Program.Log.Error(e.ToString()); } finally { @@ -834,7 +834,7 @@ namespace FFXIVClassic_Map_Server } catch (MySqlException e) { - Log.Error(e.ToString()); + Program.Log.Error(e.ToString()); } finally { @@ -872,7 +872,7 @@ namespace FFXIVClassic_Map_Server } catch (MySqlException e) { - Log.Error(e.ToString()); + Program.Log.Error(e.ToString()); } finally { @@ -905,7 +905,7 @@ namespace FFXIVClassic_Map_Server } catch (MySqlException e) { - Log.Error(e.ToString()); + Program.Log.Error(e.ToString()); } finally { @@ -976,7 +976,7 @@ namespace FFXIVClassic_Map_Server } catch (MySqlException e) { - Log.Error(e.ToString()); + Program.Log.Error(e.ToString()); } finally { @@ -1032,7 +1032,7 @@ namespace FFXIVClassic_Map_Server } catch (MySqlException e) { - Log.Error(e.ToString()); + Program.Log.Error(e.ToString()); } finally { @@ -1067,7 +1067,7 @@ namespace FFXIVClassic_Map_Server } catch (MySqlException e) { - Log.Error(e.ToString()); + Program.Log.Error(e.ToString()); } finally { @@ -1107,7 +1107,7 @@ namespace FFXIVClassic_Map_Server } catch (MySqlException e) { - Log.Error(e.ToString()); + Program.Log.Error(e.ToString()); } finally { @@ -1148,7 +1148,7 @@ namespace FFXIVClassic_Map_Server } catch (MySqlException e) { - Log.Error(e.ToString()); + Program.Log.Error(e.ToString()); } finally { @@ -1188,7 +1188,7 @@ namespace FFXIVClassic_Map_Server } catch (MySqlException e) { - Log.Error(e.ToString()); + Program.Log.Error(e.ToString()); } finally { @@ -1225,7 +1225,7 @@ namespace FFXIVClassic_Map_Server if (offset < 0 || offset >= cheevosPacket.achievementFlags.Length) { - Log.Error("SQL Error; achievement flag offset id out of range: " + offset); + Program.Log.Error("SQL Error; achievement flag offset id out of range: " + offset); continue; } cheevosPacket.achievementFlags[offset] = true; @@ -1234,7 +1234,7 @@ namespace FFXIVClassic_Map_Server } catch (MySqlException e) { - Log.Error(e.ToString()); + Program.Log.Error(e.ToString()); } finally { diff --git a/FFXIVClassic Map Server/FFXIVClassic Map Server.csproj b/FFXIVClassic Map Server/FFXIVClassic Map Server.csproj index fb1f492e..7fa0490e 100644 --- a/FFXIVClassic Map Server/FFXIVClassic Map Server.csproj +++ b/FFXIVClassic Map Server/FFXIVClassic Map Server.csproj @@ -42,6 +42,10 @@ ..\packages\Dapper.1.42\lib\net45\Dapper.dll True + + False + ..\FFXIVClassic Common Class Lib\bin\Debug\FFXIVClassic.Common.dll + ..\packages\MoonSharp.1.2.1.0\lib\net40-client\MoonSharp.Interpreter.dll @@ -83,12 +87,6 @@ - - - - - - diff --git a/FFXIVClassic Map Server/PacketProcessor.cs b/FFXIVClassic Map Server/PacketProcessor.cs index c3a74735..289bf720 100644 --- a/FFXIVClassic Map Server/PacketProcessor.cs +++ b/FFXIVClassic Map Server/PacketProcessor.cs @@ -1,4 +1,4 @@ -using FFXIVClassic_Map_Server.common; +using FFXIVClassic.Common; using FFXIVClassic_Map_Server.packets; using System; using System.Collections.Generic; @@ -127,9 +127,9 @@ namespace FFXIVClassic_Map_Server player.setConnection(packet.header.connectionType, client); if (packet.header.connectionType == BasePacket.TYPE_ZONE) - Log.Debug(String.Format("Got {0} connection for ActorID {1} @ {2}.", "zone", actorID, client.getAddress())); + Program.Log.Debug(String.Format("Got {0} connection for ActorID {1} @ {2}.", "zone", actorID, client.getAddress())); else if (packet.header.connectionType == BasePacket.TYPE_CHAT) - Log.Debug(String.Format("Got {0} connection for ActorID {1} @ {2}.", "chat", actorID, client.getAddress())); + Program.Log.Debug(String.Format("Got {0} connection for ActorID {1} @ {2}.", "chat", actorID, client.getAddress())); //Create player actor reply1.debugPrintPacket(); @@ -180,7 +180,7 @@ namespace FFXIVClassic_Map_Server //Chat Received case 0x0003: ChatMessagePacket chatMessage = new ChatMessagePacket(subpacket.data); - Log.Info(String.Format("Got type-{5} message: {0} @ {1}, {2}, {3}, Rot: {4}", chatMessage.message, chatMessage.posX, chatMessage.posY, chatMessage.posZ, chatMessage.posRot, chatMessage.logType)); + Program.Log.Info(String.Format("Got type-{5} message: {0} @ {1}, {2}, {3}, Rot: {4}", chatMessage.message, chatMessage.posX, chatMessage.posY, chatMessage.posZ, chatMessage.posRot, chatMessage.logType)); subpacket.debugPrintSubPacket(); if (chatMessage.message.StartsWith("!")) @@ -238,7 +238,7 @@ namespace FFXIVClassic_Map_Server player.errorMessage += eventStart.error; if (eventStart.errorIndex == eventStart.errorNum - 1) - Log.Error("\n"+player.errorMessage); + Program.Log.Error("\n"+player.errorMessage); break; @@ -268,7 +268,7 @@ namespace FFXIVClassic_Map_Server ownerActor = player.getActor().currentDirector; else { - Log.Debug(String.Format("\n===Event START===\nCould not find actor 0x{0:X} for event started by caller: 0x{1:X}\nEvent Starter: {2}\nParams: {3}", eventStart.actorID, eventStart.scriptOwnerActorID, eventStart.triggerName, LuaUtils.dumpParams(eventStart.luaParams))); + Program.Log.Debug(String.Format("\n===Event START===\nCould not find actor 0x{0:X} for event started by caller: 0x{1:X}\nEvent Starter: {2}\nParams: {3}", eventStart.actorID, eventStart.scriptOwnerActorID, eventStart.triggerName, LuaUtils.dumpParams(eventStart.luaParams))); break; } } @@ -276,7 +276,7 @@ namespace FFXIVClassic_Map_Server LuaEngine.doActorOnEventStarted(player.getActor(), ownerActor, eventStart); - Log.Debug(String.Format("\n===Event START===\nSource Actor: 0x{0:X}\nCaller Actor: 0x{1:X}\nVal1: 0x{2:X}\nVal2: 0x{3:X}\nEvent Starter: {4}\nParams: {5}", eventStart.actorID, eventStart.scriptOwnerActorID, eventStart.val1, eventStart.val2, eventStart.triggerName, LuaUtils.dumpParams(eventStart.luaParams))); + Program.Log.Debug(String.Format("\n===Event START===\nSource Actor: 0x{0:X}\nCaller Actor: 0x{1:X}\nVal1: 0x{2:X}\nVal2: 0x{3:X}\nEvent Starter: {4}\nParams: {5}", eventStart.actorID, eventStart.scriptOwnerActorID, eventStart.val1, eventStart.val2, eventStart.triggerName, LuaUtils.dumpParams(eventStart.luaParams))); break; //Unknown, happens at npc spawn and cutscene play???? case 0x00CE: @@ -285,7 +285,7 @@ namespace FFXIVClassic_Map_Server case 0x012E: subpacket.debugPrintSubPacket(); EventUpdatePacket eventUpdate = new EventUpdatePacket(subpacket.data); - Log.Debug(String.Format("\n===Event UPDATE===\nSource Actor: 0x{0:X}\nCaller Actor: 0x{1:X}\nVal1: 0x{2:X}\nVal2: 0x{3:X}\nStep: 0x{4:X}\nParams: {5}", eventUpdate.actorID, eventUpdate.scriptOwnerActorID, eventUpdate.val1, eventUpdate.val2, eventUpdate.step, LuaUtils.dumpParams(eventUpdate.luaParams))); + Program.Log.Debug(String.Format("\n===Event UPDATE===\nSource Actor: 0x{0:X}\nCaller Actor: 0x{1:X}\nVal1: 0x{2:X}\nVal2: 0x{3:X}\nStep: 0x{4:X}\nParams: {5}", eventUpdate.actorID, eventUpdate.scriptOwnerActorID, eventUpdate.val1, eventUpdate.val2, eventUpdate.step, LuaUtils.dumpParams(eventUpdate.luaParams))); //Is it a static actor? If not look in the player's instance Actor updateOwnerActor = Server.getStaticActors(player.getActor().currentEventOwner); @@ -398,7 +398,7 @@ namespace FFXIVClassic_Map_Server //GM Ticket Sent case 0x01D5: GMSupportTicketPacket gmTicket = new GMSupportTicketPacket(subpacket.data); - Log.Info("Got GM Ticket: \n" + gmTicket.ticketTitle + "\n" + gmTicket.ticketBody); + Program.Log.Info("Got GM Ticket: \n" + gmTicket.ticketTitle + "\n" + gmTicket.ticketBody); client.queuePacket(BasePacket.createPacket(GMTicketSentResponsePacket.buildPacket(player.actorID, true), true, false)); break; //Request to end ticket @@ -406,7 +406,7 @@ namespace FFXIVClassic_Map_Server client.queuePacket(BasePacket.createPacket(EndGMTicketPacket.buildPacket(player.actorID), true, false)); break; default: - Log.Debug(String.Format("Unknown command 0x{0:X} received.", subpacket.gameMessage.opcode)); + Program.Log.Debug(String.Format("Unknown command 0x{0:X} received.", subpacket.gameMessage.opcode)); subpacket.debugPrintSubPacket(); break; } diff --git a/FFXIVClassic Map Server/Program.cs b/FFXIVClassic Map Server/Program.cs index 4198a0d5..230ab811 100644 --- a/FFXIVClassic Map Server/Program.cs +++ b/FFXIVClassic Map Server/Program.cs @@ -1,14 +1,17 @@ using System; using System.Diagnostics; +using System.Threading; using MySql.Data.MySqlClient; using System.Reflection; using FFXIVClassic_Map_Server.dataobjects; -using FFXIVClassic_Map_Server.common; +using FFXIVClassic.Common; namespace FFXIVClassic_Map_Server { class Program { + public static Log Log; + static void Main(string[] args) { #if DEBUG @@ -21,14 +24,29 @@ namespace FFXIVClassic_Map_Server if (!ConfigConstants.load()) startServer = false; - Log.Info("---------FFXIV 1.0 Map Server---------"); + Log = new Log(ConfigConstants.OPTIONS_LOGPATH, ConfigConstants.OPTIONS_LOGFILE, Int32.Parse(ConfigConstants.OPTIONS_LOGLEVEL)); + + Thread thread = new Thread(() => + { + while (true) + { + if (Log.LogQueue.Count > 0) + { + var message = Program.Log.LogQueue.Dequeue(); + Program.Log.WriteMessage(message.Item1, message.Item2); + } + } + }); + thread.Start(); + + Program.Log.Info("---------FFXIV 1.0 Map Server---------"); Assembly assem = Assembly.GetExecutingAssembly(); Version vers = assem.GetName().Version; - Log.Info("Version: " + vers.ToString()); + Program.Log.Info("Version: " + vers.ToString()); //Test DB Connection - Log.Info("Testing DB connection... "); + Program.Log.Info("Testing DB connection... "); using (MySqlConnection conn = new MySqlConnection(String.Format("Server={0}; Port={1}; Database={2}; UID={3}; Password={4}", ConfigConstants.DATABASE_HOST, ConfigConstants.DATABASE_PORT, ConfigConstants.DATABASE_NAME, ConfigConstants.DATABASE_USERNAME, ConfigConstants.DATABASE_PASSWORD))) { try @@ -36,11 +54,11 @@ namespace FFXIVClassic_Map_Server conn.Open(); conn.Close(); - Log.Status("[OK]"); + Program.Log.Status("[OK]"); } catch (MySqlException e) { - Log.Error(e.ToString()); + Program.Log.Error(e.ToString()); startServer = false; } } @@ -48,9 +66,9 @@ namespace FFXIVClassic_Map_Server //Check World ID DBWorld thisWorld = Database.getServer(ConfigConstants.DATABASE_WORLDID); if (thisWorld != null) - Log.Info(String.Format("Successfully pulled world info from DB. Server name is {0}.", thisWorld.name)); + Program.Log.Info(String.Format("Successfully pulled world info from DB. Server name is {0}.", thisWorld.name)); else - Log.Info("World info could not be retrieved from the DB. Welcome and MOTD will not be displayed."); + Program.Log.Info("World info could not be retrieved from the DB. Welcome and MOTD will not be displayed."); //Start server if A-OK if (startServer) @@ -66,7 +84,7 @@ namespace FFXIVClassic_Map_Server } } - Log.Info("Press any key to continue..."); + Program.Log.Info("Press any key to continue..."); Console.ReadKey(); } diff --git a/FFXIVClassic Map Server/Server.cs b/FFXIVClassic Map Server/Server.cs index 15d64ec4..597de32b 100644 --- a/FFXIVClassic Map Server/Server.cs +++ b/FFXIVClassic Map Server/Server.cs @@ -5,7 +5,7 @@ using System.Net.Sockets; using System.Threading; using FFXIVClassic_Map_Server.dataobjects; using FFXIVClassic_Map_Server.packets; -using FFXIVClassic_Map_Server.common; +using FFXIVClassic.Common; using FFXIVClassic_Map_Server.Actors; using FFXIVClassic_Map_Server.lua; @@ -39,7 +39,7 @@ namespace FFXIVClassic_Map_Server private void connectionHealth() { - Log.Info(String.Format("Connection Health thread started; it will run every {0} seconds.", HEALTH_THREAD_SLEEP_TIME)); + Program.Log.Info(String.Format("Connection Health thread started; it will run every {0} seconds.", HEALTH_THREAD_SLEEP_TIME)); while (!killHealthThread) { lock (mConnectedPlayerList) @@ -77,7 +77,7 @@ namespace FFXIVClassic_Map_Server mStaticActors = new StaticActors(STATIC_ACTORS_PATH); gamedataItems = Database.getItemGamedata(); - Log.Info(String.Format("Loaded {0} items.", gamedataItems.Count)); + Program.Log.Info(String.Format("Loaded {0} items.", gamedataItems.Count)); mWorldManager = new WorldManager(this); mWorldManager.LoadZoneList(); @@ -113,7 +113,7 @@ namespace FFXIVClassic_Map_Server } Console.ForegroundColor = ConsoleColor.White; - Log.Debug(String.Format("Map Server has started @ {0}:{1}", (mServerSocket.LocalEndPoint as IPEndPoint).Address, (mServerSocket.LocalEndPoint as IPEndPoint).Port)); + Program.Log.Debug(String.Format("Map Server has started @ {0}:{1}", (mServerSocket.LocalEndPoint as IPEndPoint).Address, (mServerSocket.LocalEndPoint as IPEndPoint).Port)); Console.ForegroundColor = ConsoleColor.Gray; mProcessor = new PacketProcessor(this, mConnectedPlayerList, mConnectionList); @@ -150,7 +150,7 @@ namespace FFXIVClassic_Map_Server mConnectionList.Add(conn); } - Log.Status(String.Format("Connection {0}:{1} has connected.", (conn.socket.RemoteEndPoint as IPEndPoint).Address, (conn.socket.RemoteEndPoint as IPEndPoint).Port)); + Program.Log.Status(String.Format("Connection {0}:{1} has connected.", (conn.socket.RemoteEndPoint as IPEndPoint).Address, (conn.socket.RemoteEndPoint as IPEndPoint).Port)); //Queue recieving of data from the connection conn.socket.BeginReceive(conn.buffer, 0, conn.buffer.Length, SocketFlags.None, new AsyncCallback(receiveCallback), conn); //Queue the accept of the next incomming connection @@ -217,7 +217,7 @@ namespace FFXIVClassic_Map_Server mConnectionList.Remove(conn); } if (conn.connType == BasePacket.TYPE_ZONE) - Log.Status(String.Format("{0} has disconnected.", conn.owner == 0 ? conn.getAddress() : "User " + conn.owner)); + Program.Log.Status(String.Format("{0} has disconnected.", conn.owner == 0 ? conn.getAddress() : "User " + conn.owner)); return; } @@ -261,7 +261,7 @@ namespace FFXIVClassic_Map_Server } else { - Log.Status(String.Format("{0} has disconnected.", conn.owner == 0 ? conn.getAddress() : "User " + conn.owner)); + Program.Log.Status(String.Format("{0} has disconnected.", conn.owner == 0 ? conn.getAddress() : "User " + conn.owner)); lock (mConnectionList) { @@ -273,7 +273,7 @@ namespace FFXIVClassic_Map_Server { if (conn.socket != null) { - Log.Status(String.Format("{0} has disconnected.", conn.owner == 0 ? conn.getAddress() : "User " + conn.owner)); + Program.Log.Status(String.Format("{0} has disconnected.", conn.owner == 0 ? conn.getAddress() : "User " + conn.owner)); lock (mConnectionList) { diff --git a/FFXIVClassic Map Server/WorldManager.cs b/FFXIVClassic Map Server/WorldManager.cs index b6923ffc..14a72928 100644 --- a/FFXIVClassic Map Server/WorldManager.cs +++ b/FFXIVClassic Map Server/WorldManager.cs @@ -1,4 +1,4 @@ -using FFXIVClassic_Map_Server.common; +using FFXIVClassic.Common; using FFXIVClassic_Map_Server.actors.area; using FFXIVClassic_Map_Server.Actors; using FFXIVClassic_Map_Server.lua; @@ -67,7 +67,7 @@ namespace FFXIVClassic_Map_Server } catch (MySqlException e) { - Log.Error(e.ToString()); + Program.Log.Error(e.ToString()); } finally @@ -117,7 +117,7 @@ namespace FFXIVClassic_Map_Server } catch (MySqlException e) { - Log.Error(e.ToString()); + Program.Log.Error(e.ToString()); } finally { @@ -125,7 +125,7 @@ namespace FFXIVClassic_Map_Server } } - Log.Info(String.Format("Loaded {0} zones and {1} private areas.", count1, count2)); + Program.Log.Info(String.Format("Loaded {0} zones and {1} private areas.", count1, count2)); } public void LoadZoneEntranceList() @@ -170,7 +170,7 @@ namespace FFXIVClassic_Map_Server } catch (MySqlException e) { - Log.Error(e.ToString()); + Program.Log.Error(e.ToString()); } finally { @@ -178,7 +178,7 @@ namespace FFXIVClassic_Map_Server } } - Log.Info(String.Format("Loaded {0} zone spawn locations.", count)); + Program.Log.Info(String.Format("Loaded {0} zone spawn locations.", count)); } public void LoadNPCs() @@ -242,7 +242,7 @@ namespace FFXIVClassic_Map_Server } catch (MySqlException e) { - Log.Error(e.ToString()); + Program.Log.Error(e.ToString()); } finally { @@ -250,7 +250,7 @@ namespace FFXIVClassic_Map_Server } } - Log.Info(String.Format("Loaded {0} npc(s).", count)); + Program.Log.Info(String.Format("Loaded {0} npc(s).", count)); } public void LoadNPCs(uint zoneId) @@ -315,7 +315,7 @@ namespace FFXIVClassic_Map_Server } catch (MySqlException e) { - Log.Error(e.ToString()); + Program.Log.Error(e.ToString()); } finally { @@ -323,7 +323,7 @@ namespace FFXIVClassic_Map_Server } } - Log.Info(String.Format("Loaded {0} npc(s).", count)); + Program.Log.Info(String.Format("Loaded {0} npc(s).", count)); } //Moves the actor to the new zone if exists. No packets are sent nor position changed. @@ -354,7 +354,7 @@ namespace FFXIVClassic_Map_Server { if (!zoneEntranceList.ContainsKey(zoneEntrance)) { - Log.Error("Given zone entrance was not found: " + zoneEntrance); + Program.Log.Error("Given zone entrance was not found: " + zoneEntrance); return; } @@ -410,7 +410,7 @@ namespace FFXIVClassic_Map_Server { if (!zoneEntranceList.ContainsKey(zoneEntrance)) { - Log.Error("Given zone entrance was not found: " + zoneEntrance); + Program.Log.Error("Given zone entrance was not found: " + zoneEntrance); return; } diff --git a/FFXIVClassic Map Server/actors/StaticActors.cs b/FFXIVClassic Map Server/actors/StaticActors.cs index c2393c3f..4a6e989c 100644 --- a/FFXIVClassic Map Server/actors/StaticActors.cs +++ b/FFXIVClassic Map Server/actors/StaticActors.cs @@ -1,4 +1,4 @@ -using FFXIVClassic_Map_Server.common; +using FFXIVClassic.Common; using System; using System.Collections.Generic; using System.IO; @@ -89,9 +89,9 @@ namespace FFXIVClassic_Map_Server.Actors } } catch(FileNotFoundException e) - { Log.Error("Could not find staticactors file."); return false; } + { Program.Log.Error("Could not find staticactors file."); return false; } - Log.Info(String.Format("Loaded {0} static actors.", mStaticActors.Count())); + Program.Log.Info(String.Format("Loaded {0} static actors.", mStaticActors.Count())); return true; } diff --git a/FFXIVClassic Map Server/actors/chara/npc/Npc.cs b/FFXIVClassic Map Server/actors/chara/npc/Npc.cs index 5c417c46..c8297e2f 100644 --- a/FFXIVClassic Map Server/actors/chara/npc/Npc.cs +++ b/FFXIVClassic Map Server/actors/chara/npc/Npc.cs @@ -1,4 +1,4 @@ -using FFXIVClassic_Map_Server.common; +using FFXIVClassic.Common; using FFXIVClassic_Map_Server.packets; using FFXIVClassic_Map_Server.actors; using FFXIVClassic_Map_Server.Actors.Chara; @@ -238,7 +238,7 @@ namespace FFXIVClassic_Map_Server.Actors } catch (MySqlException e) { - Log.Error(e.ToString()); + Program.Log.Error(e.ToString()); } finally { diff --git a/FFXIVClassic Map Server/actors/chara/player/Player.cs b/FFXIVClassic Map Server/actors/chara/player/Player.cs index 472745bf..ed8052d3 100644 --- a/FFXIVClassic Map Server/actors/chara/player/Player.cs +++ b/FFXIVClassic Map Server/actors/chara/player/Player.cs @@ -1,4 +1,4 @@ -using FFXIVClassic_Map_Server.common; +using FFXIVClassic.Common; using FFXIVClassic_Map_Server.packets; using FFXIVClassic_Map_Server.actors.chara.player; using FFXIVClassic_Map_Server.actors.director; @@ -642,7 +642,7 @@ namespace FFXIVClassic_Map_Server.Actors Database.savePlayerPlayTime(this); Database.savePlayerPosition(this); - Log.Info(String.Format("{0} has been logged out and saved.", this.customDisplayName)); + Program.Log.Info(String.Format("{0} has been logged out and saved.", this.customDisplayName)); } public Area getZone() diff --git a/FFXIVClassic Map Server/actors/quest/Quest.cs b/FFXIVClassic Map Server/actors/quest/Quest.cs index cd889312..26db6638 100644 --- a/FFXIVClassic Map Server/actors/quest/Quest.cs +++ b/FFXIVClassic Map Server/actors/quest/Quest.cs @@ -1,4 +1,4 @@ -using FFXIVClassic_Map_Server.common; +using FFXIVClassic.Common; using Newtonsoft.Json; using System; using System.Collections.Generic; @@ -68,7 +68,7 @@ namespace FFXIVClassic_Map_Server.Actors { if (bitIndex >= 32) { - Log.Error(String.Format("Tried to access bit flag >= 32 for questId: {0}", actorId)); + Program.Log.Error(String.Format("Tried to access bit flag >= 32 for questId: {0}", actorId)); return; } @@ -86,7 +86,7 @@ namespace FFXIVClassic_Map_Server.Actors { if (bitIndex >= 32) { - Log.Error(String.Format("Tried to access bit flag >= 32 for questId: {0}", actorId)); + Program.Log.Error(String.Format("Tried to access bit flag >= 32 for questId: {0}", actorId)); return false; } else diff --git a/FFXIVClassic Map Server/common/Bitfield.cs b/FFXIVClassic Map Server/common/Bitfield.cs deleted file mode 100644 index 61e56c5c..00000000 --- a/FFXIVClassic Map Server/common/Bitfield.cs +++ /dev/null @@ -1,74 +0,0 @@ -using System; - -namespace FFXIVClassic_Map_Server.common -{ - [global::System.AttributeUsage(AttributeTargets.Field, AllowMultiple = false)] - sealed class BitfieldLengthAttribute : Attribute - { - uint length; - - public BitfieldLengthAttribute(uint length) - { - this.length = length; - } - - public uint Length { get { return length; } } - } - - static class PrimitiveConversion - { - public static UInt32 ToUInt32(T t) where T : struct - { - UInt32 r = 0; - int offset = 0; - - // For every field suitably attributed with a BitfieldLength - foreach (System.Reflection.FieldInfo f in t.GetType().GetFields()) - { - object[] attrs = f.GetCustomAttributes(typeof(BitfieldLengthAttribute), false); - if (attrs.Length == 1) - { - uint fieldLength = ((BitfieldLengthAttribute)attrs[0]).Length; - - // Calculate a bitmask of the desired length - uint mask = 0; - for (int i = 0; i < fieldLength; i++) - mask |= (UInt32)1 << i; - - r |= ((UInt32)f.GetValue(t) & mask) << offset; - - offset += (int)fieldLength; - } - } - - return r; - } - - public static long ToLong(T t) where T : struct - { - long r = 0; - int offset = 0; - - // For every field suitably attributed with a BitfieldLength - foreach (System.Reflection.FieldInfo f in t.GetType().GetFields()) - { - object[] attrs = f.GetCustomAttributes(typeof(BitfieldLengthAttribute), false); - if (attrs.Length == 1) - { - uint fieldLength = ((BitfieldLengthAttribute)attrs[0]).Length; - - // Calculate a bitmask of the desired length - long mask = 0; - for (int i = 0; i < fieldLength; i++) - mask |= 1 << i; - - r |= ((UInt32)f.GetValue(t) & mask) << offset; - - offset += (int)fieldLength; - } - } - - return r; - } - } -} \ No newline at end of file diff --git a/FFXIVClassic Map Server/common/Log.cs b/FFXIVClassic Map Server/common/Log.cs deleted file mode 100644 index dffaf372..00000000 --- a/FFXIVClassic Map Server/common/Log.cs +++ /dev/null @@ -1,72 +0,0 @@ -using System; -using System.IO; -using System.Text; - -namespace FFXIVClassic_Map_Server.common -{ - class Log - { - public enum LogType - { - Status = ConsoleColor.Green, - Sql = ConsoleColor.Magenta, - Info = ConsoleColor.White, - Debug = ConsoleColor.Cyan, - Error = ConsoleColor.Red - } - - public static void Status(String message) - { - LogFile(message, LogType.Status); - } - - public static void Sql(String message) - { - LogFile(message, LogType.Sql); - } - - public static void Info(String message) - { - LogFile(message, LogType.Info); - } - - public static void Debug(String message) - { -#if DEBUG - LogFile(message, LogType.Debug); -#endif - } - - public static void Error(String message) - { - LogFile(message, LogType.Error); - } - - private static void LogFile(String message, LogType type) - { - string timestamp = String.Format("[{0}]", DateTime.Now.ToString("MM/dd/yyyy HH:mm:ss")); - string messageType = String.Format("[{0}] ", type.ToString().ToUpper()); - - Console.Write(timestamp); - Console.ForegroundColor = (ConsoleColor)type; - Console.Write(messageType); - Console.ForegroundColor = ConsoleColor.Gray; - Console.WriteLine(message); - - StringBuilder sb = new StringBuilder(); - - sb.AppendLine(String.Format("{0}{1}{2}", timestamp, messageType, message)); - - if (!Directory.Exists(ConfigConstants.OPTIONS_LOGPATH)) - { - Directory.CreateDirectory(ConfigConstants.OPTIONS_LOGPATH); - } - - using (FileStream fs = new FileStream(Path.Combine(ConfigConstants.OPTIONS_LOGPATH, ConfigConstants.OPTIONS_LOGFILE), FileMode.Append, FileAccess.Write)) - using (StreamWriter sw = new StreamWriter(fs)) - { - sw.WriteLine(sb.ToString()); - } - } - } -} \ No newline at end of file diff --git a/FFXIVClassic Map Server/common/Utils.cs b/FFXIVClassic Map Server/common/Utils.cs deleted file mode 100644 index 8fc58dbb..00000000 --- a/FFXIVClassic Map Server/common/Utils.cs +++ /dev/null @@ -1,346 +0,0 @@ -using System; -using System.IO; -using System.Text; - -namespace FFXIVClassic_Map_Server.common -{ - static class Utils - { - private static readonly uint[] _lookup32 = CreateLookup32(); - - private static uint[] CreateLookup32() - { - var result = new uint[256]; - for (int i = 0; i < 256; i++) - { - string s = i.ToString("X2"); - result[i] = ((uint)s[0]) + ((uint)s[1] << 16); - } - return result; - } - - public static string ByteArrayToHex(byte[] bytes, int offset = 0, int bytesPerLine = 16) - { - if (bytes == null) - { - return String.Empty; - } - - char[] hexChars = "0123456789ABCDEF".ToCharArray(); - - // 00000000 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ - // 00000010 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ - int offsetBlock = 8 + 3; - 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(); - int numLines = (bytes.Length + bytesPerLine - 1) / bytesPerLine; - - StringBuilder sb = new StringBuilder(numLines * lineLength); - - for (int i = 0; i < bytes.Length; i += bytesPerLine) - { - int h = i + offset; - - line[0] = hexChars[(h >> 28) & 0xF]; - line[1] = hexChars[(h >> 24) & 0xF]; - line[2] = hexChars[(h >> 20) & 0xF]; - line[3] = hexChars[(h >> 16) & 0xF]; - line[4] = hexChars[(h >> 12) & 0xF]; - line[5] = hexChars[(h >> 8) & 0xF]; - line[6] = hexChars[(h >> 4) & 0xF]; - line[7] = hexChars[(h >> 0) & 0xF]; - - int hexColumn = offsetBlock; - int charColumn = byteBlock; - - for (int j = 0; j < bytesPerLine; j++) - { - if (j > 0 && (j & 7) == 0) - { - hexColumn++; - } - - if (i + j >= bytes.Length) - { - line[hexColumn] = ' '; - line[hexColumn + 1] = ' '; - line[charColumn] = ' '; - } - else - { - byte by = bytes[i + j]; - line[hexColumn] = hexChars[(by >> 4) & 0xF]; - line[hexColumn + 1] = hexChars[by & 0xF]; - line[charColumn] = (by < 32 ? '.' : (char)by); - } - - hexColumn += 3; - charColumn++; - } - - sb.Append(line); - } - - return sb.ToString(); - } - - public static UInt32 UnixTimeStampUTC() - { - UInt32 unixTimeStamp; - DateTime currentTime = DateTime.Now; - DateTime zuluTime = currentTime.ToUniversalTime(); - DateTime unixEpoch = new DateTime(1970, 1, 1); - unixTimeStamp = (UInt32)(zuluTime.Subtract(unixEpoch)).TotalSeconds; - - return unixTimeStamp; - } - - public static UInt64 MilisUnixTimeStampUTC() - { - UInt64 unixTimeStamp; - DateTime currentTime = DateTime.Now; - DateTime zuluTime = currentTime.ToUniversalTime(); - DateTime unixEpoch = new DateTime(1970, 1, 1); - unixTimeStamp = (UInt64)(zuluTime.Subtract(unixEpoch)).TotalMilliseconds; - - return unixTimeStamp; - } - - public static ulong swapEndian(ulong input) - { - return ((0x00000000000000FF) & (input >> 56) | - (0x000000000000FF00) & (input >> 40) | - (0x0000000000FF0000) & (input >> 24) | - (0x00000000FF000000) & (input >> 8) | - (0x000000FF00000000) & (input << 8) | - (0x0000FF0000000000) & (input << 24) | - (0x00FF000000000000) & (input << 40) | - (0xFF00000000000000) & (input << 56)); - } - - public static uint swapEndian(uint input) - { - return ((input >> 24) & 0xff) | - ((input << 8) & 0xff0000) | - ((input >> 8) & 0xff00) | - ((input << 24) & 0xff000000); - } - - public static int swapEndian(int input) - { - uint inputAsUint = (uint)input; - - input = (int) - (((inputAsUint >> 24) & 0xff) | - ((inputAsUint << 8) & 0xff0000) | - ((inputAsUint >> 8) & 0xff00) | - ((inputAsUint << 24) & 0xff000000)); - - return input; - } - - public static uint MurmurHash2(string key, uint seed) - { - // 'm' and 'r' are mixing constants generated offline. - // They're not really 'magic', they just happen to work well. - - byte[] data = Encoding.ASCII.GetBytes(key); - const uint m = 0x5bd1e995; - const int r = 24; - int len = key.Length; - int dataIndex = len - 4; - - // Initialize the hash to a 'random' value - - uint h = seed ^ (uint)len; - - // Mix 4 bytes at a time into the hash - - - while (len >= 4) - { - h *= m; - - uint 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 - ((k << 24) & 0xff000000); // byte 0 to byte 3 - - k *= m; - k ^= k >> r; - k *= m; - - h ^= k; - - dataIndex -= 4; - len -= 4; - } - - // Handle the last few bytes of the input array - switch (len) - { - case 3: - h ^= (uint)data[0] << 16; goto case 2; - case 2: - h ^= (uint)data[len - 2] << 8; goto case 1; - case 1: - h ^= data[len - 1]; - h *= m; - break; - }; - - // Do a few final mixes of the hash to ensure the last few - // bytes are well-incorporated. - - h ^= h >> 13; - h *= m; - h ^= h >> 15; - - return h; - } - - public static byte[] ConvertBoolArrayToBinaryStream(bool[] array) - { - byte[] data = new byte[(array.Length / 8) + (array.Length % 8 != 0 ? 1 : 0)]; - - int dataCounter = 0; - for (int i = 0; i < array.Length; i += 8) - { - for (int bitCount = 0; bitCount < 8; bitCount++) - { - if (i + bitCount >= array.Length) - break; - data[dataCounter] = (byte)(((array[i + bitCount] ? 1 : 0) << 7 - bitCount) | data[dataCounter]); - } - dataCounter++; - } - - return data; - } - - 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; - - Log.Debug(result); - } - } - - 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)); - } - - } -} diff --git a/FFXIVClassic Map Server/dataobjects/ConnectedPlayer.cs b/FFXIVClassic Map Server/dataobjects/ConnectedPlayer.cs index 70d14b39..a3438b22 100644 --- a/FFXIVClassic Map Server/dataobjects/ConnectedPlayer.cs +++ b/FFXIVClassic Map Server/dataobjects/ConnectedPlayer.cs @@ -1,4 +1,4 @@ -using FFXIVClassic_Map_Server.common; +using FFXIVClassic.Common; using FFXIVClassic_Map_Server.packets; using FFXIVClassic_Map_Server.Actors; using FFXIVClassic_Map_Server.lua; diff --git a/FFXIVClassic Map Server/lua/LuaEngine.cs b/FFXIVClassic Map Server/lua/LuaEngine.cs index 1092abac..81a26540 100644 --- a/FFXIVClassic Map Server/lua/LuaEngine.cs +++ b/FFXIVClassic Map Server/lua/LuaEngine.cs @@ -1,4 +1,4 @@ -using FFXIVClassic_Map_Server.common; +using FFXIVClassic.Common; using FFXIVClassic_Map_Server.packets; using FFXIVClassic_Map_Server.actors.director; using FFXIVClassic_Map_Server.Actors; @@ -217,7 +217,7 @@ namespace FFXIVClassic_Map_Server.lua } catch(SyntaxErrorException e) { - Log.Error(String.Format("LUAERROR: {0}.", e.DecoratedMessage)); + Program.Log.Error(String.Format("LUAERROR: {0}.", e.DecoratedMessage)); return null; } return script; diff --git a/FFXIVClassic Map Server/lua/LuaUtils.cs b/FFXIVClassic Map Server/lua/LuaUtils.cs index ec253535..341f69be 100644 --- a/FFXIVClassic Map Server/lua/LuaUtils.cs +++ b/FFXIVClassic Map Server/lua/LuaUtils.cs @@ -1,4 +1,4 @@ -using FFXIVClassic_Map_Server.common; +using FFXIVClassic.Common; using FFXIVClassic_Map_Server.Actors; using FFXIVClassic_Map_Server.lua; using MoonSharp.Interpreter; diff --git a/FFXIVClassic Map Server/packets/BasePacket.cs b/FFXIVClassic Map Server/packets/BasePacket.cs index 9897d2a7..4c25c9f2 100644 --- a/FFXIVClassic Map Server/packets/BasePacket.cs +++ b/FFXIVClassic Map Server/packets/BasePacket.cs @@ -2,8 +2,8 @@ using System.Collections.Generic; using System.Runtime.InteropServices; using System.Diagnostics; -using FFXIVClassic_Map_Server.common; using System.IO; +using FFXIVClassic.Common; namespace FFXIVClassic_Map_Server.packets { @@ -334,7 +334,7 @@ namespace FFXIVClassic_Map_Server.packets #if DEBUG Console.BackgroundColor = ConsoleColor.DarkYellow; - Log.Debug(String.Format("IsAuth: {0} IsEncrypted: {1}, Size: 0x{2:X}, NumSubpackets: {3}{4}{5}", header.isAuthenticated, header.isCompressed, header.packetSize, header.numSubpackets, Environment.NewLine, Utils.ByteArrayToHex(getHeaderBytes()))); + Program.Log.Debug(String.Format("IsAuth: {0} IsEncrypted: {1}, Size: 0x{2:X}, NumSubpackets: {3}{4}{5}", header.isAuthenticated, header.isCompressed, header.packetSize, header.numSubpackets, Environment.NewLine, Utils.ByteArrayToHex(getHeaderBytes()))); foreach (SubPacket sub in getSubpackets()) { diff --git a/FFXIVClassic Map Server/packets/SubPacket.cs b/FFXIVClassic Map Server/packets/SubPacket.cs index 0fba8242..2e4530e1 100644 --- a/FFXIVClassic Map Server/packets/SubPacket.cs +++ b/FFXIVClassic Map Server/packets/SubPacket.cs @@ -1,6 +1,6 @@ using System; using System.Runtime.InteropServices; -using FFXIVClassic_Map_Server.common; +using FFXIVClassic.Common; namespace FFXIVClassic_Map_Server.packets { @@ -142,15 +142,15 @@ namespace FFXIVClassic_Map_Server.packets #if DEBUG Console.BackgroundColor = ConsoleColor.DarkRed; - Log.Debug(String.Format("Size: 0x{0:X}{1}{2}", header.subpacketSize, Environment.NewLine, Utils.ByteArrayToHex(getHeaderBytes()))); + Program.Log.Debug(String.Format("Size: 0x{0:X}{1}{2}", header.subpacketSize, Environment.NewLine, Utils.ByteArrayToHex(getHeaderBytes()))); if (header.type == 0x03) { - Log.Debug(String.Format("Opcode: 0x{0:X}{1}{2}", gameMessage.opcode, Environment.NewLine, Utils.ByteArrayToHex(getGameMessageBytes(), SUBPACKET_SIZE))); + Program.Log.Debug(String.Format("Opcode: 0x{0:X}{1}{2}", gameMessage.opcode, Environment.NewLine, Utils.ByteArrayToHex(getGameMessageBytes(), SUBPACKET_SIZE))); Console.BackgroundColor = ConsoleColor.DarkMagenta; - Log.Debug(String.Format("Data: {0}{1}", Environment.NewLine, Utils.ByteArrayToHex(data, SUBPACKET_SIZE + GAMEMESSAGE_SIZE))); + Program.Log.Debug(String.Format("Data: {0}{1}", Environment.NewLine, Utils.ByteArrayToHex(data, SUBPACKET_SIZE + GAMEMESSAGE_SIZE))); } Console.BackgroundColor = ConsoleColor.Black; diff --git a/FFXIVClassic Map Server/packets/receive/events/EventStartPacket.cs b/FFXIVClassic Map Server/packets/receive/events/EventStartPacket.cs index a9c8c042..a7e14a2a 100644 --- a/FFXIVClassic Map Server/packets/receive/events/EventStartPacket.cs +++ b/FFXIVClassic Map Server/packets/receive/events/EventStartPacket.cs @@ -48,7 +48,7 @@ namespace FFXIVClassic_Map_Server.packets.receive.events error = ASCIIEncoding.ASCII.GetString(binReader.ReadBytes(0x80)).Replace("\0", ""); if (errorIndex == 0) - Log.Error("LUA ERROR:"); + Program.Log.Error("LUA ERROR:"); return; } diff --git a/FFXIVClassic Map Server/packets/send/Actor/SetActorPropetyPacket.cs b/FFXIVClassic Map Server/packets/send/Actor/SetActorPropetyPacket.cs index bfa3d3f6..62d53728 100644 --- a/FFXIVClassic Map Server/packets/send/Actor/SetActorPropetyPacket.cs +++ b/FFXIVClassic Map Server/packets/send/Actor/SetActorPropetyPacket.cs @@ -1,4 +1,4 @@ -using FFXIVClassic_Map_Server.common; +using FFXIVClassic.Common; using System; using System.IO; using System.Linq; diff --git a/FFXIVClassic Map Server/packets/send/list/SetListPropertyPacket.cs b/FFXIVClassic Map Server/packets/send/list/SetListPropertyPacket.cs index fcfadc63..896225fc 100644 --- a/FFXIVClassic Map Server/packets/send/list/SetListPropertyPacket.cs +++ b/FFXIVClassic Map Server/packets/send/list/SetListPropertyPacket.cs @@ -1,4 +1,4 @@ -using FFXIVClassic_Map_Server.common; +using FFXIVClassic.Common; using System; using System.IO; using System.Linq; diff --git a/FFXIVClassic Map Server/packets/send/player/SetCompletedAchievementsPacket.cs b/FFXIVClassic Map Server/packets/send/player/SetCompletedAchievementsPacket.cs index 824a067d..7a97fd27 100644 --- a/FFXIVClassic Map Server/packets/send/player/SetCompletedAchievementsPacket.cs +++ b/FFXIVClassic Map Server/packets/send/player/SetCompletedAchievementsPacket.cs @@ -1,4 +1,4 @@ -using FFXIVClassic_Map_Server.common; +using FFXIVClassic.Common; using System.IO; namespace FFXIVClassic_Map_Server.packets.send.player @@ -36,7 +36,7 @@ namespace FFXIVClassic_Map_Server.packets.send.player if (binStream.Length <= PACKET_SIZE - 0x20) binWriter.Write(binStream); else - Log.Error("Failed making SetCompletedAchievements packet. Bin Stream was too big!"); + Program.Log.Error("Failed making SetCompletedAchievements packet. Bin Stream was too big!"); } } diff --git a/FFXIVClassic Map Server/packets/send/player/SetCutsceneBookPacket.cs b/FFXIVClassic Map Server/packets/send/player/SetCutsceneBookPacket.cs index f7afa871..fe45db0f 100644 --- a/FFXIVClassic Map Server/packets/send/player/SetCutsceneBookPacket.cs +++ b/FFXIVClassic Map Server/packets/send/player/SetCutsceneBookPacket.cs @@ -1,4 +1,4 @@ -using FFXIVClassic_Map_Server.common; +using FFXIVClassic.Common; using System; using System.IO; using System.Text; @@ -81,7 +81,7 @@ namespace FFXIVClassic_Map_Server.packets.send.player if (binStream.Length <= PACKET_SIZE - 0x20) binWriter.Write(binStream); else - Log.Error("Failed making SetCutsceneBook packet. Bin Stream was too big!"); + Program.Log.Error("Failed making SetCutsceneBook packet. Bin Stream was too big!"); binWriter.Seek(0x109, SeekOrigin.Begin); binWriter.Write(Encoding.ASCII.GetBytes(sNpcName), 0, Encoding.ASCII.GetByteCount(sNpcName) >= 0x20 ? 0x20 : Encoding.ASCII.GetByteCount(sNpcName)); diff --git a/FFXIVClassic Map Server/utils/CharacterUtils.cs b/FFXIVClassic Map Server/utils/CharacterUtils.cs index 54c8551d..64b2306d 100644 --- a/FFXIVClassic Map Server/utils/CharacterUtils.cs +++ b/FFXIVClassic Map Server/utils/CharacterUtils.cs @@ -1,4 +1,4 @@ -using FFXIVClassic_Map_Server.common; +using FFXIVClassic.Common; using System; namespace FFXIVClassic_Map_Server.utils diff --git a/FFXIVClassic Map Server/utils/SQLGeneration.cs b/FFXIVClassic Map Server/utils/SQLGeneration.cs index 8acb47a9..d216d858 100644 --- a/FFXIVClassic Map Server/utils/SQLGeneration.cs +++ b/FFXIVClassic Map Server/utils/SQLGeneration.cs @@ -1,4 +1,4 @@ -using FFXIVClassic_Map_Server.common; +using FFXIVClassic.Common; using FFXIVClassic_Map_Server.packets.send.player; using MySql.Data.MySqlClient; using System; @@ -79,14 +79,14 @@ namespace FFXIVClassic_Map_Server.utils cmd.Parameters["@placename"].Value = placenames[pId]; - Log.Debug(String.Format("Wrote: {0}", id)); + Program.Log.Debug(String.Format("Wrote: {0}", id)); cmd.ExecuteNonQuery(); } } catch (MySqlException e) { - Log.Error(e.ToString()); + Program.Log.Error(e.ToString()); } finally { @@ -137,14 +137,14 @@ namespace FFXIVClassic_Map_Server.utils cmd.Parameters["@id"].Value = id; cmd.Parameters["@displayNameId"].Value = nameId; - Log.Debug(String.Format("Wrote: {0} : {1}", id, nameId)); + Program.Log.Debug(String.Format("Wrote: {0} : {1}", id, nameId)); cmd.ExecuteNonQuery(); } } catch (MySqlException e) { - Log.Error(e.ToString()); + Program.Log.Error(e.ToString()); } finally { @@ -203,14 +203,14 @@ namespace FFXIVClassic_Map_Server.utils cmd.Parameters["@id"].Value = id; - Log.Debug(String.Format("Wrote: {0}", id)); + Program.Log.Debug(String.Format("Wrote: {0}", id)); cmd.ExecuteNonQuery(); } } catch (MySqlException e) { - Log.Error(e.ToString()); + Program.Log.Error(e.ToString()); } finally { @@ -288,7 +288,7 @@ namespace FFXIVClassic_Map_Server.utils else if (id == 1500) otherId = SetCompletedAchievementsPacket.CATEGORY_GRAND_COMPANY; - Log.Debug(String.Format("Wrote: {0} : {1} : {2} : {3}", id, name, otherId, points)); + Program.Log.Debug(String.Format("Wrote: {0} : {1} : {2} : {3}", id, name, otherId, points)); cmd.Parameters["@id"].Value = id; cmd.Parameters["@name"].Value = name; cmd.Parameters["@otherId"].Value = otherId; @@ -300,7 +300,7 @@ namespace FFXIVClassic_Map_Server.utils } catch (MySqlException e) { - Log.Error(e.ToString()); + Program.Log.Error(e.ToString()); } finally { @@ -338,7 +338,7 @@ namespace FFXIVClassic_Map_Server.utils string output2 = String.Format("mStaticActors.Add(0x{0:x}, new {2}(0x{0:x}, \"{1}\"));", id, output.Substring(1 + output.LastIndexOf("/")), output.Split('/')[1]); - Log.Debug(output2); + Program.Log.Debug(output2); w.WriteLine(output2); } diff --git a/FFXIVClassic Map Server.sln b/FFXIVClassic.sln similarity index 62% rename from FFXIVClassic Map Server.sln rename to FFXIVClassic.sln index 5563e16e..5cb0528a 100644 --- a/FFXIVClassic Map Server.sln +++ b/FFXIVClassic.sln @@ -1,28 +1,40 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 14 -VisualStudioVersion = 14.0.23107.0 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FFXIVClassic Map Server", "FFXIVClassic Map Server\FFXIVClassic Map Server.csproj", "{E8FA2784-D4B9-4711-8CC6-712A4B1CD54F}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FFXIVClassic Lobby Server", "FFXIVClassic Lobby Server\FFXIVClassic Lobby Server.csproj", "{703091E0-F69C-4177-8FAE-C258AC6A65AA}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Release|Any CPU = Release|Any CPU - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {E8FA2784-D4B9-4711-8CC6-712A4B1CD54F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {E8FA2784-D4B9-4711-8CC6-712A4B1CD54F}.Debug|Any CPU.Build.0 = Debug|Any CPU - {E8FA2784-D4B9-4711-8CC6-712A4B1CD54F}.Release|Any CPU.ActiveCfg = Release|Any CPU - {E8FA2784-D4B9-4711-8CC6-712A4B1CD54F}.Release|Any CPU.Build.0 = Release|Any CPU - {703091E0-F69C-4177-8FAE-C258AC6A65AA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {703091E0-F69C-4177-8FAE-C258AC6A65AA}.Debug|Any CPU.Build.0 = Debug|Any CPU - {703091E0-F69C-4177-8FAE-C258AC6A65AA}.Release|Any CPU.ActiveCfg = Release|Any CPU - {703091E0-F69C-4177-8FAE-C258AC6A65AA}.Release|Any CPU.Build.0 = Release|Any CPU - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 14 +VisualStudioVersion = 14.0.25123.0 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FFXIVClassic Map Server", "FFXIVClassic Map Server\FFXIVClassic Map Server.csproj", "{E8FA2784-D4B9-4711-8CC6-712A4B1CD54F}" + ProjectSection(ProjectDependencies) = postProject + {3A3D6626-C820-4C18-8C81-64811424F20E} = {3A3D6626-C820-4C18-8C81-64811424F20E} + EndProjectSection +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FFXIVClassic Lobby Server", "FFXIVClassic Lobby Server\FFXIVClassic Lobby Server.csproj", "{703091E0-F69C-4177-8FAE-C258AC6A65AA}" + ProjectSection(ProjectDependencies) = postProject + {3A3D6626-C820-4C18-8C81-64811424F20E} = {3A3D6626-C820-4C18-8C81-64811424F20E} + EndProjectSection +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FFXIVClassic Common Class Lib", "FFXIVClassic Common Class Lib\FFXIVClassic Common Class Lib.csproj", "{3A3D6626-C820-4C18-8C81-64811424F20E}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {E8FA2784-D4B9-4711-8CC6-712A4B1CD54F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {E8FA2784-D4B9-4711-8CC6-712A4B1CD54F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E8FA2784-D4B9-4711-8CC6-712A4B1CD54F}.Release|Any CPU.ActiveCfg = Release|Any CPU + {E8FA2784-D4B9-4711-8CC6-712A4B1CD54F}.Release|Any CPU.Build.0 = Release|Any CPU + {703091E0-F69C-4177-8FAE-C258AC6A65AA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {703091E0-F69C-4177-8FAE-C258AC6A65AA}.Debug|Any CPU.Build.0 = Debug|Any CPU + {703091E0-F69C-4177-8FAE-C258AC6A65AA}.Release|Any CPU.ActiveCfg = Release|Any CPU + {703091E0-F69C-4177-8FAE-C258AC6A65AA}.Release|Any CPU.Build.0 = Release|Any CPU + {3A3D6626-C820-4C18-8C81-64811424F20E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {3A3D6626-C820-4C18-8C81-64811424F20E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {3A3D6626-C820-4C18-8C81-64811424F20E}.Release|Any CPU.ActiveCfg = Release|Any CPU + {3A3D6626-C820-4C18-8C81-64811424F20E}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/data/lobby_config.ini b/data/lobby_config.ini index 4a9db1a8..fb02ff5b 100644 --- a/data/lobby_config.ini +++ b/data/lobby_config.ini @@ -1,7 +1,7 @@ [General] server_ip=127.0.0.1 showtimestamp = true - +log_level = 127 [Database] worldid=1 host=127.0.0.1 diff --git a/data/map_config.ini b/data/map_config.ini index 4a9db1a8..fb02ff5b 100644 --- a/data/map_config.ini +++ b/data/map_config.ini @@ -1,7 +1,7 @@ [General] server_ip=127.0.0.1 showtimestamp = true - +log_level = 127 [Database] worldid=1 host=127.0.0.1