From c67f74130f4a2b6446c8bf85a1962ed848ad4919 Mon Sep 17 00:00:00 2001 From: Filip Maj Date: Mon, 22 Aug 2016 10:43:04 -0400 Subject: [PATCH 01/20] Moved packet structures to common. --- .../BasePacket.cs | 3 +- .../FFXIVClassic Common Class Lib.csproj | 2 + .../SubPacket.cs | 2 +- FFXIVClassic Lobby Server/ClientConnection.cs | 1 - .../FFXIVClassic Lobby Server.csproj | 2 - FFXIVClassic Lobby Server/Server.cs | 2 +- .../packets/BasePacket.cs | 361 --- .../packets/SubPacket.cs | 163 -- .../packets/send/AccountListPacket.cs | 3 +- .../packets/send/CharaCreatorPacket.cs | 3 +- .../packets/send/CharacterListPacket.cs | 3 +- .../packets/send/ErrorPacket.cs | 3 +- .../packets/send/ImportListPacket.cs | 3 +- .../packets/send/RetainerListPacket.cs | 3 +- .../send/SelectCharacterConfirmPacket.cs | 3 +- .../packets/send/WorldListPacket.cs | 3 +- FFXIVClassic Map Server/ClientConnection.cs | 2 +- FFXIVClassic Map Server/CommandProcessor.cs | 2 +- FFXIVClassic Map Server/Database.cs | 2 +- .../FFXIVClassic Map Server.csproj | 2 - FFXIVClassic Map Server/PacketProcessor.cs | 2 +- FFXIVClassic Map Server/Server.cs | 2 +- FFXIVClassic Map Server/actors/Actor.cs | 2 +- FFXIVClassic Map Server/actors/area/Area.cs | 2 +- .../actors/area/PrivateArea.cs | 3 +- FFXIVClassic Map Server/actors/area/Zone.cs | 2 +- .../actors/chara/Character.cs | 3 +- .../actors/chara/npc/Npc.cs | 2 +- .../actors/chara/player/Equipment.cs | 1 - .../actors/chara/player/Inventory.cs | 4 +- .../actors/chara/player/Player.cs | 7 +- FFXIVClassic Map Server/actors/debug/Debug.cs | 2 +- .../actors/director/Director.cs | 3 +- .../actors/director/OpeningDirector.cs | 3 +- .../actors/director/WeatherDirector.cs | 3 +- .../director/quest/QuestDirectorMan0g001.cs | 3 +- .../director/quest/QuestDirectorMan0l001.cs | 3 +- .../director/quest/QuestDirectorMan0u001.cs | 3 +- .../actors/world/WorldMaster.cs | 3 +- .../dataobjects/ConnectedPlayer.cs | 4 +- FFXIVClassic Map Server/lua/LuaEngine.cs | 527 ++-- .../packets/send/Actor/ActorDoEmotePacket.cs | 4 +- .../send/Actor/ActorInstantiatePacket.cs | 4 +- .../send/Actor/ActorSpecialGraphicPacket.cs | 4 +- .../packets/send/Actor/AddActorPacket.cs | 6 +- .../packets/send/Actor/BattleAction1Packet.cs | 7 +- .../send/Actor/DeleteAllActorsPacket.cs | 6 +- .../send/Actor/MoveActorToPositionPacket.cs | 4 +- .../packets/send/Actor/RemoveActorPacket.cs | 4 +- .../send/Actor/SetActorAppearancePacket.cs | 4 +- .../packets/send/Actor/SetActorIconPacket.cs | 4 +- .../send/Actor/SetActorIdleAnimationPacket.cs | 4 +- .../send/Actor/SetActorIsZoningPacket.cs | 4 +- .../packets/send/Actor/SetActorNamePacket.cs | 4 +- .../send/Actor/SetActorPositionPacket.cs | 4 +- .../send/Actor/SetActorPropetyPacket.cs | 4 +- .../packets/send/Actor/SetActorSpeedPacket.cs | 5 +- .../packets/send/Actor/SetActorStatePacket.cs | 7 +- .../send/Actor/SetActorStatusAllPacket.cs | 7 +- .../send/Actor/SetActorStatusPacket.cs | 7 +- .../Actor/SetActorTargetAnimatedPacket.cs | 4 +- .../send/Actor/SetActorTargetPacket.cs | 3 +- .../packets/send/Actor/_0x132Packet.cs | 6 +- .../packets/send/Actor/_0xFPacket.cs | 4 +- .../packets/send/Actor/battle/BattleAction.cs | 4 +- .../Actor/battle/BattleActionX00Packet.cs | 7 +- .../Actor/battle/BattleActionX01Packet.cs | 7 +- .../Actor/battle/BattleActionX10Packet.cs | 7 +- .../Actor/battle/BattleActionX18Packet.cs | 7 +- .../Actor/events/SetEmoteEventCondition.cs | 7 +- .../send/Actor/events/SetEventStatus.cs | 4 +- .../Actor/events/SetNoticeEventCondition.cs | 4 +- .../events/SetPushEventConditionWithCircle.cs | 4 +- .../events/SetPushEventConditionWithFan.cs | 4 +- .../SetPushEventConditionWithTriggerBox.cs | 4 +- .../Actor/events/SetTalkEventCondition.cs | 4 +- .../Actor/inventory/EquipmentListX01Packet.cs | 4 +- .../Actor/inventory/EquipmentListX08Packet.cs | 4 +- .../Actor/inventory/EquipmentListX16Packet.cs | 4 +- .../Actor/inventory/EquipmentListX32Packet.cs | 4 +- .../Actor/inventory/EquipmentListX64Packet.cs | 4 +- .../inventory/InventoryBeginChangePacket.cs | 4 +- .../inventory/InventoryEndChangePacket.cs | 4 +- .../Actor/inventory/InventoryItemEndPacket.cs | 4 +- .../Actor/inventory/InventoryItemPacket.cs | 4 +- .../Actor/inventory/InventoryListX01Packet.cs | 4 +- .../Actor/inventory/InventoryListX08Packet.cs | 4 +- .../Actor/inventory/InventoryListX16Packet.cs | 4 +- .../Actor/inventory/InventoryListX32Packet.cs | 4 +- .../Actor/inventory/InventoryListX64Packet.cs | 4 +- .../inventory/InventoryRemoveX01Packet.cs | 4 +- .../inventory/InventoryRemoveX08Packet.cs | 7 +- .../inventory/InventoryRemoveX16Packet.cs | 4 +- .../inventory/InventoryRemoveX32Packet.cs | 4 +- .../inventory/InventoryRemoveX64Packet.cs | 4 +- .../inventory/InventorySetBeginPacket.cs | 4 +- .../Actor/inventory/InventorySetEndPacket.cs | 4 +- .../packets/send/GameMessagePacket.cs | 2 + .../packets/send/LogoutPacket.cs | 4 +- .../packets/send/PongPacket.cs | 3 +- .../packets/send/QuitPacket.cs | 4 +- .../packets/send/SendMessagePacket.cs | 2 + .../packets/send/SetMapPacket.cs | 2 + .../packets/send/SetMusicPacket.cs | 2 + .../packets/send/SetWeatherPacket.cs | 2 + .../packets/send/_0x02Packet.cs | 2 + .../packets/send/_0x10Packet.cs | 2 + .../packets/send/_0xE2Packet.cs | 2 + .../packets/send/events/EndEventPacket.cs | 2 + .../packets/send/events/KickEventPacket.cs | 2 + .../send/events/RunEventFunctionPacket.cs | 2 + .../packets/send/list/ListBeginPacket.cs | 2 + .../packets/send/list/ListEndPacket.cs | 2 + .../packets/send/list/ListEntriesEndPacket.cs | 2 + .../packets/send/list/ListEntry.cs | 4 +- .../packets/send/list/ListStartPacket.cs | 2 + .../packets/send/list/ListUtils.cs | 2 + .../send/list/SetListPropertyPacket.cs | 4 +- .../packets/send/login/0x2Packet.cs | 2 + .../packets/send/login/0x7ResponsePacket.cs | 5 +- .../send/player/AchievementEarnedPacket.cs | 2 + .../send/player/InfoRequestResponsePacket.cs | 2 + .../send/player/SendAchievementRatePacket.cs | 2 + .../send/player/SetAchievementPointsPacket.cs | 2 + .../send/player/SetChocoboNamePacket.cs | 2 + .../player/SetCompletedAchievementsPacket.cs | 2 + .../send/player/SetCurrentJobPacket.cs | 2 + .../player/SetCurrentMountChocoboPacket.cs | 4 +- .../player/SetCurrentMountGoobbuePacket.cs | 4 +- .../send/player/SetCutsceneBookPacket.cs | 2 + .../send/player/SetGrandCompanyPacket.cs | 4 +- .../send/player/SetHasChocoboPacket.cs | 4 +- .../send/player/SetHasGoobbuePacket.cs | 4 +- .../player/SetLatestAchievementsPacket.cs | 2 + .../send/player/SetPlayerDreamPacket.cs | 5 +- .../send/player/SetPlayerTitlePacket.cs | 2 + .../packets/send/player/_0x196Packet.cs | 2 + .../CurrentRecruitmentDetailsPacket.cs | 2 + .../send/recruitment/EndRecruitmentPacket.cs | 4 +- .../send/recruitment/RecruiterStatePacket.cs | 2 + .../recruitment/StartRecruitingResponse.cs | 4 +- .../send/social/BlacklistAddedPacket.cs | 2 + .../send/social/BlacklistRemovedPacket.cs | 2 + .../packets/send/social/FriendStatusPacket.cs | 2 + .../send/social/FriendlistAddedPacket.cs | 2 + .../send/social/FriendlistRemovedPacket.cs | 2 + .../send/social/SendBlacklistPacket.cs | 2 + .../send/social/SendFriendlistPacket.cs | 2 + .../send/supportdesk/EndGMTicketPacket.cs | 4 +- .../send/supportdesk/FaqBodyResponsePacket.cs | 2 + .../send/supportdesk/FaqListResponsePacket.cs | 2 + .../send/supportdesk/GMTicketPacket.cs | 2 + .../supportdesk/GMTicketSentResponsePacket.cs | 6 +- .../supportdesk/IssueListResponsePacket.cs | 2 + .../send/supportdesk/StartGMTicketPacket.cs | 4 +- .../utils/ActorPropertyPacketUtil.cs | 3 +- FFXIVClassic Proxy Server/App.config | 11 + FFXIVClassic Proxy Server/ConfigConstants.cs | 44 + .../DataObjects/ClientConnection.cs | 67 + .../DataObjects/Session.cs | 27 + .../DataObjects/ZoneServer.cs | 16 + .../FFXIVClassic World Server.csproj | 94 + FFXIVClassic Proxy Server/NLog.config | 61 + FFXIVClassic Proxy Server/NLog.xsd | 2601 +++++++++++++++++ FFXIVClassic Proxy Server/Program.cs | 72 + .../Properties/AssemblyInfo.cs | 36 + FFXIVClassic Proxy Server/Server.cs | 241 ++ FFXIVClassic Proxy Server/packages.config | 9 + FFXIVClassic.sln | 11 +- 169 files changed, 3939 insertions(+), 919 deletions(-) rename {FFXIVClassic Map Server/packets => FFXIVClassic Common Class Lib}/BasePacket.cs (99%) rename {FFXIVClassic Map Server/packets => FFXIVClassic Common Class Lib}/SubPacket.cs (99%) delete mode 100644 FFXIVClassic Lobby Server/packets/BasePacket.cs delete mode 100644 FFXIVClassic Lobby Server/packets/SubPacket.cs create mode 100644 FFXIVClassic Proxy Server/App.config create mode 100644 FFXIVClassic Proxy Server/ConfigConstants.cs create mode 100644 FFXIVClassic Proxy Server/DataObjects/ClientConnection.cs create mode 100644 FFXIVClassic Proxy Server/DataObjects/Session.cs create mode 100644 FFXIVClassic Proxy Server/DataObjects/ZoneServer.cs create mode 100644 FFXIVClassic Proxy Server/FFXIVClassic World Server.csproj create mode 100644 FFXIVClassic Proxy Server/NLog.config create mode 100644 FFXIVClassic Proxy Server/NLog.xsd create mode 100644 FFXIVClassic Proxy Server/Program.cs create mode 100644 FFXIVClassic Proxy Server/Properties/AssemblyInfo.cs create mode 100644 FFXIVClassic Proxy Server/Server.cs create mode 100644 FFXIVClassic Proxy Server/packages.config diff --git a/FFXIVClassic Map Server/packets/BasePacket.cs b/FFXIVClassic Common Class Lib/BasePacket.cs similarity index 99% rename from FFXIVClassic Map Server/packets/BasePacket.cs rename to FFXIVClassic Common Class Lib/BasePacket.cs index d44e35d3..384dbc88 100644 --- a/FFXIVClassic Map Server/packets/BasePacket.cs +++ b/FFXIVClassic Common Class Lib/BasePacket.cs @@ -3,11 +3,10 @@ using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Runtime.InteropServices; -using FFXIVClassic.Common; using NLog; using NLog.Targets; -namespace FFXIVClassic_Map_Server.packets +namespace FFXIVClassic.Common { [StructLayout(LayoutKind.Sequential)] public struct BasePacketHeader diff --git a/FFXIVClassic Common Class Lib/FFXIVClassic Common Class Lib.csproj b/FFXIVClassic Common Class Lib/FFXIVClassic Common Class Lib.csproj index 8c708e5f..df116585 100644 --- a/FFXIVClassic Common Class Lib/FFXIVClassic Common Class Lib.csproj +++ b/FFXIVClassic Common Class Lib/FFXIVClassic Common Class Lib.csproj @@ -54,12 +54,14 @@ + + diff --git a/FFXIVClassic Map Server/packets/SubPacket.cs b/FFXIVClassic Common Class Lib/SubPacket.cs similarity index 99% rename from FFXIVClassic Map Server/packets/SubPacket.cs rename to FFXIVClassic Common Class Lib/SubPacket.cs index 954e80b1..199199d0 100644 --- a/FFXIVClassic Map Server/packets/SubPacket.cs +++ b/FFXIVClassic Common Class Lib/SubPacket.cs @@ -4,7 +4,7 @@ using FFXIVClassic.Common; using NLog; using NLog.Targets; -namespace FFXIVClassic_Map_Server.packets +namespace FFXIVClassic.Common { [StructLayout(LayoutKind.Sequential)] public struct SubPacketHeader diff --git a/FFXIVClassic Lobby Server/ClientConnection.cs b/FFXIVClassic Lobby Server/ClientConnection.cs index 02747492..1bc1208b 100644 --- a/FFXIVClassic Lobby Server/ClientConnection.cs +++ b/FFXIVClassic Lobby Server/ClientConnection.cs @@ -1,6 +1,5 @@ using System; using System.Net.Sockets; -using FFXIVClassic_Lobby_Server.packets; using FFXIVClassic.Common; using System.Collections.Concurrent; using Cyotek.Collections.Generic; diff --git a/FFXIVClassic Lobby Server/FFXIVClassic Lobby Server.csproj b/FFXIVClassic Lobby Server/FFXIVClassic Lobby Server.csproj index 8f83df96..b24f03c4 100644 --- a/FFXIVClassic Lobby Server/FFXIVClassic Lobby Server.csproj +++ b/FFXIVClassic Lobby Server/FFXIVClassic Lobby Server.csproj @@ -89,7 +89,6 @@ - @@ -99,7 +98,6 @@ - diff --git a/FFXIVClassic Lobby Server/Server.cs b/FFXIVClassic Lobby Server/Server.cs index e596ec26..93cd8639 100644 --- a/FFXIVClassic Lobby Server/Server.cs +++ b/FFXIVClassic Lobby Server/Server.cs @@ -3,7 +3,7 @@ using System.Collections.Generic; using System.Net; using System.Net.Sockets; using System.Threading; -using FFXIVClassic_Lobby_Server.packets; + using FFXIVClassic.Common; using NLog; diff --git a/FFXIVClassic Lobby Server/packets/BasePacket.cs b/FFXIVClassic Lobby Server/packets/BasePacket.cs deleted file mode 100644 index 075ec2b6..00000000 --- a/FFXIVClassic Lobby Server/packets/BasePacket.cs +++ /dev/null @@ -1,361 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Diagnostics; -using System.IO; -using System.Runtime.InteropServices; -using FFXIVClassic.Common; -using NLog; -using NLog.Targets; - -namespace FFXIVClassic_Lobby_Server.packets -{ - [StructLayout(LayoutKind.Sequential)] - public struct BasePacketHeader - { - public byte isAuthenticated; - public byte isEncrypted; - public ushort connectionType; - public ushort packetSize; - public ushort numSubpackets; - public ulong timestamp; //Miliseconds - } - - public class BasePacket - { - public const int TYPE_ZONE = 1; - public const int TYPE_CHAT = 2; - public const int BASEPACKET_SIZE = 0x10; - private static readonly Logger logger = LogManager.GetCurrentClassLogger(); - public byte[] data; - - public BasePacketHeader header; - - //Loads a sniffed packet from a file - public unsafe BasePacket(string path) - { - var bytes = File.ReadAllBytes(path); - - if (bytes.Length < BASEPACKET_SIZE) - throw new OverflowException("Packet Error: Packet was too small"); - - fixed (byte* pdata = &bytes[0]) - { - header = (BasePacketHeader) Marshal.PtrToStructure(new IntPtr(pdata), typeof(BasePacketHeader)); - } - - if (bytes.Length < header.packetSize) - throw new OverflowException("Packet Error: Packet size didn't equal given size"); - - int packetSize = header.packetSize; - - if (packetSize - BASEPACKET_SIZE != 0) - { - data = new byte[packetSize - BASEPACKET_SIZE]; - Array.Copy(bytes, BASEPACKET_SIZE, data, 0, packetSize - BASEPACKET_SIZE); - } - else - data = new byte[0]; - } - - //Loads a sniffed packet from a byte array - public unsafe BasePacket(byte[] bytes) - { - if (bytes.Length < BASEPACKET_SIZE) - throw new OverflowException("Packet Error: Packet was too small"); - - fixed (byte* pdata = &bytes[0]) - { - header = (BasePacketHeader) Marshal.PtrToStructure(new IntPtr(pdata), typeof(BasePacketHeader)); - } - - if (bytes.Length < header.packetSize) - throw new OverflowException("Packet Error: Packet size didn't equal given size"); - - int packetSize = header.packetSize; - - data = new byte[packetSize - BASEPACKET_SIZE]; - Array.Copy(bytes, BASEPACKET_SIZE, data, 0, packetSize - BASEPACKET_SIZE); - } - - public unsafe BasePacket(byte[] bytes, ref int offset) - { - if (bytes.Length < offset + BASEPACKET_SIZE) - throw new OverflowException("Packet Error: Packet was too small"); - - fixed (byte* pdata = &bytes[offset]) - { - header = (BasePacketHeader) Marshal.PtrToStructure(new IntPtr(pdata), typeof(BasePacketHeader)); - } - - int packetSize = header.packetSize; - - if (bytes.Length < offset + header.packetSize) - throw new OverflowException("Packet Error: Packet size didn't equal given size"); - - data = new byte[packetSize - BASEPACKET_SIZE]; - Array.Copy(bytes, offset + BASEPACKET_SIZE, data, 0, packetSize - BASEPACKET_SIZE); - - offset += packetSize; - } - - public BasePacket(BasePacketHeader header, byte[] data) - { - this.header = header; - this.data = data; - } - - public List GetSubpackets() - { - var subpackets = new List(header.numSubpackets); - - var offset = 0; - - while (offset < data.Length) - subpackets.Add(new SubPacket(data, ref offset)); - - return subpackets; - } - - public static unsafe BasePacketHeader GetHeader(byte[] bytes) - { - BasePacketHeader header; - if (bytes.Length < BASEPACKET_SIZE) - throw new OverflowException("Packet Error: Packet was too small"); - - fixed (byte* pdata = &bytes[0]) - { - header = (BasePacketHeader) Marshal.PtrToStructure(new IntPtr(pdata), typeof(BasePacketHeader)); - } - - return header; - } - - public byte[] GetHeaderBytes() - { - var size = Marshal.SizeOf(header); - var arr = new byte[size]; - - var ptr = Marshal.AllocHGlobal(size); - Marshal.StructureToPtr(header, ptr, true); - Marshal.Copy(ptr, arr, 0, size); - Marshal.FreeHGlobal(ptr); - return arr; - } - - public byte[] GetPacketBytes() - { - var outBytes = new byte[header.packetSize]; - Array.Copy(GetHeaderBytes(), 0, outBytes, 0, BASEPACKET_SIZE); - Array.Copy(data, 0, outBytes, BASEPACKET_SIZE, data.Length); - return outBytes; - } - - //Replaces all instances of the sniffed actorID with the given one - public void ReplaceActorID(uint actorID) - { - using (var mem = new MemoryStream(data)) - { - using (var binWriter = new BinaryWriter(mem)) - { - using (var binreader = new BinaryReader(mem)) - { - while (binreader.BaseStream.Position + 4 < data.Length) - { - var read = binreader.ReadUInt32(); - if (read == 0x029B2941 || read == 0x02977DC7 || read == 0x0297D2C8 || read == 0x0230d573 || - read == 0x23317df || read == 0x23344a3 || read == 0x1730bdb) //Original ID - { - binWriter.BaseStream.Seek(binreader.BaseStream.Position - 0x4, SeekOrigin.Begin); - binWriter.Write(actorID); - } - } - } - } - } - } - - //Replaces all instances of the sniffed actorID with the given one - public void ReplaceActorID(uint fromActorID, uint actorID) - { - using (var mem = new MemoryStream(data)) - { - using (var binWriter = new BinaryWriter(mem)) - { - using (var binreader = new BinaryReader(mem)) - { - while (binreader.BaseStream.Position + 4 < data.Length) - { - var read = binreader.ReadUInt32(); - if (read == fromActorID) //Original ID - { - binWriter.BaseStream.Seek(binreader.BaseStream.Position - 0x4, SeekOrigin.Begin); - binWriter.Write(actorID); - } - } - } - } - } - } - - public void DebugPrintPacket() - { -#if DEBUG - logger.ColorDebug( - string.Format("IsAuth:{0} Size:0x{1:X}, NumSubpackets:{2}{3}{4}", - header.isAuthenticated, header.packetSize, header.numSubpackets, - Environment.NewLine, Utils.ByteArrayToHex(GetHeaderBytes())), ConsoleOutputColor.DarkYellow); - - foreach (var sub in GetSubpackets()) - { - sub.DebugPrintSubPacket(); - } -#endif - } - - #region Utility Functions - - public static BasePacket CreatePacket(List subpackets, bool isAuthed, bool isEncrypted) - { - //Create Header - var header = new BasePacketHeader(); - byte[] data = null; - - header.isAuthenticated = isAuthed ? (byte) 1 : (byte) 0; - header.isEncrypted = isEncrypted ? (byte) 1 : (byte) 0; - header.numSubpackets = (ushort) subpackets.Count; - header.packetSize = BASEPACKET_SIZE; - header.timestamp = Utils.MilisUnixTimeStampUTC(); - - //Get packet size - foreach (var subpacket in subpackets) - header.packetSize += subpacket.header.subpacketSize; - - data = new byte[header.packetSize - 0x10]; - - //Add Subpackets - var offset = 0; - foreach (var subpacket in subpackets) - { - var subpacketData = subpacket.GetBytes(); - Array.Copy(subpacketData, 0, data, offset, subpacketData.Length); - offset += (ushort) subpacketData.Length; - } - - Debug.Assert(data != null && offset == data.Length && header.packetSize == 0x10 + offset); - - var packet = new BasePacket(header, data); - return packet; - } - - public static BasePacket CreatePacket(SubPacket subpacket, bool isAuthed, bool isEncrypted) - { - //Create Header - var header = new BasePacketHeader(); - byte[] data = null; - - header.isAuthenticated = isAuthed ? (byte) 1 : (byte) 0; - header.isEncrypted = isEncrypted ? (byte) 1 : (byte) 0; - header.numSubpackets = 1; - header.packetSize = BASEPACKET_SIZE; - header.timestamp = Utils.MilisUnixTimeStampUTC(); - - //Get packet size - header.packetSize += subpacket.header.subpacketSize; - - data = new byte[header.packetSize - 0x10]; - - //Add Subpackets - var subpacketData = subpacket.GetBytes(); - Array.Copy(subpacketData, 0, data, 0, subpacketData.Length); - - Debug.Assert(data != null); - - var packet = new BasePacket(header, data); - return packet; - } - - public static BasePacket CreatePacket(byte[] data, bool isAuthed, bool isEncrypted) - { - Debug.Assert(data != null); - - //Create Header - var header = new BasePacketHeader(); - - header.isAuthenticated = isAuthed ? (byte) 1 : (byte) 0; - header.isEncrypted = isEncrypted ? (byte) 1 : (byte) 0; - header.numSubpackets = 1; - header.packetSize = BASEPACKET_SIZE; - header.timestamp = Utils.MilisUnixTimeStampUTC(); - - //Get packet size - header.packetSize += (ushort) data.Length; - - var packet = new BasePacket(header, data); - return packet; - } - - public static unsafe void EncryptPacket(Blowfish blowfish, BasePacket packet) - { - var data = packet.data; - int size = packet.header.packetSize; - - var offset = 0; - while (offset < data.Length) - { - if (data.Length < offset + SubPacket.SUBPACKET_SIZE) - throw new OverflowException("Packet Error: Subpacket was too small"); - - SubPacketHeader header; - fixed (byte* pdata = &data[offset]) - { - header = (SubPacketHeader) Marshal.PtrToStructure(new IntPtr(pdata), typeof(SubPacketHeader)); - } - - if (data.Length < offset + header.subpacketSize) - throw new OverflowException("Packet Error: Subpacket size didn't equal subpacket data"); - - blowfish.Encipher(data, offset + 0x10, header.subpacketSize - 0x10); - - offset += header.subpacketSize; - } - } - - public static unsafe void DecryptPacket(Blowfish blowfish, ref BasePacket packet) - { - var data = packet.data; - int size = packet.header.packetSize; - - var offset = 0; - while (offset < data.Length) - { - if (data.Length < offset + SubPacket.SUBPACKET_SIZE) - throw new OverflowException("Packet Error: Subpacket was too small"); - - SubPacketHeader header; - fixed (byte* pdata = &data[offset]) - { - header = (SubPacketHeader) Marshal.PtrToStructure(new IntPtr(pdata), typeof(SubPacketHeader)); - } - - if (data.Length < offset + header.subpacketSize) - throw new OverflowException("Packet Error: Subpacket size didn't equal subpacket data"); - - blowfish.Decipher(data, offset + 0x10, header.subpacketSize - 0x10); - - offset += header.subpacketSize; - } - } - - #endregion - } - - public static class LoggerExtensions - { - public static void ColorDebug(this Logger logger, string message, ConsoleOutputColor color) - { - var logEvent = new LogEventInfo(LogLevel.Debug, logger.Name, message); - logEvent.Properties["color"] = (int) color; - logger.Log(logEvent); - } - } -} \ No newline at end of file diff --git a/FFXIVClassic Lobby Server/packets/SubPacket.cs b/FFXIVClassic Lobby Server/packets/SubPacket.cs deleted file mode 100644 index d684a087..00000000 --- a/FFXIVClassic Lobby Server/packets/SubPacket.cs +++ /dev/null @@ -1,163 +0,0 @@ -using System; -using System.Runtime.InteropServices; -using FFXIVClassic.Common; -using NLog; -using NLog.Targets; - -namespace FFXIVClassic_Lobby_Server.packets -{ - [StructLayout(LayoutKind.Sequential)] - public struct SubPacketHeader - { - public ushort subpacketSize; - public ushort type; - public uint sourceId; - public uint targetId; - public uint unknown1; - } - - [StructLayout(LayoutKind.Sequential)] - public struct GameMessageHeader - { - public ushort unknown4; //Always 0x14 - public ushort opcode; - public uint unknown5; - public uint timestamp; - public uint unknown6; - } - - public class SubPacket - { - public const int SUBPACKET_SIZE = 0x10; - public const int GAMEMESSAGE_SIZE = 0x10; - private static readonly Logger logger = LogManager.GetCurrentClassLogger(); - public byte[] data; - public GameMessageHeader gameMessage; - - public SubPacketHeader header; - - public unsafe SubPacket(byte[] bytes, ref int offset) - { - if (bytes.Length < offset + SUBPACKET_SIZE) - throw new OverflowException("Packet Error: Subpacket was too small"); - - fixed (byte* pdata = &bytes[offset]) - { - header = (SubPacketHeader) Marshal.PtrToStructure(new IntPtr(pdata), typeof(SubPacketHeader)); - } - - if (header.type == 0x3) - { - fixed (byte* pdata = &bytes[offset + SUBPACKET_SIZE]) - { - gameMessage = - (GameMessageHeader) Marshal.PtrToStructure(new IntPtr(pdata), typeof(GameMessageHeader)); - } - } - - if (bytes.Length < offset + header.subpacketSize) - throw new OverflowException("Packet Error: Subpacket size didn't equal subpacket data"); - - if (header.type == 0x3) - { - data = new byte[header.subpacketSize - SUBPACKET_SIZE - GAMEMESSAGE_SIZE]; - Array.Copy(bytes, offset + SUBPACKET_SIZE + GAMEMESSAGE_SIZE, data, 0, data.Length); - } - else - { - data = new byte[header.subpacketSize - SUBPACKET_SIZE]; - Array.Copy(bytes, offset + SUBPACKET_SIZE, data, 0, data.Length); - } - - offset += header.subpacketSize; - } - - public SubPacket(ushort opcode, uint sourceId, uint targetId, byte[] data) - { - header = new SubPacketHeader(); - gameMessage = new GameMessageHeader(); - - gameMessage.opcode = opcode; - header.sourceId = sourceId; - header.targetId = targetId; - - gameMessage.timestamp = Utils.UnixTimeStampUTC(); - - header.type = 0x03; - header.unknown1 = 0x00; - gameMessage.unknown4 = 0x14; - gameMessage.unknown5 = 0x00; - gameMessage.unknown6 = 0x00; - - this.data = data; - - header.subpacketSize = (ushort) (SUBPACKET_SIZE + GAMEMESSAGE_SIZE + data.Length); - } - - public SubPacket(SubPacket original, uint newTargetId) - { - header = new SubPacketHeader(); - gameMessage = original.gameMessage; - header.subpacketSize = original.header.subpacketSize; - header.type = original.header.type; - header.sourceId = original.header.sourceId; - header.targetId = newTargetId; - data = original.data; - } - - public byte[] GetHeaderBytes() - { - var size = Marshal.SizeOf(header); - var arr = new byte[size]; - - var ptr = Marshal.AllocHGlobal(size); - Marshal.StructureToPtr(header, ptr, true); - Marshal.Copy(ptr, arr, 0, size); - Marshal.FreeHGlobal(ptr); - return arr; - } - - public byte[] GetGameMessageBytes() - { - var size = Marshal.SizeOf(gameMessage); - var arr = new byte[size]; - - var ptr = Marshal.AllocHGlobal(size); - Marshal.StructureToPtr(gameMessage, ptr, true); - Marshal.Copy(ptr, arr, 0, size); - Marshal.FreeHGlobal(ptr); - return arr; - } - - public byte[] GetBytes() - { - var outBytes = new byte[header.subpacketSize]; - Array.Copy(GetHeaderBytes(), 0, outBytes, 0, SUBPACKET_SIZE); - - if (header.type == 0x3) - Array.Copy(GetGameMessageBytes(), 0, outBytes, SUBPACKET_SIZE, GAMEMESSAGE_SIZE); - - Array.Copy(data, 0, outBytes, SUBPACKET_SIZE + (header.type == 0x3 ? GAMEMESSAGE_SIZE : 0), data.Length); - return outBytes; - } - - public void DebugPrintSubPacket() - { -#if DEBUG - logger.ColorDebug( - string.Format("Size:0x{0:X} Opcode:0x{1:X}{2}{3}", header.subpacketSize, gameMessage.opcode, - Environment.NewLine, - Utils.ByteArrayToHex(GetHeaderBytes())), ConsoleOutputColor.DarkRed); - - if (header.type == 0x03) - { - logger.ColorDebug(Utils.ByteArrayToHex(GetGameMessageBytes(), SUBPACKET_SIZE), - ConsoleOutputColor.DarkRed); - - logger.ColorDebug(Utils.ByteArrayToHex(data, SUBPACKET_SIZE + GAMEMESSAGE_SIZE), - ConsoleOutputColor.DarkMagenta); - } -#endif - } - } -} \ No newline at end of file diff --git a/FFXIVClassic Lobby Server/packets/send/AccountListPacket.cs b/FFXIVClassic Lobby Server/packets/send/AccountListPacket.cs index 9bedc3d3..a6c69341 100644 --- a/FFXIVClassic Lobby Server/packets/send/AccountListPacket.cs +++ b/FFXIVClassic Lobby Server/packets/send/AccountListPacket.cs @@ -1,4 +1,5 @@ -using FFXIVClassic_Lobby_Server.dataobjects; +using FFXIVClassic.Common; +using FFXIVClassic_Lobby_Server.dataobjects; using System; using System.Collections.Generic; using System.IO; diff --git a/FFXIVClassic Lobby Server/packets/send/CharaCreatorPacket.cs b/FFXIVClassic Lobby Server/packets/send/CharaCreatorPacket.cs index d5b9289b..5825c7be 100644 --- a/FFXIVClassic Lobby Server/packets/send/CharaCreatorPacket.cs +++ b/FFXIVClassic Lobby Server/packets/send/CharaCreatorPacket.cs @@ -1,4 +1,5 @@ -using System; +using FFXIVClassic.Common; +using System; using System.IO; using System.Text; diff --git a/FFXIVClassic Lobby Server/packets/send/CharacterListPacket.cs b/FFXIVClassic Lobby Server/packets/send/CharacterListPacket.cs index 2ad1b0b9..42db777f 100644 --- a/FFXIVClassic Lobby Server/packets/send/CharacterListPacket.cs +++ b/FFXIVClassic Lobby Server/packets/send/CharacterListPacket.cs @@ -1,4 +1,5 @@ -using FFXIVClassic_Lobby_Server.dataobjects; +using FFXIVClassic.Common; +using FFXIVClassic_Lobby_Server.dataobjects; using System; using System.Collections.Generic; using System.IO; diff --git a/FFXIVClassic Lobby Server/packets/send/ErrorPacket.cs b/FFXIVClassic Lobby Server/packets/send/ErrorPacket.cs index 0e707e62..5578ee52 100644 --- a/FFXIVClassic Lobby Server/packets/send/ErrorPacket.cs +++ b/FFXIVClassic Lobby Server/packets/send/ErrorPacket.cs @@ -1,4 +1,5 @@ -using System; +using FFXIVClassic.Common; +using System; using System.IO; using System.Text; diff --git a/FFXIVClassic Lobby Server/packets/send/ImportListPacket.cs b/FFXIVClassic Lobby Server/packets/send/ImportListPacket.cs index 80bce85c..ac389071 100644 --- a/FFXIVClassic Lobby Server/packets/send/ImportListPacket.cs +++ b/FFXIVClassic Lobby Server/packets/send/ImportListPacket.cs @@ -1,4 +1,5 @@ -using System; +using FFXIVClassic.Common; +using System; using System.Collections.Generic; using System.IO; using System.Text; diff --git a/FFXIVClassic Lobby Server/packets/send/RetainerListPacket.cs b/FFXIVClassic Lobby Server/packets/send/RetainerListPacket.cs index c12c245b..c9a6377d 100644 --- a/FFXIVClassic Lobby Server/packets/send/RetainerListPacket.cs +++ b/FFXIVClassic Lobby Server/packets/send/RetainerListPacket.cs @@ -1,4 +1,5 @@ -using System; +using FFXIVClassic.Common; +using System; using System.Collections.Generic; using System.IO; using System.Text; diff --git a/FFXIVClassic Lobby Server/packets/send/SelectCharacterConfirmPacket.cs b/FFXIVClassic Lobby Server/packets/send/SelectCharacterConfirmPacket.cs index 352c11e3..6b57da3f 100644 --- a/FFXIVClassic Lobby Server/packets/send/SelectCharacterConfirmPacket.cs +++ b/FFXIVClassic Lobby Server/packets/send/SelectCharacterConfirmPacket.cs @@ -1,4 +1,5 @@ -using System; +using FFXIVClassic.Common; +using System; using System.Collections.Generic; using System.IO; using System.Text; diff --git a/FFXIVClassic Lobby Server/packets/send/WorldListPacket.cs b/FFXIVClassic Lobby Server/packets/send/WorldListPacket.cs index 06866bfc..0e939700 100644 --- a/FFXIVClassic Lobby Server/packets/send/WorldListPacket.cs +++ b/FFXIVClassic Lobby Server/packets/send/WorldListPacket.cs @@ -1,4 +1,5 @@ -using FFXIVClassic_Lobby_Server.dataobjects; +using FFXIVClassic.Common; +using FFXIVClassic_Lobby_Server.dataobjects; using System; using System.Collections.Generic; using System.IO; diff --git a/FFXIVClassic Map Server/ClientConnection.cs b/FFXIVClassic Map Server/ClientConnection.cs index 8592d78c..fcae92c6 100644 --- a/FFXIVClassic Map Server/ClientConnection.cs +++ b/FFXIVClassic Map Server/ClientConnection.cs @@ -1,6 +1,6 @@ using System; using System.Net.Sockets; -using FFXIVClassic_Map_Server.packets; + using FFXIVClassic.Common; using System.Collections.Concurrent; using System.Net; diff --git a/FFXIVClassic Map Server/CommandProcessor.cs b/FFXIVClassic Map Server/CommandProcessor.cs index 50985884..3936a2b7 100644 --- a/FFXIVClassic Map Server/CommandProcessor.cs +++ b/FFXIVClassic Map Server/CommandProcessor.cs @@ -8,7 +8,7 @@ using System.Threading.Tasks; using System.Threading; using FFXIVClassic.Common; using FFXIVClassic_Map_Server.dataobjects; -using FFXIVClassic_Map_Server.packets; + using System.IO; using FFXIVClassic_Map_Server.packets.send.actor; using FFXIVClassic_Map_Server; diff --git a/FFXIVClassic Map Server/Database.cs b/FFXIVClassic Map Server/Database.cs index 823e8b13..cb8f72a4 100644 --- a/FFXIVClassic Map Server/Database.cs +++ b/FFXIVClassic Map Server/Database.cs @@ -5,7 +5,7 @@ using System.Collections.Generic; using System.Linq; using FFXIVClassic.Common; using FFXIVClassic_Map_Server.utils; -using FFXIVClassic_Map_Server.packets; + using FFXIVClassic_Map_Server.packets.send.player; using FFXIVClassic_Map_Server.dataobjects; using FFXIVClassic_Map_Server.Actors; diff --git a/FFXIVClassic Map Server/FFXIVClassic Map Server.csproj b/FFXIVClassic Map Server/FFXIVClassic Map Server.csproj index c5c79140..d71ab75b 100644 --- a/FFXIVClassic Map Server/FFXIVClassic Map Server.csproj +++ b/FFXIVClassic Map Server/FFXIVClassic Map Server.csproj @@ -121,7 +121,6 @@ - @@ -255,7 +254,6 @@ - diff --git a/FFXIVClassic Map Server/PacketProcessor.cs b/FFXIVClassic Map Server/PacketProcessor.cs index 590315c8..a6673c93 100644 --- a/FFXIVClassic Map Server/PacketProcessor.cs +++ b/FFXIVClassic Map Server/PacketProcessor.cs @@ -1,5 +1,5 @@ using FFXIVClassic.Common; -using FFXIVClassic_Map_Server.packets; + using System; using System.Collections.Generic; using System.IO; diff --git a/FFXIVClassic Map Server/Server.cs b/FFXIVClassic Map Server/Server.cs index e7f1f1be..ca939e63 100644 --- a/FFXIVClassic Map Server/Server.cs +++ b/FFXIVClassic Map Server/Server.cs @@ -4,7 +4,7 @@ using System.Net; using System.Net.Sockets; using System.Threading; using FFXIVClassic_Map_Server.dataobjects; -using FFXIVClassic_Map_Server.packets; + using FFXIVClassic.Common; using NLog; using FFXIVClassic_Map_Server.Actors; diff --git a/FFXIVClassic Map Server/actors/Actor.cs b/FFXIVClassic Map Server/actors/Actor.cs index 9214a075..dc26a885 100644 --- a/FFXIVClassic Map Server/actors/Actor.cs +++ b/FFXIVClassic Map Server/actors/Actor.cs @@ -1,4 +1,4 @@ -using FFXIVClassic_Map_Server.packets; + using FFXIVClassic_Map_Server.actors; using FFXIVClassic_Map_Server.lua; using FFXIVClassic_Map_Server.packets.send.actor; diff --git a/FFXIVClassic Map Server/actors/area/Area.cs b/FFXIVClassic Map Server/actors/area/Area.cs index 811b9200..35e45188 100644 --- a/FFXIVClassic Map Server/actors/area/Area.cs +++ b/FFXIVClassic Map Server/actors/area/Area.cs @@ -1,6 +1,6 @@ using FFXIVClassic_Map_Server; using FFXIVClassic.Common; -using FFXIVClassic_Map_Server.packets; + using FFXIVClassic_Map_Server.actors.area; using FFXIVClassic_Map_Server.actors.chara.npc; using FFXIVClassic_Map_Server.dataobjects; diff --git a/FFXIVClassic Map Server/actors/area/PrivateArea.cs b/FFXIVClassic Map Server/actors/area/PrivateArea.cs index dd7cf9de..340648e5 100644 --- a/FFXIVClassic Map Server/actors/area/PrivateArea.cs +++ b/FFXIVClassic Map Server/actors/area/PrivateArea.cs @@ -1,4 +1,5 @@ -using FFXIVClassic_Map_Server.packets; + +using FFXIVClassic.Common; using FFXIVClassic_Map_Server.Actors; using FFXIVClassic_Map_Server.lua; using FFXIVClassic_Map_Server.packets.send.actor; diff --git a/FFXIVClassic Map Server/actors/area/Zone.cs b/FFXIVClassic Map Server/actors/area/Zone.cs index 51622b36..e0c41e44 100644 --- a/FFXIVClassic Map Server/actors/area/Zone.cs +++ b/FFXIVClassic Map Server/actors/area/Zone.cs @@ -1,6 +1,6 @@ using FFXIVClassic_Map_Server; using FFXIVClassic.Common; -using FFXIVClassic_Map_Server.packets; + using FFXIVClassic_Map_Server.actors.chara.npc; using FFXIVClassic_Map_Server.Actors; using FFXIVClassic_Map_Server.lua; diff --git a/FFXIVClassic Map Server/actors/chara/Character.cs b/FFXIVClassic Map Server/actors/chara/Character.cs index ddde616c..41b8932a 100644 --- a/FFXIVClassic Map Server/actors/chara/Character.cs +++ b/FFXIVClassic Map Server/actors/chara/Character.cs @@ -1,4 +1,5 @@ -using FFXIVClassic_Map_Server.packets; + +using FFXIVClassic.Common; using FFXIVClassic_Map_Server.Actors.Chara; using FFXIVClassic_Map_Server.packets.send.actor; diff --git a/FFXIVClassic Map Server/actors/chara/npc/Npc.cs b/FFXIVClassic Map Server/actors/chara/npc/Npc.cs index 2459cda7..5702a35c 100644 --- a/FFXIVClassic Map Server/actors/chara/npc/Npc.cs +++ b/FFXIVClassic Map Server/actors/chara/npc/Npc.cs @@ -3,7 +3,7 @@ using FFXIVClassic_Map_Server.actors; using FFXIVClassic_Map_Server.Actors.Chara; using FFXIVClassic_Map_Server.dataobjects; using FFXIVClassic_Map_Server.lua; -using FFXIVClassic_Map_Server.packets; + using FFXIVClassic_Map_Server.packets.receive.events; using FFXIVClassic_Map_Server.packets.send.actor; using FFXIVClassic_Map_Server.utils; diff --git a/FFXIVClassic Map Server/actors/chara/player/Equipment.cs b/FFXIVClassic Map Server/actors/chara/player/Equipment.cs index ebe1f88d..3092ba39 100644 --- a/FFXIVClassic Map Server/actors/chara/player/Equipment.cs +++ b/FFXIVClassic Map Server/actors/chara/player/Equipment.cs @@ -1,7 +1,6 @@ using FFXIVClassic_Map_Server.Actors; using FFXIVClassic_Map_Server.dataobjects; using FFXIVClassic_Map_Server.packets.send.actor.inventory; -using FFXIVClassic_Map_Server.packets.send.Actor.inventory; using System.Collections.Generic; namespace FFXIVClassic_Map_Server.actors.chara.player diff --git a/FFXIVClassic Map Server/actors/chara/player/Inventory.cs b/FFXIVClassic Map Server/actors/chara/player/Inventory.cs index 19538ae4..4b2d786b 100644 --- a/FFXIVClassic Map Server/actors/chara/player/Inventory.cs +++ b/FFXIVClassic Map Server/actors/chara/player/Inventory.cs @@ -1,8 +1,8 @@ -using FFXIVClassic_Map_Server.packets; + +using FFXIVClassic.Common; using FFXIVClassic_Map_Server.Actors; using FFXIVClassic_Map_Server.dataobjects; using FFXIVClassic_Map_Server.packets.send.actor.inventory; -using FFXIVClassic_Map_Server.packets.send.Actor.inventory; using System; using System.Collections.Generic; using System.Linq; diff --git a/FFXIVClassic Map Server/actors/chara/player/Player.cs b/FFXIVClassic Map Server/actors/chara/player/Player.cs index 3f19e2f5..91dc16d6 100644 --- a/FFXIVClassic Map Server/actors/chara/player/Player.cs +++ b/FFXIVClassic Map Server/actors/chara/player/Player.cs @@ -1,5 +1,5 @@ using FFXIVClassic.Common; -using FFXIVClassic_Map_Server.packets; + using FFXIVClassic_Map_Server.actors.chara.player; using FFXIVClassic_Map_Server.actors.director; using FFXIVClassic_Map_Server.dataobjects; @@ -7,8 +7,6 @@ using FFXIVClassic_Map_Server.dataobjects.chara; using FFXIVClassic_Map_Server.lua; using FFXIVClassic_Map_Server.packets.send; using FFXIVClassic_Map_Server.packets.send.actor; -using FFXIVClassic_Map_Server.packets.send.actor.events; -using FFXIVClassic_Map_Server.packets.send.Actor.inventory; using FFXIVClassic_Map_Server.packets.send.events; using FFXIVClassic_Map_Server.packets.send.list; using FFXIVClassic_Map_Server.packets.send.player; @@ -17,7 +15,8 @@ using System; using System.Collections.Generic; using MoonSharp.Interpreter; using FFXIVClassic_Map_Server.packets.receive.events; - +using FFXIVClassic_Map_Server.packets.send.actor.inventory; + namespace FFXIVClassic_Map_Server.Actors { class Player : Character diff --git a/FFXIVClassic Map Server/actors/debug/Debug.cs b/FFXIVClassic Map Server/actors/debug/Debug.cs index 8c84c223..ddea59d9 100644 --- a/FFXIVClassic Map Server/actors/debug/Debug.cs +++ b/FFXIVClassic Map Server/actors/debug/Debug.cs @@ -1,4 +1,4 @@ -using FFXIVClassic_Map_Server.packets; +using FFXIVClassic.Common; using FFXIVClassic_Map_Server.lua; using FFXIVClassic_Map_Server.packets.send.actor; using System.Collections.Generic; diff --git a/FFXIVClassic Map Server/actors/director/Director.cs b/FFXIVClassic Map Server/actors/director/Director.cs index fb50c3c8..4c06957f 100644 --- a/FFXIVClassic Map Server/actors/director/Director.cs +++ b/FFXIVClassic Map Server/actors/director/Director.cs @@ -1,4 +1,5 @@ -using FFXIVClassic_Map_Server.packets; + +using FFXIVClassic.Common; using FFXIVClassic_Map_Server.Actors; using FFXIVClassic_Map_Server.lua; using FFXIVClassic_Map_Server.packets.send.actor; diff --git a/FFXIVClassic Map Server/actors/director/OpeningDirector.cs b/FFXIVClassic Map Server/actors/director/OpeningDirector.cs index c47f18b5..07ee3a14 100644 --- a/FFXIVClassic Map Server/actors/director/OpeningDirector.cs +++ b/FFXIVClassic Map Server/actors/director/OpeningDirector.cs @@ -1,4 +1,5 @@ -using FFXIVClassic_Map_Server.packets; + +using FFXIVClassic.Common; using FFXIVClassic_Map_Server.Actors; using FFXIVClassic_Map_Server.lua; using FFXIVClassic_Map_Server.packets.send.actor; diff --git a/FFXIVClassic Map Server/actors/director/WeatherDirector.cs b/FFXIVClassic Map Server/actors/director/WeatherDirector.cs index 2ce196f9..4ed53457 100644 --- a/FFXIVClassic Map Server/actors/director/WeatherDirector.cs +++ b/FFXIVClassic Map Server/actors/director/WeatherDirector.cs @@ -1,4 +1,5 @@ -using FFXIVClassic_Map_Server.packets; + +using FFXIVClassic.Common; using FFXIVClassic_Map_Server.actors.director; using FFXIVClassic_Map_Server.lua; using FFXIVClassic_Map_Server.packets.send.actor; diff --git a/FFXIVClassic Map Server/actors/director/quest/QuestDirectorMan0g001.cs b/FFXIVClassic Map Server/actors/director/quest/QuestDirectorMan0g001.cs index a5404dd6..24c11a66 100644 --- a/FFXIVClassic Map Server/actors/director/quest/QuestDirectorMan0g001.cs +++ b/FFXIVClassic Map Server/actors/director/quest/QuestDirectorMan0g001.cs @@ -1,4 +1,5 @@ -using FFXIVClassic_Map_Server.packets; + +using FFXIVClassic.Common; using FFXIVClassic_Map_Server.Actors; using FFXIVClassic_Map_Server.lua; using FFXIVClassic_Map_Server.packets.send.actor; diff --git a/FFXIVClassic Map Server/actors/director/quest/QuestDirectorMan0l001.cs b/FFXIVClassic Map Server/actors/director/quest/QuestDirectorMan0l001.cs index 821bcb86..d415aa17 100644 --- a/FFXIVClassic Map Server/actors/director/quest/QuestDirectorMan0l001.cs +++ b/FFXIVClassic Map Server/actors/director/quest/QuestDirectorMan0l001.cs @@ -1,4 +1,5 @@ -using FFXIVClassic_Map_Server.packets; + +using FFXIVClassic.Common; using FFXIVClassic_Map_Server.Actors; using FFXIVClassic_Map_Server.lua; using FFXIVClassic_Map_Server.packets.send.actor; diff --git a/FFXIVClassic Map Server/actors/director/quest/QuestDirectorMan0u001.cs b/FFXIVClassic Map Server/actors/director/quest/QuestDirectorMan0u001.cs index 1c581b3b..2bf8678b 100644 --- a/FFXIVClassic Map Server/actors/director/quest/QuestDirectorMan0u001.cs +++ b/FFXIVClassic Map Server/actors/director/quest/QuestDirectorMan0u001.cs @@ -1,4 +1,5 @@ -using FFXIVClassic_Map_Server.packets; + +using FFXIVClassic.Common; using FFXIVClassic_Map_Server.Actors; using FFXIVClassic_Map_Server.lua; using FFXIVClassic_Map_Server.packets.send.actor; diff --git a/FFXIVClassic Map Server/actors/world/WorldMaster.cs b/FFXIVClassic Map Server/actors/world/WorldMaster.cs index fd2a4a6a..5174cdfb 100644 --- a/FFXIVClassic Map Server/actors/world/WorldMaster.cs +++ b/FFXIVClassic Map Server/actors/world/WorldMaster.cs @@ -1,4 +1,5 @@ -using FFXIVClassic_Map_Server.packets; + +using FFXIVClassic.Common; using FFXIVClassic_Map_Server.lua; using FFXIVClassic_Map_Server.packets.send.actor; using System.Collections.Generic; diff --git a/FFXIVClassic Map Server/dataobjects/ConnectedPlayer.cs b/FFXIVClassic Map Server/dataobjects/ConnectedPlayer.cs index 6122cbc2..052bec4e 100644 --- a/FFXIVClassic Map Server/dataobjects/ConnectedPlayer.cs +++ b/FFXIVClassic Map Server/dataobjects/ConnectedPlayer.cs @@ -1,6 +1,6 @@ using FFXIVClassic_Map_Server; using FFXIVClassic.Common; -using FFXIVClassic_Map_Server.packets; + using FFXIVClassic_Map_Server.Actors; using FFXIVClassic_Map_Server.lua; using FFXIVClassic_Map_Server.packets.send.actor; @@ -70,7 +70,7 @@ namespace FFXIVClassic_Map_Server.dataobjects } public void QueuePacket(SubPacket subPacket, bool isAuthed, bool isEncrypted) - { + { zoneConnection.QueuePacket(subPacket, isAuthed, isEncrypted); } diff --git a/FFXIVClassic Map Server/lua/LuaEngine.cs b/FFXIVClassic Map Server/lua/LuaEngine.cs index b2f0b3ee..ddbae92a 100644 --- a/FFXIVClassic Map Server/lua/LuaEngine.cs +++ b/FFXIVClassic Map Server/lua/LuaEngine.cs @@ -1,207 +1,208 @@ -using FFXIVClassic_Map_Server.packets; -using FFXIVClassic_Map_Server.actors.director; -using FFXIVClassic_Map_Server.Actors; -using FFXIVClassic_Map_Server.dataobjects; -using FFXIVClassic_Map_Server.packets.receive.events; -using FFXIVClassic_Map_Server.packets.send; -using FFXIVClassic_Map_Server.packets.send.events; -using MoonSharp.Interpreter; -using MoonSharp.Interpreter.Interop; -using MoonSharp.Interpreter.Loaders; -using System; -using System.Collections.Generic; -using System.IO; -using System.Diagnostics; -using FFXIVClassic_Map_Server.lua; - -namespace FFXIVClassic_Map_Server.lua -{ - class LuaEngine - { - const string FILEPATH_PLAYER = "./scripts/player.lua"; - const string FILEPATH_ZONE = "./scripts/zones/{0}/zone.lua"; - const string FILEPATH_COMMANDS = "./scripts/commands/{0}.lua"; - const string FILEPATH_DIRECTORS = "./scripts/directors/{0}.lua"; - const string FILEPATH_NPCS = "./scripts/zones/{0}/npcs/{1}.lua"; - - public LuaEngine() - { - UserData.RegistrationPolicy = InteropRegistrationPolicy.Automatic; - } - - public static List DoActorInstantiate(Player player, Actor target) - { - string luaPath; - - if (target is Npc) - { - luaPath = String.Format(FILEPATH_NPCS, target.zoneId, target.GetName()); - if (File.Exists(luaPath)) - { - LuaScript script = LoadScript(luaPath); - - if (script == null) - return null; - - DynValue result = script.Call(script.Globals["init"], target); - List lparams = LuaUtils.CreateLuaParamList(result); - return lparams; - } - else - { - SendError(player, String.Format("ERROR: Could not find script for actor {0}.", target.GetName())); - return null; - } - } - - return null; + +using FFXIVClassic_Map_Server.actors.director; +using FFXIVClassic_Map_Server.Actors; +using FFXIVClassic_Map_Server.dataobjects; +using FFXIVClassic_Map_Server.packets.receive.events; +using FFXIVClassic_Map_Server.packets.send; +using FFXIVClassic_Map_Server.packets.send.events; +using MoonSharp.Interpreter; +using MoonSharp.Interpreter.Interop; +using MoonSharp.Interpreter.Loaders; +using System; +using System.Collections.Generic; +using System.IO; +using System.Diagnostics; +using FFXIVClassic_Map_Server.lua; +using FFXIVClassic.Common; + +namespace FFXIVClassic_Map_Server.lua +{ + class LuaEngine + { + const string FILEPATH_PLAYER = "./scripts/player.lua"; + const string FILEPATH_ZONE = "./scripts/zones/{0}/zone.lua"; + const string FILEPATH_COMMANDS = "./scripts/commands/{0}.lua"; + const string FILEPATH_DIRECTORS = "./scripts/directors/{0}.lua"; + const string FILEPATH_NPCS = "./scripts/zones/{0}/npcs/{1}.lua"; + + public LuaEngine() + { + UserData.RegistrationPolicy = InteropRegistrationPolicy.Automatic; } - public static Coroutine DoActorOnEventStarted(Player player, Actor target, EventStartPacket eventStart) - { - string luaPath; - - if (target is Command) - { - luaPath = String.Format(FILEPATH_COMMANDS, target.GetName()); - } - else if (target is Director) - { - luaPath = String.Format(FILEPATH_DIRECTORS, target.GetName()); - } - else - luaPath = String.Format(FILEPATH_NPCS, target.zoneId, target.GetName()); - - if (File.Exists(luaPath)) - { - LuaScript script = LoadScript(luaPath); - - if (script == null) - return null; - - if (!script.Globals.Get("onEventStarted").IsNil()) - return script.CreateCoroutine(script.Globals["onEventStarted"]).Coroutine; - else - return null; - } - else - { - SendError(player, String.Format("ERROR: Could not find script for actor {0}.", target.GetName())); - return null; + public static List DoActorInstantiate(Player player, Actor target) + { + string luaPath; + + if (target is Npc) + { + luaPath = String.Format(FILEPATH_NPCS, target.zoneId, target.GetName()); + if (File.Exists(luaPath)) + { + LuaScript script = LoadScript(luaPath); + + if (script == null) + return null; + + DynValue result = script.Call(script.Globals["init"], target); + List lparams = LuaUtils.CreateLuaParamList(result); + return lparams; + } + else + { + SendError(player, String.Format("ERROR: Could not find script for actor {0}.", target.GetName())); + return null; + } } - } - - public static void DoActorOnSpawn(Player player, Npc target) - { - string luaPath = String.Format(FILEPATH_NPCS, target.zoneId, target.GetName()); - - if (File.Exists(luaPath)) - { - LuaScript script = LoadScript(luaPath); - - if (script == null) - return; - - //Run Script - if (!script.Globals.Get("onSpawn").IsNil()) - script.Call(script.Globals["onSpawn"], player, target); - } - else - { - SendError(player, String.Format("ERROR: Could not find script for actor {0}.", target.GetName())); - } - - } - - public static void DoActorOnEventUpdated(Player player, Actor target, EventUpdatePacket eventUpdate) - { - if (target is Npc) - { - ((Npc)target).DoEventUpdate(player, eventUpdate); - return; - } - + return null; + } + + public static Coroutine DoActorOnEventStarted(Player player, Actor target, EventStartPacket eventStart) + { string luaPath; if (target is Command) - luaPath = String.Format(FILEPATH_COMMANDS, target.GetName()); - else if (target is Director) - luaPath = String.Format(FILEPATH_DIRECTORS, target.GetName()); - else - luaPath = String.Format(FILEPATH_NPCS, target.zoneId, target.GetName()); - - if (File.Exists(luaPath)) - { - LuaScript script = LoadScript(luaPath); - - if (script == null) - return; - - //Have to Do this to combine LuaParams - List objects = new List(); - objects.Add(player); - objects.Add(target); - objects.Add(eventUpdate.val2); - objects.AddRange(LuaUtils.CreateLuaParamObjectList(eventUpdate.luaParams)); - - //Run Script - if (!script.Globals.Get("onEventUpdate").IsNil()) - script.Call(script.Globals["onEventUpdate"], objects.ToArray()); - } - else - { - SendError(player, String.Format("ERROR: Could not find script for actor {0}.", target.GetName())); + { + luaPath = String.Format(FILEPATH_COMMANDS, target.GetName()); } - } - - public static void OnZoneIn(Player player) - { + else if (target is Director) + { + luaPath = String.Format(FILEPATH_DIRECTORS, target.GetName()); + } + else + luaPath = String.Format(FILEPATH_NPCS, target.zoneId, target.GetName()); + + if (File.Exists(luaPath)) + { + LuaScript script = LoadScript(luaPath); + + if (script == null) + return null; + + if (!script.Globals.Get("onEventStarted").IsNil()) + return script.CreateCoroutine(script.Globals["onEventStarted"]).Coroutine; + else + return null; + } + else + { + SendError(player, String.Format("ERROR: Could not find script for actor {0}.", target.GetName())); + return null; + } + + } + + public static void DoActorOnSpawn(Player player, Npc target) + { + string luaPath = String.Format(FILEPATH_NPCS, target.zoneId, target.GetName()); + + if (File.Exists(luaPath)) + { + LuaScript script = LoadScript(luaPath); + + if (script == null) + return; + + //Run Script + if (!script.Globals.Get("onSpawn").IsNil()) + script.Call(script.Globals["onSpawn"], player, target); + } + else + { + SendError(player, String.Format("ERROR: Could not find script for actor {0}.", target.GetName())); + } + + } + + public static void DoActorOnEventUpdated(Player player, Actor target, EventUpdatePacket eventUpdate) + { + if (target is Npc) + { + ((Npc)target).DoEventUpdate(player, eventUpdate); + return; + } + + string luaPath; + + if (target is Command) + luaPath = String.Format(FILEPATH_COMMANDS, target.GetName()); + else if (target is Director) + luaPath = String.Format(FILEPATH_DIRECTORS, target.GetName()); + else + luaPath = String.Format(FILEPATH_NPCS, target.zoneId, target.GetName()); + + if (File.Exists(luaPath)) + { + LuaScript script = LoadScript(luaPath); + + if (script == null) + return; + + //Have to Do this to combine LuaParams + List objects = new List(); + objects.Add(player); + objects.Add(target); + objects.Add(eventUpdate.val2); + objects.AddRange(LuaUtils.CreateLuaParamObjectList(eventUpdate.luaParams)); + + //Run Script + if (!script.Globals.Get("onEventUpdate").IsNil()) + script.Call(script.Globals["onEventUpdate"], objects.ToArray()); + } + else + { + SendError(player, String.Format("ERROR: Could not find script for actor {0}.", target.GetName())); + } + } + + public static void OnZoneIn(Player player) + { string luaPath = String.Format(FILEPATH_ZONE, player.GetZone().actorId); - if (File.Exists(luaPath)) - { - LuaScript script = LoadScript(luaPath); - - if (script == null) - return; - - //Run Script - if (!script.Globals.Get("onZoneIn").IsNil()) - script.Call(script.Globals["onZoneIn"], player); + if (File.Exists(luaPath)) + { + LuaScript script = LoadScript(luaPath); + + if (script == null) + return; + + //Run Script + if (!script.Globals.Get("onZoneIn").IsNil()) + script.Call(script.Globals["onZoneIn"], player); } - } - - public static void OnBeginLogin(Player player) - { - if (File.Exists(FILEPATH_PLAYER)) - { - LuaScript script = LoadScript(FILEPATH_PLAYER); - - if (script == null) - return; - - //Run Script - if (!script.Globals.Get("onBeginLogin").IsNil()) - script.Call(script.Globals["onBeginLogin"], player); - } - } - - public static void OnLogin(Player player) - { - if (File.Exists(FILEPATH_PLAYER)) - { - LuaScript script = LoadScript(FILEPATH_PLAYER); - - if (script == null) - return; - - //Run Script - if (!script.Globals.Get("onLogin").IsNil()) - script.Call(script.Globals["onLogin"], player); - } - } - + } + + public static void OnBeginLogin(Player player) + { + if (File.Exists(FILEPATH_PLAYER)) + { + LuaScript script = LoadScript(FILEPATH_PLAYER); + + if (script == null) + return; + + //Run Script + if (!script.Globals.Get("onBeginLogin").IsNil()) + script.Call(script.Globals["onBeginLogin"], player); + } + } + + public static void OnLogin(Player player) + { + if (File.Exists(FILEPATH_PLAYER)) + { + LuaScript script = LoadScript(FILEPATH_PLAYER); + + if (script == null) + return; + + //Run Script + if (!script.Globals.Get("onLogin").IsNil()) + script.Call(script.Globals["onLogin"], player); + } + } + #region RunGMCommand public static void RunGMCommand(Player player, String cmd, string[] param, bool help = false) { @@ -336,22 +337,22 @@ namespace FFXIVClassic_Map_Server.lua LuaScript.Log.Error("LuaEngine.RunGMCommand: Unable to find script {0}", path); return; } - #endregion - - public static LuaScript LoadScript(string filename) - { - LuaScript script = LoadGlobals(); - - try - { - script.DoFile(filename); - } - catch (SyntaxErrorException e) - { - Program.Log.Error("LUAERROR: {0}.", e.DecoratedMessage); - return null; - } - return script; + #endregion + + public static LuaScript LoadScript(string filename) + { + LuaScript script = LoadGlobals(); + + try + { + script.DoFile(filename); + } + catch (SyntaxErrorException e) + { + Program.Log.Error("LUAERROR: {0}.", e.DecoratedMessage); + return null; + } + return script; } public static LuaScript LoadGlobals(LuaScript script = null) @@ -367,57 +368,57 @@ namespace FFXIVClassic_Map_Server.lua script.Options.DebugPrint = s => { Program.Log.Debug(s); }; return script; - } - - public static void SendError(Player player, string message) - { - List SendError = new List(); - SendError.Add(EndEventPacket.BuildPacket(player.actorId, player.currentEventOwner, player.currentEventName)); - player.SendMessage(SendMessagePacket.MESSAGE_TYPE_SYSTEM_ERROR, "", message); - player.playerSession.QueuePacket(BasePacket.CreatePacket(SendError, true, false)); - } - - - internal static void DoDirectorOnTalked(Director director, Player player, Npc npc) - { - string luaPath = String.Format(FILEPATH_DIRECTORS, director.GetName()); - - if (File.Exists(luaPath)) - { - LuaScript script = LoadScript(luaPath); - - if (script == null) - return; - - //Run Script - if (!script.Globals.Get("onTalked").IsNil()) - script.Call(script.Globals["onTalked"], player, npc); - } - else - { - SendError(player, String.Format("ERROR: Could not find script for director {0}.", director.GetName())); - } - } - - internal static void DoDirectorOnCommand(Director director, Player player, Command command) - { - string luaPath = String.Format(FILEPATH_DIRECTORS, director.GetName()); - - if (File.Exists(luaPath)) - { - LuaScript script = LoadScript(luaPath); - - if (script == null) - return; - - //Run Script - if (!script.Globals.Get("onCommand").IsNil()) - script.Call(script.Globals["onCommand"], player, command); - } - else - { - SendError(player, String.Format("ERROR: Could not find script for director {0}.", director.GetName())); - } - } - } -} + } + + public static void SendError(Player player, string message) + { + List SendError = new List(); + SendError.Add(EndEventPacket.BuildPacket(player.actorId, player.currentEventOwner, player.currentEventName)); + player.SendMessage(SendMessagePacket.MESSAGE_TYPE_SYSTEM_ERROR, "", message); + player.playerSession.QueuePacket(BasePacket.CreatePacket(SendError, true, false)); + } + + + internal static void DoDirectorOnTalked(Director director, Player player, Npc npc) + { + string luaPath = String.Format(FILEPATH_DIRECTORS, director.GetName()); + + if (File.Exists(luaPath)) + { + LuaScript script = LoadScript(luaPath); + + if (script == null) + return; + + //Run Script + if (!script.Globals.Get("onTalked").IsNil()) + script.Call(script.Globals["onTalked"], player, npc); + } + else + { + SendError(player, String.Format("ERROR: Could not find script for director {0}.", director.GetName())); + } + } + + internal static void DoDirectorOnCommand(Director director, Player player, Command command) + { + string luaPath = String.Format(FILEPATH_DIRECTORS, director.GetName()); + + if (File.Exists(luaPath)) + { + LuaScript script = LoadScript(luaPath); + + if (script == null) + return; + + //Run Script + if (!script.Globals.Get("onCommand").IsNil()) + script.Call(script.Globals["onCommand"], player, command); + } + else + { + SendError(player, String.Format("ERROR: Could not find script for director {0}.", director.GetName())); + } + } + } +} diff --git a/FFXIVClassic Map Server/packets/send/Actor/ActorDoEmotePacket.cs b/FFXIVClassic Map Server/packets/send/Actor/ActorDoEmotePacket.cs index ee59c7d3..f8af6034 100644 --- a/FFXIVClassic Map Server/packets/send/Actor/ActorDoEmotePacket.cs +++ b/FFXIVClassic Map Server/packets/send/Actor/ActorDoEmotePacket.cs @@ -1,7 +1,9 @@ using System; using System.IO; -namespace FFXIVClassic_Map_Server.packets.send.actor +using FFXIVClassic.Common; + +namespace FFXIVClassic_Map_Server.packets.send.actor { class ActorDoEmotePacket { diff --git a/FFXIVClassic Map Server/packets/send/Actor/ActorInstantiatePacket.cs b/FFXIVClassic Map Server/packets/send/Actor/ActorInstantiatePacket.cs index 14a72cb8..49b50b9f 100644 --- a/FFXIVClassic Map Server/packets/send/Actor/ActorInstantiatePacket.cs +++ b/FFXIVClassic Map Server/packets/send/Actor/ActorInstantiatePacket.cs @@ -4,7 +4,9 @@ using System.Collections.Generic; using System.IO; using System.Text; -namespace FFXIVClassic_Map_Server.packets.send.actor +using FFXIVClassic.Common; + +namespace FFXIVClassic_Map_Server.packets.send.actor { class ActorInstantiatePacket { diff --git a/FFXIVClassic Map Server/packets/send/Actor/ActorSpecialGraphicPacket.cs b/FFXIVClassic Map Server/packets/send/Actor/ActorSpecialGraphicPacket.cs index 2ba4f976..de6fc3de 100644 --- a/FFXIVClassic Map Server/packets/send/Actor/ActorSpecialGraphicPacket.cs +++ b/FFXIVClassic Map Server/packets/send/Actor/ActorSpecialGraphicPacket.cs @@ -1,7 +1,9 @@ using System; using System.IO; -namespace FFXIVClassic_Map_Server.packets.send.actor +using FFXIVClassic.Common; + +namespace FFXIVClassic_Map_Server.packets.send.actor { class SetActorQuestGraphicPacket { diff --git a/FFXIVClassic Map Server/packets/send/Actor/AddActorPacket.cs b/FFXIVClassic Map Server/packets/send/Actor/AddActorPacket.cs index c561e9d4..138fdbe7 100644 --- a/FFXIVClassic Map Server/packets/send/Actor/AddActorPacket.cs +++ b/FFXIVClassic Map Server/packets/send/Actor/AddActorPacket.cs @@ -1,4 +1,8 @@ -namespace FFXIVClassic_Map_Server.packets.send.actor +using FFXIVClassic.Common; + +using FFXIVClassic.Common; + +namespace FFXIVClassic_Map_Server.packets.send.actor { class AddActorPacket { diff --git a/FFXIVClassic Map Server/packets/send/Actor/BattleAction1Packet.cs b/FFXIVClassic Map Server/packets/send/Actor/BattleAction1Packet.cs index e6d61e39..84122ce1 100644 --- a/FFXIVClassic Map Server/packets/send/Actor/BattleAction1Packet.cs +++ b/FFXIVClassic Map Server/packets/send/Actor/BattleAction1Packet.cs @@ -1,6 +1,9 @@ -using System.IO; +using FFXIVClassic.Common; +using System.IO; -namespace FFXIVClassic_Map_Server.packets.send.actor +using FFXIVClassic.Common; + +namespace FFXIVClassic_Map_Server.packets.send.actor { class BattleAction1Packet { diff --git a/FFXIVClassic Map Server/packets/send/Actor/DeleteAllActorsPacket.cs b/FFXIVClassic Map Server/packets/send/Actor/DeleteAllActorsPacket.cs index e4bf1ef1..b2052341 100644 --- a/FFXIVClassic Map Server/packets/send/Actor/DeleteAllActorsPacket.cs +++ b/FFXIVClassic Map Server/packets/send/Actor/DeleteAllActorsPacket.cs @@ -1,4 +1,8 @@ -namespace FFXIVClassic_Map_Server.packets.send.actor +using FFXIVClassic.Common; + +using FFXIVClassic.Common; + +namespace FFXIVClassic_Map_Server.packets.send.actor { class DeleteAllActorsPacket { diff --git a/FFXIVClassic Map Server/packets/send/Actor/MoveActorToPositionPacket.cs b/FFXIVClassic Map Server/packets/send/Actor/MoveActorToPositionPacket.cs index 60e5596a..e807c4d6 100644 --- a/FFXIVClassic Map Server/packets/send/Actor/MoveActorToPositionPacket.cs +++ b/FFXIVClassic Map Server/packets/send/Actor/MoveActorToPositionPacket.cs @@ -1,7 +1,9 @@ using System; using System.IO; -namespace FFXIVClassic_Map_Server.packets.send.actor +using FFXIVClassic.Common; + +namespace FFXIVClassic_Map_Server.packets.send.actor { class MoveActorToPositionPacket { diff --git a/FFXIVClassic Map Server/packets/send/Actor/RemoveActorPacket.cs b/FFXIVClassic Map Server/packets/send/Actor/RemoveActorPacket.cs index 6d612713..9240f53e 100644 --- a/FFXIVClassic Map Server/packets/send/Actor/RemoveActorPacket.cs +++ b/FFXIVClassic Map Server/packets/send/Actor/RemoveActorPacket.cs @@ -1,7 +1,9 @@ using System; using System.IO; -namespace FFXIVClassic_Map_Server.packets.send.actor +using FFXIVClassic.Common; + +namespace FFXIVClassic_Map_Server.packets.send.actor { class RemoveActorPacket { diff --git a/FFXIVClassic Map Server/packets/send/Actor/SetActorAppearancePacket.cs b/FFXIVClassic Map Server/packets/send/Actor/SetActorAppearancePacket.cs index 2769482c..0e4ed34a 100644 --- a/FFXIVClassic Map Server/packets/send/Actor/SetActorAppearancePacket.cs +++ b/FFXIVClassic Map Server/packets/send/Actor/SetActorAppearancePacket.cs @@ -1,6 +1,8 @@ using System.IO; -namespace FFXIVClassic_Map_Server.packets.send.actor +using FFXIVClassic.Common; + +namespace FFXIVClassic_Map_Server.packets.send.actor { class SetActorAppearancePacket { diff --git a/FFXIVClassic Map Server/packets/send/Actor/SetActorIconPacket.cs b/FFXIVClassic Map Server/packets/send/Actor/SetActorIconPacket.cs index 662e6096..6dde6397 100644 --- a/FFXIVClassic Map Server/packets/send/Actor/SetActorIconPacket.cs +++ b/FFXIVClassic Map Server/packets/send/Actor/SetActorIconPacket.cs @@ -1,7 +1,9 @@ using System; using System.IO; -namespace FFXIVClassic_Map_Server.packets.send.actor +using FFXIVClassic.Common; + +namespace FFXIVClassic_Map_Server.packets.send.actor { class SetActorIconPacket { diff --git a/FFXIVClassic Map Server/packets/send/Actor/SetActorIdleAnimationPacket.cs b/FFXIVClassic Map Server/packets/send/Actor/SetActorIdleAnimationPacket.cs index 12341c95..c63c9cbe 100644 --- a/FFXIVClassic Map Server/packets/send/Actor/SetActorIdleAnimationPacket.cs +++ b/FFXIVClassic Map Server/packets/send/Actor/SetActorIdleAnimationPacket.cs @@ -1,7 +1,9 @@ using System; using System.IO; -namespace FFXIVClassic_Map_Server.packets.send.actor +using FFXIVClassic.Common; + +namespace FFXIVClassic_Map_Server.packets.send.actor { class SetActorIdleAnimationPacket { diff --git a/FFXIVClassic Map Server/packets/send/Actor/SetActorIsZoningPacket.cs b/FFXIVClassic Map Server/packets/send/Actor/SetActorIsZoningPacket.cs index 5b46c55b..4dfa29f3 100644 --- a/FFXIVClassic Map Server/packets/send/Actor/SetActorIsZoningPacket.cs +++ b/FFXIVClassic Map Server/packets/send/Actor/SetActorIsZoningPacket.cs @@ -1,4 +1,6 @@ -namespace FFXIVClassic_Map_Server.packets.send.actor +using FFXIVClassic.Common; + +namespace FFXIVClassic_Map_Server.packets.send.actor { class SetActorIsZoningPacket { diff --git a/FFXIVClassic Map Server/packets/send/Actor/SetActorNamePacket.cs b/FFXIVClassic Map Server/packets/send/Actor/SetActorNamePacket.cs index 6036cd4d..9df353ce 100644 --- a/FFXIVClassic Map Server/packets/send/Actor/SetActorNamePacket.cs +++ b/FFXIVClassic Map Server/packets/send/Actor/SetActorNamePacket.cs @@ -2,7 +2,9 @@ using System.IO; using System.Text; -namespace FFXIVClassic_Map_Server.packets.send.actor +using FFXIVClassic.Common; + +namespace FFXIVClassic_Map_Server.packets.send.actor { class SetActorNamePacket { diff --git a/FFXIVClassic Map Server/packets/send/Actor/SetActorPositionPacket.cs b/FFXIVClassic Map Server/packets/send/Actor/SetActorPositionPacket.cs index 7e0012ea..cfb9cf05 100644 --- a/FFXIVClassic Map Server/packets/send/Actor/SetActorPositionPacket.cs +++ b/FFXIVClassic Map Server/packets/send/Actor/SetActorPositionPacket.cs @@ -1,7 +1,9 @@ using System; using System.IO; -namespace FFXIVClassic_Map_Server.packets.send.actor +using FFXIVClassic.Common; + +namespace FFXIVClassic_Map_Server.packets.send.actor { class SetActorPositionPacket { diff --git a/FFXIVClassic Map Server/packets/send/Actor/SetActorPropetyPacket.cs b/FFXIVClassic Map Server/packets/send/Actor/SetActorPropetyPacket.cs index b059f506..a20ccb82 100644 --- a/FFXIVClassic Map Server/packets/send/Actor/SetActorPropetyPacket.cs +++ b/FFXIVClassic Map Server/packets/send/Actor/SetActorPropetyPacket.cs @@ -5,7 +5,9 @@ using System.Linq; using System.Reflection; using System.Text; -namespace FFXIVClassic_Map_Server.packets.send.actor +using FFXIVClassic.Common; + +namespace FFXIVClassic_Map_Server.packets.send.actor { class SetActorPropetyPacket { diff --git a/FFXIVClassic Map Server/packets/send/Actor/SetActorSpeedPacket.cs b/FFXIVClassic Map Server/packets/send/Actor/SetActorSpeedPacket.cs index 5f22942b..009ee086 100644 --- a/FFXIVClassic Map Server/packets/send/Actor/SetActorSpeedPacket.cs +++ b/FFXIVClassic Map Server/packets/send/Actor/SetActorSpeedPacket.cs @@ -1,7 +1,8 @@ -using System; +using FFXIVClassic.Common; +using System; using System.IO; -namespace FFXIVClassic_Map_Server.packets.send.actor +namespace FFXIVClassic_Map_Server.packets.send.actor { class SetActorSpeedPacket { diff --git a/FFXIVClassic Map Server/packets/send/Actor/SetActorStatePacket.cs b/FFXIVClassic Map Server/packets/send/Actor/SetActorStatePacket.cs index bb3a0cc6..356b4f38 100644 --- a/FFXIVClassic Map Server/packets/send/Actor/SetActorStatePacket.cs +++ b/FFXIVClassic Map Server/packets/send/Actor/SetActorStatePacket.cs @@ -1,6 +1,9 @@ -using System; +using FFXIVClassic.Common; +using System; -namespace FFXIVClassic_Map_Server.packets.send.actor +using FFXIVClassic.Common; + +namespace FFXIVClassic_Map_Server.packets.send.actor { class SetActorStatePacket { diff --git a/FFXIVClassic Map Server/packets/send/Actor/SetActorStatusAllPacket.cs b/FFXIVClassic Map Server/packets/send/Actor/SetActorStatusAllPacket.cs index 277dda2b..429096ef 100644 --- a/FFXIVClassic Map Server/packets/send/Actor/SetActorStatusAllPacket.cs +++ b/FFXIVClassic Map Server/packets/send/Actor/SetActorStatusAllPacket.cs @@ -1,7 +1,10 @@ -using System; +using FFXIVClassic.Common; +using System; using System.IO; -namespace FFXIVClassic_Map_Server.packets.send.actor +using FFXIVClassic.Common; + +namespace FFXIVClassic_Map_Server.packets.send.actor { class SetActorStatusAllPacket { diff --git a/FFXIVClassic Map Server/packets/send/Actor/SetActorStatusPacket.cs b/FFXIVClassic Map Server/packets/send/Actor/SetActorStatusPacket.cs index bd148efb..8bd6172d 100644 --- a/FFXIVClassic Map Server/packets/send/Actor/SetActorStatusPacket.cs +++ b/FFXIVClassic Map Server/packets/send/Actor/SetActorStatusPacket.cs @@ -1,7 +1,10 @@ -using System; +using FFXIVClassic.Common; +using System; using System.IO; -namespace FFXIVClassic_Map_Server.packets.send.actor +using FFXIVClassic.Common; + +namespace FFXIVClassic_Map_Server.packets.send.actor { class SetActorStatusPacket { diff --git a/FFXIVClassic Map Server/packets/send/Actor/SetActorTargetAnimatedPacket.cs b/FFXIVClassic Map Server/packets/send/Actor/SetActorTargetAnimatedPacket.cs index ebc77e0d..f2f86d75 100644 --- a/FFXIVClassic Map Server/packets/send/Actor/SetActorTargetAnimatedPacket.cs +++ b/FFXIVClassic Map Server/packets/send/Actor/SetActorTargetAnimatedPacket.cs @@ -1,6 +1,8 @@ using System; -namespace FFXIVClassic_Map_Server.packets.send.actor +using FFXIVClassic.Common; + +namespace FFXIVClassic_Map_Server.packets.send.actor { class SetActorTargetAnimatedPacket { diff --git a/FFXIVClassic Map Server/packets/send/Actor/SetActorTargetPacket.cs b/FFXIVClassic Map Server/packets/send/Actor/SetActorTargetPacket.cs index 645209cc..cd2e86e6 100644 --- a/FFXIVClassic Map Server/packets/send/Actor/SetActorTargetPacket.cs +++ b/FFXIVClassic Map Server/packets/send/Actor/SetActorTargetPacket.cs @@ -1,4 +1,5 @@ -using System; +using FFXIVClassic.Common; +using System; namespace FFXIVClassic_Map_Server.packets.send.actor { diff --git a/FFXIVClassic Map Server/packets/send/Actor/_0x132Packet.cs b/FFXIVClassic Map Server/packets/send/Actor/_0x132Packet.cs index 066cb231..b0f8bb89 100644 --- a/FFXIVClassic Map Server/packets/send/Actor/_0x132Packet.cs +++ b/FFXIVClassic Map Server/packets/send/Actor/_0x132Packet.cs @@ -1,8 +1,10 @@ -using System; +using FFXIVClassic.Common; +using System; using System.IO; using System.Text; -namespace FFXIVClassic_Map_Server.packets.send.actor +using FFXIVClassic.Common; +namespace FFXIVClassic_Map_Server.packets.send.actor { class _0x132Packet { diff --git a/FFXIVClassic Map Server/packets/send/Actor/_0xFPacket.cs b/FFXIVClassic Map Server/packets/send/Actor/_0xFPacket.cs index 7fe72cae..2f54191d 100644 --- a/FFXIVClassic Map Server/packets/send/Actor/_0xFPacket.cs +++ b/FFXIVClassic Map Server/packets/send/Actor/_0xFPacket.cs @@ -1,6 +1,8 @@ using System.IO; -namespace FFXIVClassic_Map_Server.packets.send.actor +using FFXIVClassic.Common; + +namespace FFXIVClassic_Map_Server.packets.send.actor { class _0xFPacket { diff --git a/FFXIVClassic Map Server/packets/send/Actor/battle/BattleAction.cs b/FFXIVClassic Map Server/packets/send/Actor/battle/BattleAction.cs index 71bf867b..e1958bf9 100644 --- a/FFXIVClassic Map Server/packets/send/Actor/battle/BattleAction.cs +++ b/FFXIVClassic Map Server/packets/send/Actor/battle/BattleAction.cs @@ -1,4 +1,6 @@ -namespace FFXIVClassic_Map_Server.packets.send.actor.battle +using FFXIVClassic.Common; + +namespace FFXIVClassic_Map_Server.packets.send.actor.battle { class BattleAction { diff --git a/FFXIVClassic Map Server/packets/send/Actor/battle/BattleActionX00Packet.cs b/FFXIVClassic Map Server/packets/send/Actor/battle/BattleActionX00Packet.cs index 30995408..ba3f8b2e 100644 --- a/FFXIVClassic Map Server/packets/send/Actor/battle/BattleActionX00Packet.cs +++ b/FFXIVClassic Map Server/packets/send/Actor/battle/BattleActionX00Packet.cs @@ -1,7 +1,10 @@ -using System; +using FFXIVClassic.Common; +using System; using System.IO; -namespace FFXIVClassic_Map_Server.packets.send.actor.battle +using FFXIVClassic.Common; + +namespace FFXIVClassic_Map_Server.packets.send.actor.battle { class BattleActionX00Packet { diff --git a/FFXIVClassic Map Server/packets/send/Actor/battle/BattleActionX01Packet.cs b/FFXIVClassic Map Server/packets/send/Actor/battle/BattleActionX01Packet.cs index 0a90d960..17efb745 100644 --- a/FFXIVClassic Map Server/packets/send/Actor/battle/BattleActionX01Packet.cs +++ b/FFXIVClassic Map Server/packets/send/Actor/battle/BattleActionX01Packet.cs @@ -1,7 +1,10 @@ -using System; +using FFXIVClassic.Common; +using System; using System.IO; -namespace FFXIVClassic_Map_Server.packets.send.actor.battle +using FFXIVClassic.Common; + +namespace FFXIVClassic_Map_Server.packets.send.actor.battle { class BattleActionX01Packet { diff --git a/FFXIVClassic Map Server/packets/send/Actor/battle/BattleActionX10Packet.cs b/FFXIVClassic Map Server/packets/send/Actor/battle/BattleActionX10Packet.cs index 67775962..45884b14 100644 --- a/FFXIVClassic Map Server/packets/send/Actor/battle/BattleActionX10Packet.cs +++ b/FFXIVClassic Map Server/packets/send/Actor/battle/BattleActionX10Packet.cs @@ -1,7 +1,10 @@ -using System; +using FFXIVClassic.Common; +using System; using System.IO; -namespace FFXIVClassic_Map_Server.packets.send.actor.battle +using FFXIVClassic.Common; + +namespace FFXIVClassic_Map_Server.packets.send.actor.battle { class BattleActionX10Packet { diff --git a/FFXIVClassic Map Server/packets/send/Actor/battle/BattleActionX18Packet.cs b/FFXIVClassic Map Server/packets/send/Actor/battle/BattleActionX18Packet.cs index 38038ab3..8f8e8fdd 100644 --- a/FFXIVClassic Map Server/packets/send/Actor/battle/BattleActionX18Packet.cs +++ b/FFXIVClassic Map Server/packets/send/Actor/battle/BattleActionX18Packet.cs @@ -1,7 +1,10 @@ -using System; +using FFXIVClassic.Common; +using System; using System.IO; -namespace FFXIVClassic_Map_Server.packets.send.actor.battle +using FFXIVClassic.Common; + +namespace FFXIVClassic_Map_Server.packets.send.actor.battle { class BattleActionX18Packet { diff --git a/FFXIVClassic Map Server/packets/send/Actor/events/SetEmoteEventCondition.cs b/FFXIVClassic Map Server/packets/send/Actor/events/SetEmoteEventCondition.cs index dc98bab6..f23866c2 100644 --- a/FFXIVClassic Map Server/packets/send/Actor/events/SetEmoteEventCondition.cs +++ b/FFXIVClassic Map Server/packets/send/Actor/events/SetEmoteEventCondition.cs @@ -1,9 +1,12 @@ -using FFXIVClassic_Map_Server.actors; +using FFXIVClassic.Common; +using FFXIVClassic_Map_Server.actors; using System; using System.IO; using System.Text; -namespace FFXIVClassic_Map_Server.packets.send.actor.events +using FFXIVClassic.Common; + +namespace FFXIVClassic_Map_Server.packets.send.actor.events { class SetEmoteEventCondition { diff --git a/FFXIVClassic Map Server/packets/send/Actor/events/SetEventStatus.cs b/FFXIVClassic Map Server/packets/send/Actor/events/SetEventStatus.cs index 4867950a..c86d3a0f 100644 --- a/FFXIVClassic Map Server/packets/send/Actor/events/SetEventStatus.cs +++ b/FFXIVClassic Map Server/packets/send/Actor/events/SetEventStatus.cs @@ -2,7 +2,9 @@ using System.IO; using System.Text; -namespace FFXIVClassic_Map_Server.packets.send.actor.events +using FFXIVClassic.Common; + +namespace FFXIVClassic_Map_Server.packets.send.actor.events { class SetEventStatus { diff --git a/FFXIVClassic Map Server/packets/send/Actor/events/SetNoticeEventCondition.cs b/FFXIVClassic Map Server/packets/send/Actor/events/SetNoticeEventCondition.cs index 04099db3..f6ed17d4 100644 --- a/FFXIVClassic Map Server/packets/send/Actor/events/SetNoticeEventCondition.cs +++ b/FFXIVClassic Map Server/packets/send/Actor/events/SetNoticeEventCondition.cs @@ -3,7 +3,9 @@ using System; using System.IO; using System.Text; -namespace FFXIVClassic_Map_Server.packets.send.actor.events +using FFXIVClassic.Common; + +namespace FFXIVClassic_Map_Server.packets.send.actor.events { class SetNoticeEventCondition { diff --git a/FFXIVClassic Map Server/packets/send/Actor/events/SetPushEventConditionWithCircle.cs b/FFXIVClassic Map Server/packets/send/Actor/events/SetPushEventConditionWithCircle.cs index 7b55dbd1..a093788a 100644 --- a/FFXIVClassic Map Server/packets/send/Actor/events/SetPushEventConditionWithCircle.cs +++ b/FFXIVClassic Map Server/packets/send/Actor/events/SetPushEventConditionWithCircle.cs @@ -3,7 +3,9 @@ using System; using System.IO; using System.Text; -namespace FFXIVClassic_Map_Server.packets.send.actor.events +using FFXIVClassic.Common; + +namespace FFXIVClassic_Map_Server.packets.send.actor.events { class SetPushEventConditionWithCircle { diff --git a/FFXIVClassic Map Server/packets/send/Actor/events/SetPushEventConditionWithFan.cs b/FFXIVClassic Map Server/packets/send/Actor/events/SetPushEventConditionWithFan.cs index 3d81c625..8b070ea7 100644 --- a/FFXIVClassic Map Server/packets/send/Actor/events/SetPushEventConditionWithFan.cs +++ b/FFXIVClassic Map Server/packets/send/Actor/events/SetPushEventConditionWithFan.cs @@ -3,7 +3,9 @@ using System; using System.IO; using System.Text; -namespace FFXIVClassic_Map_Server.packets.send.actor.events +using FFXIVClassic.Common; + +namespace FFXIVClassic_Map_Server.packets.send.actor.events { class SetPushEventConditionWithFan { diff --git a/FFXIVClassic Map Server/packets/send/Actor/events/SetPushEventConditionWithTriggerBox.cs b/FFXIVClassic Map Server/packets/send/Actor/events/SetPushEventConditionWithTriggerBox.cs index 97a0ffd2..810ca88d 100644 --- a/FFXIVClassic Map Server/packets/send/Actor/events/SetPushEventConditionWithTriggerBox.cs +++ b/FFXIVClassic Map Server/packets/send/Actor/events/SetPushEventConditionWithTriggerBox.cs @@ -3,7 +3,9 @@ using System; using System.IO; using System.Text; -namespace FFXIVClassic_Map_Server.packets.send.actor.events +using FFXIVClassic.Common; + +namespace FFXIVClassic_Map_Server.packets.send.actor.events { class SetPushEventConditionWithTriggerBox { diff --git a/FFXIVClassic Map Server/packets/send/Actor/events/SetTalkEventCondition.cs b/FFXIVClassic Map Server/packets/send/Actor/events/SetTalkEventCondition.cs index 4616cbd9..f3b47bfd 100644 --- a/FFXIVClassic Map Server/packets/send/Actor/events/SetTalkEventCondition.cs +++ b/FFXIVClassic Map Server/packets/send/Actor/events/SetTalkEventCondition.cs @@ -3,7 +3,9 @@ using System; using System.IO; using System.Text; -namespace FFXIVClassic_Map_Server.packets.send.actor.events +using FFXIVClassic.Common; + +namespace FFXIVClassic_Map_Server.packets.send.actor.events { class SetTalkEventCondition { diff --git a/FFXIVClassic Map Server/packets/send/Actor/inventory/EquipmentListX01Packet.cs b/FFXIVClassic Map Server/packets/send/Actor/inventory/EquipmentListX01Packet.cs index 364c575c..616c4cbd 100644 --- a/FFXIVClassic Map Server/packets/send/Actor/inventory/EquipmentListX01Packet.cs +++ b/FFXIVClassic Map Server/packets/send/Actor/inventory/EquipmentListX01Packet.cs @@ -1,7 +1,9 @@ using System; using System.IO; -namespace FFXIVClassic_Map_Server.packets.send.Actor.inventory +using FFXIVClassic.Common; + +namespace FFXIVClassic_Map_Server.packets.send.actor.inventory { class EquipmentListX01Packet { diff --git a/FFXIVClassic Map Server/packets/send/Actor/inventory/EquipmentListX08Packet.cs b/FFXIVClassic Map Server/packets/send/Actor/inventory/EquipmentListX08Packet.cs index ccf67e65..bf8a5d25 100644 --- a/FFXIVClassic Map Server/packets/send/Actor/inventory/EquipmentListX08Packet.cs +++ b/FFXIVClassic Map Server/packets/send/Actor/inventory/EquipmentListX08Packet.cs @@ -3,7 +3,9 @@ using System; using System.Collections.Generic; using System.IO; -namespace FFXIVClassic_Map_Server.packets.send.Actor.inventory +using FFXIVClassic.Common; + +namespace FFXIVClassic_Map_Server.packets.send.actor.inventory { class EquipmentListX08Packet { diff --git a/FFXIVClassic Map Server/packets/send/Actor/inventory/EquipmentListX16Packet.cs b/FFXIVClassic Map Server/packets/send/Actor/inventory/EquipmentListX16Packet.cs index 5fc79272..0eeea6ee 100644 --- a/FFXIVClassic Map Server/packets/send/Actor/inventory/EquipmentListX16Packet.cs +++ b/FFXIVClassic Map Server/packets/send/Actor/inventory/EquipmentListX16Packet.cs @@ -3,7 +3,9 @@ using System; using System.Collections.Generic; using System.IO; -namespace FFXIVClassic_Map_Server.packets.send.Actor.inventory +using FFXIVClassic.Common; + +namespace FFXIVClassic_Map_Server.packets.send.actor.inventory { class EquipmentListX16Packet { diff --git a/FFXIVClassic Map Server/packets/send/Actor/inventory/EquipmentListX32Packet.cs b/FFXIVClassic Map Server/packets/send/Actor/inventory/EquipmentListX32Packet.cs index c6dde267..ca882b09 100644 --- a/FFXIVClassic Map Server/packets/send/Actor/inventory/EquipmentListX32Packet.cs +++ b/FFXIVClassic Map Server/packets/send/Actor/inventory/EquipmentListX32Packet.cs @@ -3,7 +3,9 @@ using System; using System.Collections.Generic; using System.IO; -namespace FFXIVClassic_Map_Server.packets.send.Actor.inventory +using FFXIVClassic.Common; + +namespace FFXIVClassic_Map_Server.packets.send.actor.inventory { class EquipmentListX32Packet { diff --git a/FFXIVClassic Map Server/packets/send/Actor/inventory/EquipmentListX64Packet.cs b/FFXIVClassic Map Server/packets/send/Actor/inventory/EquipmentListX64Packet.cs index 309f2cf5..9f48eb35 100644 --- a/FFXIVClassic Map Server/packets/send/Actor/inventory/EquipmentListX64Packet.cs +++ b/FFXIVClassic Map Server/packets/send/Actor/inventory/EquipmentListX64Packet.cs @@ -3,7 +3,9 @@ using System; using System.Collections.Generic; using System.IO; -namespace FFXIVClassic_Map_Server.packets.send.Actor.inventory +using FFXIVClassic.Common; + +namespace FFXIVClassic_Map_Server.packets.send.actor.inventory { class EquipmentListX64Packet { diff --git a/FFXIVClassic Map Server/packets/send/Actor/inventory/InventoryBeginChangePacket.cs b/FFXIVClassic Map Server/packets/send/Actor/inventory/InventoryBeginChangePacket.cs index 4df15032..ab6183c8 100644 --- a/FFXIVClassic Map Server/packets/send/Actor/inventory/InventoryBeginChangePacket.cs +++ b/FFXIVClassic Map Server/packets/send/Actor/inventory/InventoryBeginChangePacket.cs @@ -1,4 +1,6 @@ -namespace FFXIVClassic_Map_Server.packets.send.Actor.inventory +using FFXIVClassic.Common; + +namespace FFXIVClassic_Map_Server.packets.send.actor.inventory { class InventoryBeginChangePacket { diff --git a/FFXIVClassic Map Server/packets/send/Actor/inventory/InventoryEndChangePacket.cs b/FFXIVClassic Map Server/packets/send/Actor/inventory/InventoryEndChangePacket.cs index c6944676..24499b25 100644 --- a/FFXIVClassic Map Server/packets/send/Actor/inventory/InventoryEndChangePacket.cs +++ b/FFXIVClassic Map Server/packets/send/Actor/inventory/InventoryEndChangePacket.cs @@ -1,4 +1,6 @@ -namespace FFXIVClassic_Map_Server.packets.send.Actor.inventory +using FFXIVClassic.Common; + +namespace FFXIVClassic_Map_Server.packets.send.actor.inventory { class InventoryEndChangePacket { diff --git a/FFXIVClassic Map Server/packets/send/Actor/inventory/InventoryItemEndPacket.cs b/FFXIVClassic Map Server/packets/send/Actor/inventory/InventoryItemEndPacket.cs index d1665120..107a3e79 100644 --- a/FFXIVClassic Map Server/packets/send/Actor/inventory/InventoryItemEndPacket.cs +++ b/FFXIVClassic Map Server/packets/send/Actor/inventory/InventoryItemEndPacket.cs @@ -2,7 +2,9 @@ using System.Collections.Generic; using System.IO; -namespace FFXIVClassic_Map_Server.packets.send.Actor.inventory +using FFXIVClassic.Common; + +namespace FFXIVClassic_Map_Server.packets.send.actor.inventory { class InventoryItemEndPacket { diff --git a/FFXIVClassic Map Server/packets/send/Actor/inventory/InventoryItemPacket.cs b/FFXIVClassic Map Server/packets/send/Actor/inventory/InventoryItemPacket.cs index 75cdd97d..9a35e8e0 100644 --- a/FFXIVClassic Map Server/packets/send/Actor/inventory/InventoryItemPacket.cs +++ b/FFXIVClassic Map Server/packets/send/Actor/inventory/InventoryItemPacket.cs @@ -2,7 +2,9 @@ using System.Collections.Generic; using System.IO; -namespace FFXIVClassic_Map_Server.packets.send.Actor.inventory +using FFXIVClassic.Common; + +namespace FFXIVClassic_Map_Server.packets.send.actor.inventory { class InventoryItemPacket { diff --git a/FFXIVClassic Map Server/packets/send/Actor/inventory/InventoryListX01Packet.cs b/FFXIVClassic Map Server/packets/send/Actor/inventory/InventoryListX01Packet.cs index 5d4db4fe..964e02a4 100644 --- a/FFXIVClassic Map Server/packets/send/Actor/inventory/InventoryListX01Packet.cs +++ b/FFXIVClassic Map Server/packets/send/Actor/inventory/InventoryListX01Packet.cs @@ -1,7 +1,9 @@ using FFXIVClassic_Map_Server.dataobjects; using System.IO; -namespace FFXIVClassic_Map_Server.packets.send.actor.inventory +using FFXIVClassic.Common; + +namespace FFXIVClassic_Map_Server.packets.send.actor.inventory { class InventoryListX01Packet { diff --git a/FFXIVClassic Map Server/packets/send/Actor/inventory/InventoryListX08Packet.cs b/FFXIVClassic Map Server/packets/send/Actor/inventory/InventoryListX08Packet.cs index b136429c..448c9f3a 100644 --- a/FFXIVClassic Map Server/packets/send/Actor/inventory/InventoryListX08Packet.cs +++ b/FFXIVClassic Map Server/packets/send/Actor/inventory/InventoryListX08Packet.cs @@ -3,7 +3,9 @@ using System; using System.Collections.Generic; using System.IO; -namespace FFXIVClassic_Map_Server.packets.send.actor.inventory +using FFXIVClassic.Common; + +namespace FFXIVClassic_Map_Server.packets.send.actor.inventory { class InventoryListX08Packet { diff --git a/FFXIVClassic Map Server/packets/send/Actor/inventory/InventoryListX16Packet.cs b/FFXIVClassic Map Server/packets/send/Actor/inventory/InventoryListX16Packet.cs index 31cf4cc4..6c406bf9 100644 --- a/FFXIVClassic Map Server/packets/send/Actor/inventory/InventoryListX16Packet.cs +++ b/FFXIVClassic Map Server/packets/send/Actor/inventory/InventoryListX16Packet.cs @@ -2,7 +2,9 @@ using System.Collections.Generic; using System.IO; -namespace FFXIVClassic_Map_Server.packets.send.actor.inventory +using FFXIVClassic.Common; + +namespace FFXIVClassic_Map_Server.packets.send.actor.inventory { class InventoryListX16Packet { diff --git a/FFXIVClassic Map Server/packets/send/Actor/inventory/InventoryListX32Packet.cs b/FFXIVClassic Map Server/packets/send/Actor/inventory/InventoryListX32Packet.cs index 58e1c9c8..b9dd9dd3 100644 --- a/FFXIVClassic Map Server/packets/send/Actor/inventory/InventoryListX32Packet.cs +++ b/FFXIVClassic Map Server/packets/send/Actor/inventory/InventoryListX32Packet.cs @@ -2,7 +2,9 @@ using System.Collections.Generic; using System.IO; -namespace FFXIVClassic_Map_Server.packets.send.actor.inventory +using FFXIVClassic.Common; + +namespace FFXIVClassic_Map_Server.packets.send.actor.inventory { class InventoryListX32Packet { diff --git a/FFXIVClassic Map Server/packets/send/Actor/inventory/InventoryListX64Packet.cs b/FFXIVClassic Map Server/packets/send/Actor/inventory/InventoryListX64Packet.cs index 7599f309..c1c05da0 100644 --- a/FFXIVClassic Map Server/packets/send/Actor/inventory/InventoryListX64Packet.cs +++ b/FFXIVClassic Map Server/packets/send/Actor/inventory/InventoryListX64Packet.cs @@ -2,7 +2,9 @@ using System.Collections.Generic; using System.IO; -namespace FFXIVClassic_Map_Server.packets.send.actor.inventory +using FFXIVClassic.Common; + +namespace FFXIVClassic_Map_Server.packets.send.actor.inventory { class InventoryListX64Packet { diff --git a/FFXIVClassic Map Server/packets/send/Actor/inventory/InventoryRemoveX01Packet.cs b/FFXIVClassic Map Server/packets/send/Actor/inventory/InventoryRemoveX01Packet.cs index e210bacb..cc16251a 100644 --- a/FFXIVClassic Map Server/packets/send/Actor/inventory/InventoryRemoveX01Packet.cs +++ b/FFXIVClassic Map Server/packets/send/Actor/inventory/InventoryRemoveX01Packet.cs @@ -1,7 +1,9 @@ using System; using System.IO; -namespace FFXIVClassic_Map_Server.packets.send.Actor.inventory +using FFXIVClassic.Common; + +namespace FFXIVClassic_Map_Server.packets.send.actor.inventory { class InventoryRemoveX01Packet { diff --git a/FFXIVClassic Map Server/packets/send/Actor/inventory/InventoryRemoveX08Packet.cs b/FFXIVClassic Map Server/packets/send/Actor/inventory/InventoryRemoveX08Packet.cs index 54f9cfa4..2dd988b2 100644 --- a/FFXIVClassic Map Server/packets/send/Actor/inventory/InventoryRemoveX08Packet.cs +++ b/FFXIVClassic Map Server/packets/send/Actor/inventory/InventoryRemoveX08Packet.cs @@ -1,8 +1,11 @@ -using System; +using FFXIVClassic.Common; +using System; using System.Collections.Generic; using System.IO; -namespace FFXIVClassic_Map_Server.packets.send.Actor.inventory +using FFXIVClassic.Common; + +namespace FFXIVClassic_Map_Server.packets.send.actor.inventory { class InventoryRemoveX08Packet { diff --git a/FFXIVClassic Map Server/packets/send/Actor/inventory/InventoryRemoveX16Packet.cs b/FFXIVClassic Map Server/packets/send/Actor/inventory/InventoryRemoveX16Packet.cs index e47e0e95..b54820c0 100644 --- a/FFXIVClassic Map Server/packets/send/Actor/inventory/InventoryRemoveX16Packet.cs +++ b/FFXIVClassic Map Server/packets/send/Actor/inventory/InventoryRemoveX16Packet.cs @@ -2,7 +2,9 @@ using System.Collections.Generic; using System.IO; -namespace FFXIVClassic_Map_Server.packets.send.Actor.inventory +using FFXIVClassic.Common; + +namespace FFXIVClassic_Map_Server.packets.send.actor.inventory { class InventoryRemoveX16Packet { diff --git a/FFXIVClassic Map Server/packets/send/Actor/inventory/InventoryRemoveX32Packet.cs b/FFXIVClassic Map Server/packets/send/Actor/inventory/InventoryRemoveX32Packet.cs index 6af8c465..ebb568cd 100644 --- a/FFXIVClassic Map Server/packets/send/Actor/inventory/InventoryRemoveX32Packet.cs +++ b/FFXIVClassic Map Server/packets/send/Actor/inventory/InventoryRemoveX32Packet.cs @@ -2,7 +2,9 @@ using System.Collections.Generic; using System.IO; -namespace FFXIVClassic_Map_Server.packets.send.Actor.inventory +using FFXIVClassic.Common; + +namespace FFXIVClassic_Map_Server.packets.send.actor.inventory { class InventoryRemoveX32Packet { diff --git a/FFXIVClassic Map Server/packets/send/Actor/inventory/InventoryRemoveX64Packet.cs b/FFXIVClassic Map Server/packets/send/Actor/inventory/InventoryRemoveX64Packet.cs index b6d7a3b5..208ccbe1 100644 --- a/FFXIVClassic Map Server/packets/send/Actor/inventory/InventoryRemoveX64Packet.cs +++ b/FFXIVClassic Map Server/packets/send/Actor/inventory/InventoryRemoveX64Packet.cs @@ -2,7 +2,9 @@ using System.Collections.Generic; using System.IO; -namespace FFXIVClassic_Map_Server.packets.send.Actor.inventory +using FFXIVClassic.Common; + +namespace FFXIVClassic_Map_Server.packets.send.actor.inventory { class InventoryRemoveX64Packet { diff --git a/FFXIVClassic Map Server/packets/send/Actor/inventory/InventorySetBeginPacket.cs b/FFXIVClassic Map Server/packets/send/Actor/inventory/InventorySetBeginPacket.cs index 707f9ca1..74af503d 100644 --- a/FFXIVClassic Map Server/packets/send/Actor/inventory/InventorySetBeginPacket.cs +++ b/FFXIVClassic Map Server/packets/send/Actor/inventory/InventorySetBeginPacket.cs @@ -1,7 +1,9 @@ using System; using System.IO; -namespace FFXIVClassic_Map_Server.packets.send.Actor.inventory +using FFXIVClassic.Common; + +namespace FFXIVClassic_Map_Server.packets.send.actor.inventory { class InventorySetBeginPacket { diff --git a/FFXIVClassic Map Server/packets/send/Actor/inventory/InventorySetEndPacket.cs b/FFXIVClassic Map Server/packets/send/Actor/inventory/InventorySetEndPacket.cs index 29da7459..5a7952d2 100644 --- a/FFXIVClassic Map Server/packets/send/Actor/inventory/InventorySetEndPacket.cs +++ b/FFXIVClassic Map Server/packets/send/Actor/inventory/InventorySetEndPacket.cs @@ -1,4 +1,6 @@ -namespace FFXIVClassic_Map_Server.packets.send.Actor.inventory +using FFXIVClassic.Common; + +namespace FFXIVClassic_Map_Server.packets.send.actor.inventory { class InventorySetEndPacket { diff --git a/FFXIVClassic Map Server/packets/send/GameMessagePacket.cs b/FFXIVClassic Map Server/packets/send/GameMessagePacket.cs index 9524bae1..cffe2a37 100644 --- a/FFXIVClassic Map Server/packets/send/GameMessagePacket.cs +++ b/FFXIVClassic Map Server/packets/send/GameMessagePacket.cs @@ -4,6 +4,8 @@ using System.Collections.Generic; using System.IO; using System.Text; +using FFXIVClassic.Common; + namespace FFXIVClassic_Map_Server.packets.send { class GameMessagePacket diff --git a/FFXIVClassic Map Server/packets/send/LogoutPacket.cs b/FFXIVClassic Map Server/packets/send/LogoutPacket.cs index cd8babaf..2348a24a 100644 --- a/FFXIVClassic Map Server/packets/send/LogoutPacket.cs +++ b/FFXIVClassic Map Server/packets/send/LogoutPacket.cs @@ -1,4 +1,6 @@ -namespace FFXIVClassic_Map_Server.packets.send +using FFXIVClassic.Common; + +namespace FFXIVClassic_Map_Server.packets.send { class LogoutPacket { diff --git a/FFXIVClassic Map Server/packets/send/PongPacket.cs b/FFXIVClassic Map Server/packets/send/PongPacket.cs index 695116b9..477e0915 100644 --- a/FFXIVClassic Map Server/packets/send/PongPacket.cs +++ b/FFXIVClassic Map Server/packets/send/PongPacket.cs @@ -1,4 +1,5 @@ -using System; +using FFXIVClassic.Common; +using System; using System.IO; namespace FFXIVClassic_Map_Server.packets.receive diff --git a/FFXIVClassic Map Server/packets/send/QuitPacket.cs b/FFXIVClassic Map Server/packets/send/QuitPacket.cs index b10c9e24..ccdddc74 100644 --- a/FFXIVClassic Map Server/packets/send/QuitPacket.cs +++ b/FFXIVClassic Map Server/packets/send/QuitPacket.cs @@ -1,4 +1,6 @@ -namespace FFXIVClassic_Map_Server.packets.send +using FFXIVClassic.Common; + +namespace FFXIVClassic_Map_Server.packets.send { class QuitPacket { diff --git a/FFXIVClassic Map Server/packets/send/SendMessagePacket.cs b/FFXIVClassic Map Server/packets/send/SendMessagePacket.cs index 6152f215..5fa97c71 100644 --- a/FFXIVClassic Map Server/packets/send/SendMessagePacket.cs +++ b/FFXIVClassic Map Server/packets/send/SendMessagePacket.cs @@ -2,6 +2,8 @@ using System.IO; using System.Text; +using FFXIVClassic.Common; + namespace FFXIVClassic_Map_Server.packets.send { class SendMessagePacket diff --git a/FFXIVClassic Map Server/packets/send/SetMapPacket.cs b/FFXIVClassic Map Server/packets/send/SetMapPacket.cs index 797b8199..86ff5236 100644 --- a/FFXIVClassic Map Server/packets/send/SetMapPacket.cs +++ b/FFXIVClassic Map Server/packets/send/SetMapPacket.cs @@ -1,5 +1,7 @@ using System.IO; +using FFXIVClassic.Common; + namespace FFXIVClassic_Map_Server.packets.send { class SetMapPacket diff --git a/FFXIVClassic Map Server/packets/send/SetMusicPacket.cs b/FFXIVClassic Map Server/packets/send/SetMusicPacket.cs index 08a66521..dfe477b1 100644 --- a/FFXIVClassic Map Server/packets/send/SetMusicPacket.cs +++ b/FFXIVClassic Map Server/packets/send/SetMusicPacket.cs @@ -1,5 +1,7 @@ using System; +using FFXIVClassic.Common; + namespace FFXIVClassic_Map_Server.packets.send { class SetMusicPacket diff --git a/FFXIVClassic Map Server/packets/send/SetWeatherPacket.cs b/FFXIVClassic Map Server/packets/send/SetWeatherPacket.cs index cce963f3..93d1f425 100644 --- a/FFXIVClassic Map Server/packets/send/SetWeatherPacket.cs +++ b/FFXIVClassic Map Server/packets/send/SetWeatherPacket.cs @@ -1,5 +1,7 @@ using System; +using FFXIVClassic.Common; + namespace FFXIVClassic_Map_Server.packets.send { class SetWeatherPacket diff --git a/FFXIVClassic Map Server/packets/send/_0x02Packet.cs b/FFXIVClassic Map Server/packets/send/_0x02Packet.cs index 0f627e35..3e91afd5 100644 --- a/FFXIVClassic Map Server/packets/send/_0x02Packet.cs +++ b/FFXIVClassic Map Server/packets/send/_0x02Packet.cs @@ -1,6 +1,8 @@ using System; using System.IO; +using FFXIVClassic.Common; + namespace FFXIVClassic_Map_Server.packets.send { class _0x02Packet diff --git a/FFXIVClassic Map Server/packets/send/_0x10Packet.cs b/FFXIVClassic Map Server/packets/send/_0x10Packet.cs index e0f229c2..d04f8154 100644 --- a/FFXIVClassic Map Server/packets/send/_0x10Packet.cs +++ b/FFXIVClassic Map Server/packets/send/_0x10Packet.cs @@ -1,6 +1,8 @@ using System; using System.IO; +using FFXIVClassic.Common; + namespace FFXIVClassic_Map_Server.packets.send { class _0x10Packet diff --git a/FFXIVClassic Map Server/packets/send/_0xE2Packet.cs b/FFXIVClassic Map Server/packets/send/_0xE2Packet.cs index 0ad9b340..1602f4cf 100644 --- a/FFXIVClassic Map Server/packets/send/_0xE2Packet.cs +++ b/FFXIVClassic Map Server/packets/send/_0xE2Packet.cs @@ -1,5 +1,7 @@ using System; +using FFXIVClassic.Common; + namespace FFXIVClassic_Map_Server.packets.send { class _0xE2Packet diff --git a/FFXIVClassic Map Server/packets/send/events/EndEventPacket.cs b/FFXIVClassic Map Server/packets/send/events/EndEventPacket.cs index 29facf3d..ddc8fc51 100644 --- a/FFXIVClassic Map Server/packets/send/events/EndEventPacket.cs +++ b/FFXIVClassic Map Server/packets/send/events/EndEventPacket.cs @@ -2,6 +2,8 @@ using System.IO; using System.Text; +using FFXIVClassic.Common; + namespace FFXIVClassic_Map_Server.packets.send.events { class EndEventPacket diff --git a/FFXIVClassic Map Server/packets/send/events/KickEventPacket.cs b/FFXIVClassic Map Server/packets/send/events/KickEventPacket.cs index 35571c55..14e20263 100644 --- a/FFXIVClassic Map Server/packets/send/events/KickEventPacket.cs +++ b/FFXIVClassic Map Server/packets/send/events/KickEventPacket.cs @@ -4,6 +4,8 @@ using System.Collections.Generic; using System.IO; using System.Text; +using FFXIVClassic.Common; + namespace FFXIVClassic_Map_Server.packets.send.events { class KickEventPacket diff --git a/FFXIVClassic Map Server/packets/send/events/RunEventFunctionPacket.cs b/FFXIVClassic Map Server/packets/send/events/RunEventFunctionPacket.cs index fe2c989e..8320f103 100644 --- a/FFXIVClassic Map Server/packets/send/events/RunEventFunctionPacket.cs +++ b/FFXIVClassic Map Server/packets/send/events/RunEventFunctionPacket.cs @@ -4,6 +4,8 @@ using System.Collections.Generic; using System.IO; using System.Text; +using FFXIVClassic.Common; + namespace FFXIVClassic_Map_Server.packets.send.events { class RunEventFunctionPacket diff --git a/FFXIVClassic Map Server/packets/send/list/ListBeginPacket.cs b/FFXIVClassic Map Server/packets/send/list/ListBeginPacket.cs index 9acebfd7..ee63b473 100644 --- a/FFXIVClassic Map Server/packets/send/list/ListBeginPacket.cs +++ b/FFXIVClassic Map Server/packets/send/list/ListBeginPacket.cs @@ -1,6 +1,8 @@ using System; using System.IO; +using FFXIVClassic.Common; + namespace FFXIVClassic_Map_Server.packets.send.list { class ListBeginPacket diff --git a/FFXIVClassic Map Server/packets/send/list/ListEndPacket.cs b/FFXIVClassic Map Server/packets/send/list/ListEndPacket.cs index e8cc597d..788e7fac 100644 --- a/FFXIVClassic Map Server/packets/send/list/ListEndPacket.cs +++ b/FFXIVClassic Map Server/packets/send/list/ListEndPacket.cs @@ -1,6 +1,8 @@ using System; using System.IO; +using FFXIVClassic.Common; + namespace FFXIVClassic_Map_Server.packets.send.list { class ListEndPacket diff --git a/FFXIVClassic Map Server/packets/send/list/ListEntriesEndPacket.cs b/FFXIVClassic Map Server/packets/send/list/ListEntriesEndPacket.cs index eaf661ba..0e7db0f9 100644 --- a/FFXIVClassic Map Server/packets/send/list/ListEntriesEndPacket.cs +++ b/FFXIVClassic Map Server/packets/send/list/ListEntriesEndPacket.cs @@ -3,6 +3,8 @@ using System.Collections.Generic; using System.IO; using System.Text; +using FFXIVClassic.Common; + namespace FFXIVClassic_Map_Server.packets.send.list { class ListEntriesEndPacket diff --git a/FFXIVClassic Map Server/packets/send/list/ListEntry.cs b/FFXIVClassic Map Server/packets/send/list/ListEntry.cs index 97859916..6fcb31ff 100644 --- a/FFXIVClassic Map Server/packets/send/list/ListEntry.cs +++ b/FFXIVClassic Map Server/packets/send/list/ListEntry.cs @@ -1,4 +1,6 @@ -namespace FFXIVClassic_Map_Server.packets.send.list +using FFXIVClassic.Common; + +namespace FFXIVClassic_Map_Server.packets.send.list { class ListEntry { diff --git a/FFXIVClassic Map Server/packets/send/list/ListStartPacket.cs b/FFXIVClassic Map Server/packets/send/list/ListStartPacket.cs index 56934bef..481762c6 100644 --- a/FFXIVClassic Map Server/packets/send/list/ListStartPacket.cs +++ b/FFXIVClassic Map Server/packets/send/list/ListStartPacket.cs @@ -2,6 +2,8 @@ using System.IO; using System.Text; +using FFXIVClassic.Common; + namespace FFXIVClassic_Map_Server.packets.send.list { class ListStartPacket diff --git a/FFXIVClassic Map Server/packets/send/list/ListUtils.cs b/FFXIVClassic Map Server/packets/send/list/ListUtils.cs index 03269fe1..4f5df931 100644 --- a/FFXIVClassic Map Server/packets/send/list/ListUtils.cs +++ b/FFXIVClassic Map Server/packets/send/list/ListUtils.cs @@ -1,5 +1,7 @@ using System.Collections.Generic; +using FFXIVClassic.Common; + namespace FFXIVClassic_Map_Server.packets.send.list { class ListUtils diff --git a/FFXIVClassic Map Server/packets/send/list/SetListPropertyPacket.cs b/FFXIVClassic Map Server/packets/send/list/SetListPropertyPacket.cs index 781e137f..4c4b9d85 100644 --- a/FFXIVClassic Map Server/packets/send/list/SetListPropertyPacket.cs +++ b/FFXIVClassic Map Server/packets/send/list/SetListPropertyPacket.cs @@ -5,7 +5,9 @@ using System.Linq; using System.Reflection; using System.Text; -namespace FFXIVClassic_Map_Server.packets.send.actor +using FFXIVClassic.Common; + +namespace FFXIVClassic_Map_Server.packets.send.actor { class SetListPropetyPacket { diff --git a/FFXIVClassic Map Server/packets/send/login/0x2Packet.cs b/FFXIVClassic Map Server/packets/send/login/0x2Packet.cs index 59a1f583..72952578 100644 --- a/FFXIVClassic Map Server/packets/send/login/0x2Packet.cs +++ b/FFXIVClassic Map Server/packets/send/login/0x2Packet.cs @@ -1,5 +1,7 @@ using System.IO; +using FFXIVClassic.Common; + namespace FFXIVClassic_Map_Server.packets.send.login { class _0x2Packet diff --git a/FFXIVClassic Map Server/packets/send/login/0x7ResponsePacket.cs b/FFXIVClassic Map Server/packets/send/login/0x7ResponsePacket.cs index 63d207f9..7278b1f1 100644 --- a/FFXIVClassic Map Server/packets/send/login/0x7ResponsePacket.cs +++ b/FFXIVClassic Map Server/packets/send/login/0x7ResponsePacket.cs @@ -1,6 +1,9 @@ -using System; +using FFXIVClassic.Common; +using System; using System.IO; +using FFXIVClassic.Common; + namespace FFXIVClassic_Map_Server.packets.send.login { class Login0x7ResponsePacket diff --git a/FFXIVClassic Map Server/packets/send/player/AchievementEarnedPacket.cs b/FFXIVClassic Map Server/packets/send/player/AchievementEarnedPacket.cs index 2151e81c..f7a9ed11 100644 --- a/FFXIVClassic Map Server/packets/send/player/AchievementEarnedPacket.cs +++ b/FFXIVClassic Map Server/packets/send/player/AchievementEarnedPacket.cs @@ -1,5 +1,7 @@ using System; +using FFXIVClassic.Common; + namespace FFXIVClassic_Map_Server.packets.send.player { class AchievementEarnedPacket diff --git a/FFXIVClassic Map Server/packets/send/player/InfoRequestResponsePacket.cs b/FFXIVClassic Map Server/packets/send/player/InfoRequestResponsePacket.cs index 73780b4c..dd3535c0 100644 --- a/FFXIVClassic Map Server/packets/send/player/InfoRequestResponsePacket.cs +++ b/FFXIVClassic Map Server/packets/send/player/InfoRequestResponsePacket.cs @@ -2,6 +2,8 @@ using System.Collections.Generic; using System.IO; +using FFXIVClassic.Common; + namespace FFXIVClassic_Map_Server.packets.send.player { class InfoRequestResponsePacket diff --git a/FFXIVClassic Map Server/packets/send/player/SendAchievementRatePacket.cs b/FFXIVClassic Map Server/packets/send/player/SendAchievementRatePacket.cs index 60b9b2b9..0bef5b62 100644 --- a/FFXIVClassic Map Server/packets/send/player/SendAchievementRatePacket.cs +++ b/FFXIVClassic Map Server/packets/send/player/SendAchievementRatePacket.cs @@ -1,6 +1,8 @@ using System; using System.IO; +using FFXIVClassic.Common; + namespace FFXIVClassic_Map_Server.packets.send.player { class SendAchievementRatePacket diff --git a/FFXIVClassic Map Server/packets/send/player/SetAchievementPointsPacket.cs b/FFXIVClassic Map Server/packets/send/player/SetAchievementPointsPacket.cs index 6c4248a2..8000b570 100644 --- a/FFXIVClassic Map Server/packets/send/player/SetAchievementPointsPacket.cs +++ b/FFXIVClassic Map Server/packets/send/player/SetAchievementPointsPacket.cs @@ -1,5 +1,7 @@ using System; +using FFXIVClassic.Common; + namespace FFXIVClassic_Map_Server.packets.send.player { class SetAchievementPointsPacket diff --git a/FFXIVClassic Map Server/packets/send/player/SetChocoboNamePacket.cs b/FFXIVClassic Map Server/packets/send/player/SetChocoboNamePacket.cs index 53bbb748..97f9850e 100644 --- a/FFXIVClassic Map Server/packets/send/player/SetChocoboNamePacket.cs +++ b/FFXIVClassic Map Server/packets/send/player/SetChocoboNamePacket.cs @@ -1,5 +1,7 @@ using System.Text; +using FFXIVClassic.Common; + namespace FFXIVClassic_Map_Server.packets.send.player { class SetChocoboNamePacket diff --git a/FFXIVClassic Map Server/packets/send/player/SetCompletedAchievementsPacket.cs b/FFXIVClassic Map Server/packets/send/player/SetCompletedAchievementsPacket.cs index 4368f77a..887acc94 100644 --- a/FFXIVClassic Map Server/packets/send/player/SetCompletedAchievementsPacket.cs +++ b/FFXIVClassic Map Server/packets/send/player/SetCompletedAchievementsPacket.cs @@ -1,6 +1,8 @@ using FFXIVClassic.Common; using System.IO; +using FFXIVClassic.Common; + namespace FFXIVClassic_Map_Server.packets.send.player { class SetCompletedAchievementsPacket diff --git a/FFXIVClassic Map Server/packets/send/player/SetCurrentJobPacket.cs b/FFXIVClassic Map Server/packets/send/player/SetCurrentJobPacket.cs index 43a07cd0..f890e4e6 100644 --- a/FFXIVClassic Map Server/packets/send/player/SetCurrentJobPacket.cs +++ b/FFXIVClassic Map Server/packets/send/player/SetCurrentJobPacket.cs @@ -1,5 +1,7 @@ using System; +using FFXIVClassic.Common; + namespace FFXIVClassic_Map_Server.packets.send.player { class SetCurrentJobPacket diff --git a/FFXIVClassic Map Server/packets/send/player/SetCurrentMountChocoboPacket.cs b/FFXIVClassic Map Server/packets/send/player/SetCurrentMountChocoboPacket.cs index b4d7a013..95f3ff97 100644 --- a/FFXIVClassic Map Server/packets/send/player/SetCurrentMountChocoboPacket.cs +++ b/FFXIVClassic Map Server/packets/send/player/SetCurrentMountChocoboPacket.cs @@ -1,4 +1,6 @@ -namespace FFXIVClassic_Map_Server.packets.send.player +using FFXIVClassic.Common; + +namespace FFXIVClassic_Map_Server.packets.send.player { class SetCurrentMountChocoboPacket { diff --git a/FFXIVClassic Map Server/packets/send/player/SetCurrentMountGoobbuePacket.cs b/FFXIVClassic Map Server/packets/send/player/SetCurrentMountGoobbuePacket.cs index ec65824c..71aca97f 100644 --- a/FFXIVClassic Map Server/packets/send/player/SetCurrentMountGoobbuePacket.cs +++ b/FFXIVClassic Map Server/packets/send/player/SetCurrentMountGoobbuePacket.cs @@ -1,4 +1,6 @@ -namespace FFXIVClassic_Map_Server.packets.send.player +using FFXIVClassic.Common; + +namespace FFXIVClassic_Map_Server.packets.send.player { class SetCurrentMountGoobbuePacket { diff --git a/FFXIVClassic Map Server/packets/send/player/SetCutsceneBookPacket.cs b/FFXIVClassic Map Server/packets/send/player/SetCutsceneBookPacket.cs index 75211b87..84bc4c9f 100644 --- a/FFXIVClassic Map Server/packets/send/player/SetCutsceneBookPacket.cs +++ b/FFXIVClassic Map Server/packets/send/player/SetCutsceneBookPacket.cs @@ -3,6 +3,8 @@ using System; using System.IO; using System.Text; +using FFXIVClassic.Common; + namespace FFXIVClassic_Map_Server.packets.send.player { class SetCutsceneBookPacket diff --git a/FFXIVClassic Map Server/packets/send/player/SetGrandCompanyPacket.cs b/FFXIVClassic Map Server/packets/send/player/SetGrandCompanyPacket.cs index 4b177966..d942efad 100644 --- a/FFXIVClassic Map Server/packets/send/player/SetGrandCompanyPacket.cs +++ b/FFXIVClassic Map Server/packets/send/player/SetGrandCompanyPacket.cs @@ -1,7 +1,9 @@ using System; using System.IO; -namespace FFXIVClassic_Map_Server.packets.send.actor +using FFXIVClassic.Common; + +namespace FFXIVClassic_Map_Server.packets.send.actor { class SetGrandCompanyPacket { diff --git a/FFXIVClassic Map Server/packets/send/player/SetHasChocoboPacket.cs b/FFXIVClassic Map Server/packets/send/player/SetHasChocoboPacket.cs index d2fe62d3..796ac55e 100644 --- a/FFXIVClassic Map Server/packets/send/player/SetHasChocoboPacket.cs +++ b/FFXIVClassic Map Server/packets/send/player/SetHasChocoboPacket.cs @@ -1,4 +1,6 @@ -namespace FFXIVClassic_Map_Server.packets.send.player +using FFXIVClassic.Common; + +namespace FFXIVClassic_Map_Server.packets.send.player { class SetHasChocoboPacket { diff --git a/FFXIVClassic Map Server/packets/send/player/SetHasGoobbuePacket.cs b/FFXIVClassic Map Server/packets/send/player/SetHasGoobbuePacket.cs index 114bf124..4f35e303 100644 --- a/FFXIVClassic Map Server/packets/send/player/SetHasGoobbuePacket.cs +++ b/FFXIVClassic Map Server/packets/send/player/SetHasGoobbuePacket.cs @@ -1,4 +1,6 @@ -namespace FFXIVClassic_Map_Server.packets.send.player +using FFXIVClassic.Common; + +namespace FFXIVClassic_Map_Server.packets.send.player { class SetHasGoobbuePacket { diff --git a/FFXIVClassic Map Server/packets/send/player/SetLatestAchievementsPacket.cs b/FFXIVClassic Map Server/packets/send/player/SetLatestAchievementsPacket.cs index cb50cdb7..5d9c6483 100644 --- a/FFXIVClassic Map Server/packets/send/player/SetLatestAchievementsPacket.cs +++ b/FFXIVClassic Map Server/packets/send/player/SetLatestAchievementsPacket.cs @@ -1,6 +1,8 @@ using System; using System.IO; +using FFXIVClassic.Common; + namespace FFXIVClassic_Map_Server.packets.send.player { class SetLatestAchievementsPacket diff --git a/FFXIVClassic Map Server/packets/send/player/SetPlayerDreamPacket.cs b/FFXIVClassic Map Server/packets/send/player/SetPlayerDreamPacket.cs index 5f357dc1..d3e3d177 100644 --- a/FFXIVClassic Map Server/packets/send/player/SetPlayerDreamPacket.cs +++ b/FFXIVClassic Map Server/packets/send/player/SetPlayerDreamPacket.cs @@ -1,4 +1,7 @@ -using System; +using FFXIVClassic.Common; +using System; + +using FFXIVClassic.Common; namespace FFXIVClassic_Map_Server.packets.send.player { diff --git a/FFXIVClassic Map Server/packets/send/player/SetPlayerTitlePacket.cs b/FFXIVClassic Map Server/packets/send/player/SetPlayerTitlePacket.cs index 112def38..75af7666 100644 --- a/FFXIVClassic Map Server/packets/send/player/SetPlayerTitlePacket.cs +++ b/FFXIVClassic Map Server/packets/send/player/SetPlayerTitlePacket.cs @@ -1,5 +1,7 @@ using System; +using FFXIVClassic.Common; + namespace FFXIVClassic_Map_Server.packets.send.player { class SetPlayerTitlePacket diff --git a/FFXIVClassic Map Server/packets/send/player/_0x196Packet.cs b/FFXIVClassic Map Server/packets/send/player/_0x196Packet.cs index 221f4d37..8eff42ae 100644 --- a/FFXIVClassic Map Server/packets/send/player/_0x196Packet.cs +++ b/FFXIVClassic Map Server/packets/send/player/_0x196Packet.cs @@ -1,6 +1,8 @@ using System; using System.IO; +using FFXIVClassic.Common; + namespace FFXIVClassic_Map_Server.packets.send.player { class _0x196Packet diff --git a/FFXIVClassic Map Server/packets/send/recruitment/CurrentRecruitmentDetailsPacket.cs b/FFXIVClassic Map Server/packets/send/recruitment/CurrentRecruitmentDetailsPacket.cs index 99068bf6..2b3f7a4d 100644 --- a/FFXIVClassic Map Server/packets/send/recruitment/CurrentRecruitmentDetailsPacket.cs +++ b/FFXIVClassic Map Server/packets/send/recruitment/CurrentRecruitmentDetailsPacket.cs @@ -3,6 +3,8 @@ using System; using System.IO; using System.Text; +using FFXIVClassic.Common; + namespace FFXIVClassic_Map_Server.packets.send.recruitment { class CurrentRecruitmentDetailsPacket diff --git a/FFXIVClassic Map Server/packets/send/recruitment/EndRecruitmentPacket.cs b/FFXIVClassic Map Server/packets/send/recruitment/EndRecruitmentPacket.cs index e0ef929d..d6c6ffe6 100644 --- a/FFXIVClassic Map Server/packets/send/recruitment/EndRecruitmentPacket.cs +++ b/FFXIVClassic Map Server/packets/send/recruitment/EndRecruitmentPacket.cs @@ -1,4 +1,6 @@ -namespace FFXIVClassic_Map_Server.packets.send.recruitment +using FFXIVClassic.Common; + +namespace FFXIVClassic_Map_Server.packets.send.recruitment { class EndRecruitmentPacket { diff --git a/FFXIVClassic Map Server/packets/send/recruitment/RecruiterStatePacket.cs b/FFXIVClassic Map Server/packets/send/recruitment/RecruiterStatePacket.cs index 3e557b97..7356f33b 100644 --- a/FFXIVClassic Map Server/packets/send/recruitment/RecruiterStatePacket.cs +++ b/FFXIVClassic Map Server/packets/send/recruitment/RecruiterStatePacket.cs @@ -1,6 +1,8 @@ using System; using System.IO; +using FFXIVClassic.Common; + namespace FFXIVClassic_Map_Server.packets.send.recruitment { class RecruiterStatePacket diff --git a/FFXIVClassic Map Server/packets/send/recruitment/StartRecruitingResponse.cs b/FFXIVClassic Map Server/packets/send/recruitment/StartRecruitingResponse.cs index 5e78f219..efa1b644 100644 --- a/FFXIVClassic Map Server/packets/send/recruitment/StartRecruitingResponse.cs +++ b/FFXIVClassic Map Server/packets/send/recruitment/StartRecruitingResponse.cs @@ -1,4 +1,6 @@ -namespace FFXIVClassic_Map_Server.packets.send.recruitment +using FFXIVClassic.Common; + +namespace FFXIVClassic_Map_Server.packets.send.recruitment { class StartRecruitingResponse { diff --git a/FFXIVClassic Map Server/packets/send/social/BlacklistAddedPacket.cs b/FFXIVClassic Map Server/packets/send/social/BlacklistAddedPacket.cs index eac92f94..1ac85628 100644 --- a/FFXIVClassic Map Server/packets/send/social/BlacklistAddedPacket.cs +++ b/FFXIVClassic Map Server/packets/send/social/BlacklistAddedPacket.cs @@ -1,6 +1,8 @@ using System.IO; using System.Text; +using FFXIVClassic.Common; + namespace FFXIVClassic_Map_Server.packets.send.social { class BlacklistAddedPacket diff --git a/FFXIVClassic Map Server/packets/send/social/BlacklistRemovedPacket.cs b/FFXIVClassic Map Server/packets/send/social/BlacklistRemovedPacket.cs index 507d8e58..22c7f8a7 100644 --- a/FFXIVClassic Map Server/packets/send/social/BlacklistRemovedPacket.cs +++ b/FFXIVClassic Map Server/packets/send/social/BlacklistRemovedPacket.cs @@ -1,6 +1,8 @@ using System.IO; using System.Text; +using FFXIVClassic.Common; + namespace FFXIVClassic_Map_Server.packets.send.social { class BlacklistRemovedPacket diff --git a/FFXIVClassic Map Server/packets/send/social/FriendStatusPacket.cs b/FFXIVClassic Map Server/packets/send/social/FriendStatusPacket.cs index 5cee912d..a9e279fe 100644 --- a/FFXIVClassic Map Server/packets/send/social/FriendStatusPacket.cs +++ b/FFXIVClassic Map Server/packets/send/social/FriendStatusPacket.cs @@ -1,6 +1,8 @@ using System; using System.IO; +using FFXIVClassic.Common; + namespace FFXIVClassic_Map_Server.packets.send.social { class FriendStatusPacket diff --git a/FFXIVClassic Map Server/packets/send/social/FriendlistAddedPacket.cs b/FFXIVClassic Map Server/packets/send/social/FriendlistAddedPacket.cs index 7f708c29..b46caf85 100644 --- a/FFXIVClassic Map Server/packets/send/social/FriendlistAddedPacket.cs +++ b/FFXIVClassic Map Server/packets/send/social/FriendlistAddedPacket.cs @@ -2,6 +2,8 @@ using System.IO; using System.Text; +using FFXIVClassic.Common; + namespace FFXIVClassic_Map_Server.packets.send.social { class FriendlistAddedPacket diff --git a/FFXIVClassic Map Server/packets/send/social/FriendlistRemovedPacket.cs b/FFXIVClassic Map Server/packets/send/social/FriendlistRemovedPacket.cs index f4ccef4d..f293da3d 100644 --- a/FFXIVClassic Map Server/packets/send/social/FriendlistRemovedPacket.cs +++ b/FFXIVClassic Map Server/packets/send/social/FriendlistRemovedPacket.cs @@ -1,6 +1,8 @@ using System.IO; using System.Text; +using FFXIVClassic.Common; + namespace FFXIVClassic_Map_Server.packets.send.social { class FriendlistRemovedPacket diff --git a/FFXIVClassic Map Server/packets/send/social/SendBlacklistPacket.cs b/FFXIVClassic Map Server/packets/send/social/SendBlacklistPacket.cs index 54d3b9b9..01654a86 100644 --- a/FFXIVClassic Map Server/packets/send/social/SendBlacklistPacket.cs +++ b/FFXIVClassic Map Server/packets/send/social/SendBlacklistPacket.cs @@ -2,6 +2,8 @@ using System.IO; using System.Text; +using FFXIVClassic.Common; + namespace FFXIVClassic_Map_Server.packets.send.social { class SendBlacklistPacket diff --git a/FFXIVClassic Map Server/packets/send/social/SendFriendlistPacket.cs b/FFXIVClassic Map Server/packets/send/social/SendFriendlistPacket.cs index 7074ca3d..117c800e 100644 --- a/FFXIVClassic Map Server/packets/send/social/SendFriendlistPacket.cs +++ b/FFXIVClassic Map Server/packets/send/social/SendFriendlistPacket.cs @@ -2,6 +2,8 @@ using System.IO; using System.Text; +using FFXIVClassic.Common; + namespace FFXIVClassic_Map_Server.packets.send.social { class SendFriendlistPacket diff --git a/FFXIVClassic Map Server/packets/send/supportdesk/EndGMTicketPacket.cs b/FFXIVClassic Map Server/packets/send/supportdesk/EndGMTicketPacket.cs index 0a84b09a..b9387de5 100644 --- a/FFXIVClassic Map Server/packets/send/supportdesk/EndGMTicketPacket.cs +++ b/FFXIVClassic Map Server/packets/send/supportdesk/EndGMTicketPacket.cs @@ -1,4 +1,6 @@ -namespace FFXIVClassic_Map_Server.packets.send.supportdesk +using FFXIVClassic.Common; + +namespace FFXIVClassic_Map_Server.packets.send.supportdesk { class EndGMTicketPacket { diff --git a/FFXIVClassic Map Server/packets/send/supportdesk/FaqBodyResponsePacket.cs b/FFXIVClassic Map Server/packets/send/supportdesk/FaqBodyResponsePacket.cs index a3ab11c5..6704747e 100644 --- a/FFXIVClassic Map Server/packets/send/supportdesk/FaqBodyResponsePacket.cs +++ b/FFXIVClassic Map Server/packets/send/supportdesk/FaqBodyResponsePacket.cs @@ -1,6 +1,8 @@ using System.IO; using System.Text; +using FFXIVClassic.Common; + namespace FFXIVClassic_Map_Server.packets.send.supportdesk { class FaqBodyResponsePacket diff --git a/FFXIVClassic Map Server/packets/send/supportdesk/FaqListResponsePacket.cs b/FFXIVClassic Map Server/packets/send/supportdesk/FaqListResponsePacket.cs index cc8193b4..b41774f1 100644 --- a/FFXIVClassic Map Server/packets/send/supportdesk/FaqListResponsePacket.cs +++ b/FFXIVClassic Map Server/packets/send/supportdesk/FaqListResponsePacket.cs @@ -1,6 +1,8 @@ using System.IO; using System.Text; +using FFXIVClassic.Common; + namespace FFXIVClassic_Map_Server.packets.send.supportdesk { class FaqListResponsePacket diff --git a/FFXIVClassic Map Server/packets/send/supportdesk/GMTicketPacket.cs b/FFXIVClassic Map Server/packets/send/supportdesk/GMTicketPacket.cs index 3ec04973..eddd0e33 100644 --- a/FFXIVClassic Map Server/packets/send/supportdesk/GMTicketPacket.cs +++ b/FFXIVClassic Map Server/packets/send/supportdesk/GMTicketPacket.cs @@ -1,6 +1,8 @@ using System.IO; using System.Text; +using FFXIVClassic.Common; + namespace FFXIVClassic_Map_Server.packets.send.supportdesk { class GMTicketPacket diff --git a/FFXIVClassic Map Server/packets/send/supportdesk/GMTicketSentResponsePacket.cs b/FFXIVClassic Map Server/packets/send/supportdesk/GMTicketSentResponsePacket.cs index 502b1f74..80903b2a 100644 --- a/FFXIVClassic Map Server/packets/send/supportdesk/GMTicketSentResponsePacket.cs +++ b/FFXIVClassic Map Server/packets/send/supportdesk/GMTicketSentResponsePacket.cs @@ -1,4 +1,8 @@ -namespace FFXIVClassic_Map_Server.packets.send.supportdesk +using FFXIVClassic.Common; + +using FFXIVClassic.Common; + +namespace FFXIVClassic_Map_Server.packets.send.supportdesk { class GMTicketSentResponsePacket { diff --git a/FFXIVClassic Map Server/packets/send/supportdesk/IssueListResponsePacket.cs b/FFXIVClassic Map Server/packets/send/supportdesk/IssueListResponsePacket.cs index 7f1defa5..93337b87 100644 --- a/FFXIVClassic Map Server/packets/send/supportdesk/IssueListResponsePacket.cs +++ b/FFXIVClassic Map Server/packets/send/supportdesk/IssueListResponsePacket.cs @@ -1,6 +1,8 @@ using System.IO; using System.Text; +using FFXIVClassic.Common; + namespace FFXIVClassic_Map_Server.packets.send.supportdesk { class IssueListResponsePacket diff --git a/FFXIVClassic Map Server/packets/send/supportdesk/StartGMTicketPacket.cs b/FFXIVClassic Map Server/packets/send/supportdesk/StartGMTicketPacket.cs index a06b23bb..8c643882 100644 --- a/FFXIVClassic Map Server/packets/send/supportdesk/StartGMTicketPacket.cs +++ b/FFXIVClassic Map Server/packets/send/supportdesk/StartGMTicketPacket.cs @@ -1,4 +1,6 @@ -namespace FFXIVClassic_Map_Server.packets.send.supportdesk +using FFXIVClassic.Common; + +namespace FFXIVClassic_Map_Server.packets.send.supportdesk { class StartGMTicketPacket { diff --git a/FFXIVClassic Map Server/utils/ActorPropertyPacketUtil.cs b/FFXIVClassic Map Server/utils/ActorPropertyPacketUtil.cs index e86996eb..1bc142b4 100644 --- a/FFXIVClassic Map Server/utils/ActorPropertyPacketUtil.cs +++ b/FFXIVClassic Map Server/utils/ActorPropertyPacketUtil.cs @@ -1,7 +1,8 @@ -using FFXIVClassic_Map_Server.packets; + using System.Collections.Generic; using FFXIVClassic_Map_Server.packets.send.actor; using FFXIVClassic_Map_Server.Actors; +using FFXIVClassic.Common; namespace FFXIVClassic_Map_Server.utils { diff --git a/FFXIVClassic Proxy Server/App.config b/FFXIVClassic Proxy Server/App.config new file mode 100644 index 00000000..78cae18f --- /dev/null +++ b/FFXIVClassic Proxy Server/App.config @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/FFXIVClassic Proxy Server/ConfigConstants.cs b/FFXIVClassic Proxy Server/ConfigConstants.cs new file mode 100644 index 00000000..ff39412a --- /dev/null +++ b/FFXIVClassic Proxy Server/ConfigConstants.cs @@ -0,0 +1,44 @@ +using FFXIVClassic.Common; +using System; +using System.IO; + +namespace FFXIVClassic_World_Server +{ + class ConfigConstants + { + public static String OPTIONS_BINDIP; + public static String OPTIONS_PORT; + public static bool OPTIONS_TIMESTAMP = false; + + public static String DATABASE_HOST; + public static String DATABASE_PORT; + public static String DATABASE_NAME; + public static String DATABASE_USERNAME; + public static String DATABASE_PASSWORD; + + public static bool Load() + { + Program.Log.Info("Loading config.ini"); + + if (!File.Exists("./config.ini")) + { + Program.Log.Error("FILE NOT FOUND!"); + return false; + } + + INIFile configIni = new INIFile("./config.ini"); + + ConfigConstants.OPTIONS_BINDIP = configIni.GetValue("General", "server_ip", "127.0.0.1"); + ConfigConstants.OPTIONS_PORT = configIni.GetValue("General", "server_port", "54994"); + ConfigConstants.OPTIONS_TIMESTAMP = configIni.GetValue("General", "showtimestamp", "true").ToLower().Equals("true"); + + ConfigConstants.DATABASE_HOST = configIni.GetValue("Database", "host", ""); + ConfigConstants.DATABASE_PORT = configIni.GetValue("Database", "port", ""); + ConfigConstants.DATABASE_NAME = configIni.GetValue("Database", "database", ""); + ConfigConstants.DATABASE_USERNAME = configIni.GetValue("Database", "username", ""); + ConfigConstants.DATABASE_PASSWORD = configIni.GetValue("Database", "password", ""); + + return true; + } + } +} diff --git a/FFXIVClassic Proxy Server/DataObjects/ClientConnection.cs b/FFXIVClassic Proxy Server/DataObjects/ClientConnection.cs new file mode 100644 index 00000000..163c079e --- /dev/null +++ b/FFXIVClassic Proxy Server/DataObjects/ClientConnection.cs @@ -0,0 +1,67 @@ +using System; +using System.Net.Sockets; +using System.Collections.Concurrent; +using System.Net; +using FFXIVClassic.Common; +using FFXIVClassic_World_Server.DataObjects; + +namespace FFXIVClassic_World_Server +{ + class ClientConnection + { + //Connection stuff + public Socket socket; + public byte[] buffer; + private BlockingCollection SendPacketQueue = new BlockingCollection(1000); + public int lastPartialSize = 0; + + //Instance Stuff + public Session owner; + + public void QueuePacket(BasePacket packet) + { + SendPacketQueue.Add(packet); + } + + public void QueuePacket(SubPacket subpacket, bool isAuthed, bool isEncrypted) + { + SendPacketQueue.Add(BasePacket.CreatePacket(subpacket, isAuthed, isEncrypted)); + } + + public void FlushQueuedSendPackets() + { + if (!socket.Connected) + return; + + while (SendPacketQueue.Count > 0) + { + BasePacket packet = SendPacketQueue.Take(); + + byte[] packetBytes = packet.GetPacketBytes(); + + try + { + socket.Send(packetBytes); + } + catch (Exception e) + { Program.Log.Error("Weird case, socket was d/ced: {0}", e); } + } + } + + public String GetAddress() + { + return String.Format("{0}:{1}", (socket.RemoteEndPoint as IPEndPoint).Address, (socket.RemoteEndPoint as IPEndPoint).Port); + } + + public bool IsConnected() + { + return (socket.Poll(1, SelectMode.SelectRead) && socket.Available == 0); + } + + public void Disconnect() + { + if (socket.Connected) + socket.Disconnect(false); + } + } +} diff --git a/FFXIVClassic Proxy Server/DataObjects/Session.cs b/FFXIVClassic Proxy Server/DataObjects/Session.cs new file mode 100644 index 00000000..80e9011c --- /dev/null +++ b/FFXIVClassic Proxy Server/DataObjects/Session.cs @@ -0,0 +1,27 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Net.Sockets; +using System.Text; +using System.Threading.Tasks; + +namespace FFXIVClassic_World_Server.DataObjects +{ + class Session + { + public enum Channel {ZONE, CHAT}; + + public readonly ulong sessionId; + public readonly ClientConnection clientSocket; + public readonly Channel type; + public ZoneServer routing1, routing2; + + public Session(ulong sessionId, ClientConnection socket, Channel type) + { + this.sessionId = sessionId; + this.clientSocket = socket; + this.type = type; + } + + } +} diff --git a/FFXIVClassic Proxy Server/DataObjects/ZoneServer.cs b/FFXIVClassic Proxy Server/DataObjects/ZoneServer.cs new file mode 100644 index 00000000..2f7943e0 --- /dev/null +++ b/FFXIVClassic Proxy Server/DataObjects/ZoneServer.cs @@ -0,0 +1,16 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Net.Sockets; +using System.Text; +using System.Threading.Tasks; + +namespace FFXIVClassic_World_Server.DataObjects +{ + class ZoneServer + { + public string zoneServerIp; + public int zoneServerPort; + public Socket zoneServerConnection; + } +} diff --git a/FFXIVClassic Proxy Server/FFXIVClassic World Server.csproj b/FFXIVClassic Proxy Server/FFXIVClassic World Server.csproj new file mode 100644 index 00000000..f05479d2 --- /dev/null +++ b/FFXIVClassic Proxy Server/FFXIVClassic World Server.csproj @@ -0,0 +1,94 @@ + + + + + Debug + AnyCPU + {3067889D-8A50-40D6-9CD5-23AA8EA96F26} + Exe + Properties + FFXIVClassic_World_Server + FFXIVClassic World Server + v4.5.2 + 512 + true + + + AnyCPU + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + AnyCPU + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + ..\packages\Cyotek.CircularBuffer.1.0.0.0\lib\net20\Cyotek.Collections.Generic.CircularBuffer.dll + True + + + ..\packages\Dapper.1.42\lib\net45\Dapper.dll + True + + + ..\packages\MySql.Data.6.9.8\lib\net45\MySql.Data.dll + True + + + ..\packages\NLog.4.3.5\lib\net45\NLog.dll + True + + + + + + + + + + + + + + + + + + + + + + + Always + + + Designer + + + + + + {3a3d6626-c820-4c18-8c81-64811424f20e} + FFXIVClassic Common Class Lib + + + + + \ No newline at end of file diff --git a/FFXIVClassic Proxy Server/NLog.config b/FFXIVClassic Proxy Server/NLog.config new file mode 100644 index 00000000..917f8554 --- /dev/null +++ b/FFXIVClassic Proxy Server/NLog.config @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/FFXIVClassic Proxy Server/NLog.xsd b/FFXIVClassic Proxy Server/NLog.xsd new file mode 100644 index 00000000..31cd6c0a --- /dev/null +++ b/FFXIVClassic Proxy Server/NLog.xsd @@ -0,0 +1,2601 @@ + + + + + + + + + + + + + + + Watch config file for changes and reload automatically. + + + + + Print internal NLog messages to the console. Default value is: false + + + + + Print internal NLog messages to the console error output. Default value is: false + + + + + Write internal NLog messages to the specified file. + + + + + Log level threshold for internal log messages. Default value is: Info. + + + + + Global log level threshold for application log messages. Messages below this level won't be logged.. + + + + + Pass NLog internal exceptions to the application. Default value is: false. + + + + + Write internal NLog messages to the the System.Diagnostics.Trace. Default value is: false + + + + + + + + + + + + + + Make all targets within this section asynchronous (Creates additional threads but the calling thread isn't blocked by any target writes). + + + + + + + + + + + + + + + + + Prefix for targets/layout renderers/filters/conditions loaded from this assembly. + + + + + Load NLog extensions from the specified file (*.dll) + + + + + Load NLog extensions from the specified assembly. Assembly name should be fully qualified. + + + + + + + + + + Name of the logger. May include '*' character which acts like a wildcard. Allowed forms are: *, Name, *Name, Name* and *Name* + + + + + Comma separated list of levels that this rule matches. + + + + + Minimum level that this rule matches. + + + + + Maximum level that this rule matches. + + + + + Level that this rule matches. + + + + + Comma separated list of target names. + + + + + Ignore further rules if this one matches. + + + + + Enable or disable logging rule. Disabled rules are ignored. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Name of the file to be included. The name is relative to the name of the current config file. + + + + + Ignore any errors in the include file. + + + + + + + Variable name. + + + + + Variable value. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Name of the target. + + + + + Layout used to format log messages. + + + + + Indicates whether to add <!-- --> comments around all written texts. + + + + + + + + + + + + + + + + + + Name of the target. + + + + + Number of log events that should be processed in a batch by the lazy writer thread. + + + + + Action to be taken when the lazy writer thread request queue count exceeds the set limit. + + + + + Limit on the number of requests in the lazy writer thread request queue. + + + + + Time in milliseconds to sleep between batches. + + + + + + + + + + + + + + + + + + + + + Name of the target. + + + + + + + + + + + + + + + + + Name of the target. + + + + + Number of log events to be buffered. + + + + + Timeout (in milliseconds) after which the contents of buffer will be flushed if there's no write in the specified period of time. Use -1 to disable timed flushes. + + + + + Indicates whether to use sliding timeout. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Name of the target. + + + + + Encoding to be used. + + + + + Instance of that is used to format log messages. + + + + + Maximum message size in bytes. + + + + + Indicates whether to append newline at the end of log message. + + + + + Action that should be taken if the will be more connections than . + + + + + Action that should be taken if the message is larger than maxMessageSize. + + + + + Indicates whether to keep connection open whenever possible. + + + + + Size of the connection cache (number of connections which are kept alive). + + + + + Maximum current connections. 0 = no maximum. + + + + + Network address. + + + + + Maximum queue size. + + + + + Indicates whether to include source info (file name and line number) in the information sent over the network. + + + + + NDC item separator. + + + + + Indicates whether to include stack contents. + + + + + Indicates whether to include call site (class and method name) in the information sent over the network. + + + + + AppInfo field. By default it's the friendly name of the current AppDomain. + + + + + Indicates whether to include NLog-specific extensions to log4j schema. + + + + + Indicates whether to include dictionary contents. + + + + + + + + + + + + + + + + + + + + + + + + + + + Layout that should be use to calcuate the value for the parameter. + + + + + Viewer parameter name. + + + + + + + + + + + + + + + + + + + + Name of the target. + + + + + Text to be rendered. + + + + + Header. + + + + + Footer. + + + + + Indicates whether to use default row highlighting rules. + + + + + The encoding for writing messages to the . + + + + + Indicates whether the error stream (stderr) should be used instead of the output stream (stdout). + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Condition that must be met in order to set the specified foreground and background color. + + + + + Background color. + + + + + Foreground color. + + + + + + + + + + + + + + + + Indicates whether to ignore case when comparing texts. + + + + + Regular expression to be matched. You must specify either text or regex. + + + + + Text to be matched. You must specify either text or regex. + + + + + Indicates whether to match whole words only. + + + + + Compile the ? This can improve the performance, but at the costs of more memory usage. If false, the Regex Cache is used. + + + + + Background color. + + + + + Foreground color. + + + + + + + + + + + + + + + + + Name of the target. + + + + + Text to be rendered. + + + + + Header. + + + + + Footer. + + + + + Indicates whether to send the log messages to the standard error instead of the standard output. + + + + + The encoding for writing messages to the . + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Name of the target. + + + + + Connection string. When provided, it overrides the values specified in DBHost, DBUserName, DBPassword, DBDatabase. + + + + + Name of the connection string (as specified in <connectionStrings> configuration section. + + + + + Database name. If the ConnectionString is not provided this value will be used to construct the "Database=" part of the connection string. + + + + + Database host name. If the ConnectionString is not provided this value will be used to construct the "Server=" part of the connection string. + + + + + Database password. If the ConnectionString is not provided this value will be used to construct the "Password=" part of the connection string. + + + + + Name of the database provider. + + + + + Database user name. If the ConnectionString is not provided this value will be used to construct the "User ID=" part of the connection string. + + + + + Indicates whether to keep the database connection open between the log events. + + + + + Obsolete - value will be ignored! The logging code always runs outside of transaction. Gets or sets a value indicating whether to use database transactions. Some data providers require this. + + + + + Connection string using for installation and uninstallation. If not provided, regular ConnectionString is being used. + + + + + Text of the SQL command to be run on each log level. + + + + + Type of the SQL command to be run on each log level. + + + + + + + + + + + + + + + + + + + + + + + Type of the command. + + + + + Connection string to run the command against. If not provided, connection string from the target is used. + + + + + Indicates whether to ignore failures. + + + + + Command text. + + + + + + + + + + + + + + Layout that should be use to calcuate the value for the parameter. + + + + + Database parameter name. + + + + + Database parameter precision. + + + + + Database parameter scale. + + + + + Database parameter size. + + + + + + + + + + + + + + + Name of the target. + + + + + Text to be rendered. + + + + + Header. + + + + + Footer. + + + + + + + + + + + + + + + Name of the target. + + + + + Layout used to format log messages. + + + + + + + + + + + + + + + + + + + + + + + Name of the target. + + + + + Layout used to format log messages. + + + + + Layout that renders event Category. + + + + + Layout that renders event ID. + + + + + Name of the Event Log to write to. This can be System, Application or any user-defined name. + + + + + Name of the machine on which Event Log service is running. + + + + + Value to be used as the event Source. + + + + + Action to take if the message is larger than the option. + + + + + Optional entrytype. When not set, or when not convertable to then determined by + + + + + Message length limit to write to the Event Log. + + + + + + + + + + + + + + + + + + + + + + Name of the target. + + + + + Indicates whether to return to the first target after any successful write. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Name of the target. + + + + + Text to be rendered. + + + + + Header. + + + + + Footer. + + + + + File encoding. + + + + + Line ending mode. + + + + + Way file archives are numbered. + + + + + Name of the file to be used for an archive. + + + + + Indicates whether to automatically archive log files every time the specified time passes. + + + + + Size in bytes above which log files will be automatically archived. Warning: combining this with isn't supported. We cannot Create multiple archive files, if they should have the same name. Choose: + + + + + Maximum number of archive files that should be kept. + + + + + Indicates whether to compress archive files into the zip archive format. + + + + + Gets or set a value indicating whether a managed file stream is forced, instead of used the native implementation. + + + + + Cleanup invalid values in a filename, e.g. slashes in a filename. If set to true, this can impact the performance of massive writes. If set to false, nothing Gets written when the filename is wrong. + + + + + Name of the file to write to. + + + + + Value specifying the date format to use when archiving files. + + + + + Indicates whether to archive old log file on startup. + + + + + Indicates whether to Create directories if they Do not exist. + + + + + Indicates whether to enable log file(s) to be deleted. + + + + + File attributes (Windows only). + + + + + Indicates whether to delete old log file on startup. + + + + + Indicates whether to replace file contents on each write instead of appending log message at the end. + + + + + Indicates whether concurrent writes to the log file by multiple processes on the same host. + + + + + Delay in milliseconds to wait before attempting to write to the file again. + + + + + Maximum number of log filenames that should be stored as existing. + + + + + Indicates whether concurrent writes to the log file by multiple processes on different network hosts. + + + + + Number of files to be kept open. Setting this to a higher value may improve performance in a situation where a single File target is writing to many files (such as splitting by level or by logger). + + + + + Maximum number of seconds that files are kept open. If this number is negative the files are not automatically closed after a period of inactivity. + + + + + Log file buffer size in bytes. + + + + + Indicates whether to automatically flush the file buffers after each log message. + + + + + Number of times the write is appended on the file before NLog discards the log message. + + + + + Indicates whether to keep log file open instead of opening and closing it on each logging event. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Name of the target. + + + + + Condition expression. Log events who meet this condition will be forwarded to the wrapped target. + + + + + + + + + + + + + + + + + + + + + Name of the target. + + + + + Windows Domain name to change context to. + + + + + Required impersonation level. + + + + + Type of the logon provider. + + + + + Logon Type. + + + + + User account password. + + + + + Indicates whether to revert to the credentials of the process instead of impersonating another user. + + + + + Username to change context to. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Name of the target. + + + + + Endpoint address. + + + + + Name of the endpoint configuration in WCF configuration file. + + + + + Indicates whether to use a WCF service contract that is one way (fire and forGet) or two way (request-reply) + + + + + Client ID. + + + + + Indicates whether to include per-event properties in the payload sent to the server. + + + + + Indicates whether to use binary message encoding. + + + + + + + + + + + + + + Layout that should be use to calculate the value for the parameter. + + + + + Name of the parameter. + + + + + Type of the parameter. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Name of the target. + + + + + Text to be rendered. + + + + + Header. + + + + + Footer. + + + + + Indicates whether to send message as HTML instead of plain text. + + + + + Encoding to be used for sending e-mail. + + + + + Indicates whether to add new lines between log entries. + + + + + CC email addresses separated by semicolons (e.g. john@domain.com;jane@domain.com). + + + + + Recipients' email addresses separated by semicolons (e.g. john@domain.com;jane@domain.com). + + + + + BCC email addresses separated by semicolons (e.g. john@domain.com;jane@domain.com). + + + + + Mail message body (repeated for each log message send in one mail). + + + + + Mail subject. + + + + + Sender's email address (e.g. joe@domain.com). + + + + + Indicates whether NewLine characters in the body should be replaced with tags. + + + + + Priority used for sending mails. + + + + + Indicates the SMTP client timeout. + + + + + SMTP Server to be used for sending. + + + + + SMTP Authentication mode. + + + + + Username used to connect to SMTP server (used when SmtpAuthentication is set to "basic"). + + + + + Password used to authenticate against SMTP server (used when SmtpAuthentication is set to "basic"). + + + + + Indicates whether SSL (secure sockets layer) should be used when communicating with SMTP server. + + + + + Port number that SMTP Server is listening on. + + + + + Indicates whether the default Settings from System.Net.MailSettings should be used. + + + + + Folder where applications save mail messages to be processed by the local SMTP server. + + + + + Specifies how outgoing email messages will be handled. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Name of the target. + + + + + Layout used to format log messages. + + + + + + + + + + + + + + + + + + + + + + Name of the target. + + + + + Layout used to format log messages. + + + + + Encoding to be used when writing text to the queue. + + + + + Indicates whether to use the XML format when serializing message. This will also disable creating queues. + + + + + Indicates whether to check if a queue exists before writing to it. + + + + + Indicates whether to Create the queue if it Doesn't exists. + + + + + Label to associate with each message. + + + + + Name of the queue to write to. + + + + + Indicates whether to use recoverable messages (with guaranteed delivery). + + + + + + + + + + + + + + + + + Name of the target. + + + + + Class name. + + + + + Method name. The method must be public and static. Use the AssemblyQualifiedName , https://msdn.microsoft.com/en-us/library/system.type.assemblyqualifiedname(v=vs.110).aspx e.g. + + + + + + + + + + + + + + + + + + + + + + + + + Name of the target. + + + + + Layout used to format log messages. + + + + + Encoding to be used. + + + + + Maximum message size in bytes. + + + + + Indicates whether to append newline at the end of log message. + + + + + Action that should be taken if the will be more connections than . + + + + + Action that should be taken if the message is larger than maxMessageSize. + + + + + Network address. + + + + + Size of the connection cache (number of connections which are kept alive). + + + + + Indicates whether to keep connection open whenever possible. + + + + + Maximum current connections. 0 = no maximum. + + + + + Maximum queue size. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Name of the target. + + + + + Encoding to be used. + + + + + Instance of that is used to format log messages. + + + + + Maximum message size in bytes. + + + + + Indicates whether to append newline at the end of log message. + + + + + Action that should be taken if the will be more connections than . + + + + + Action that should be taken if the message is larger than maxMessageSize. + + + + + Indicates whether to keep connection open whenever possible. + + + + + Size of the connection cache (number of connections which are kept alive). + + + + + Maximum current connections. 0 = no maximum. + + + + + Network address. + + + + + Maximum queue size. + + + + + Indicates whether to include source info (file name and line number) in the information sent over the network. + + + + + NDC item separator. + + + + + Indicates whether to include stack contents. + + + + + Indicates whether to include call site (class and method name) in the information sent over the network. + + + + + AppInfo field. By default it's the friendly name of the current AppDomain. + + + + + Indicates whether to include NLog-specific extensions to log4j schema. + + + + + Indicates whether to include dictionary contents. + + + + + + + + + + + + + + + + Name of the target. + + + + + Layout used to format log messages. + + + + + Indicates whether to perform layout calculation. + + + + + + + + + + + + + + + Name of the target. + + + + + Layout used to format log messages. + + + + + + + + + + + + + + + + + + + + + Name of the target. + + + + + Indicates whether performance counter should be automatically Created. + + + + + Name of the performance counter category. + + + + + Counter help text. + + + + + Name of the performance counter. + + + + + Performance counter type. + + + + + The value by which to increment the counter. + + + + + Performance counter instance name. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Name of the target. + + + + + Default filter to be applied when no specific rule matches. + + + + + + + + + + + + + Condition to be tested. + + + + + Resulting filter to be applied when the condition matches. + + + + + + + + + + + + Name of the target. + + + + + + + + + + + + + + + Name of the target. + + + + + Number of times to repeat each log message. + + + + + + + + + + + + + + + + Name of the target. + + + + + Number of retries that should be attempted on the wrapped target in case of a failure. + + + + + Time to wait between retries in milliseconds. + + + + + + + + + + + + + + Name of the target. + + + + + + + + + + + + + + Name of the target. + + + + + + + + + + + + + + + Name of the target. + + + + + Layout used to format log messages. + + + + + + + + + + + + + + + + + + + + + Name of the target. + + + + + Should we include the BOM (Byte-order-mark) for UTF? Influences the property. This will only work for UTF-8. + + + + + Encoding. + + + + + Web service method name. Only used with Soap. + + + + + Web service namespace. Only used with Soap. + + + + + Protocol to be used when calling web service. + + + + + Web service URL. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Footer layout. + + + + + Header layout. + + + + + Body layout (can be repeated multiple times). + + + + + Custom column delimiter value (valid when ColumnDelimiter is set to 'Custom'). + + + + + Column delimiter. + + + + + Quote Character. + + + + + Quoting mode. + + + + + Indicates whether CVS should include header. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Layout of the column. + + + + + Name of the column. + + + + + + + + + + + + + Option to suppress the extra spaces in the output json + + + + + + + + + + + + + + Determines wether or not this attribute will be Json encoded. + + + + + Layout that will be rendered as the attribute's value. + + + + + Name of the attribute. + + + + + + + + + + + + + + Footer layout. + + + + + Header layout. + + + + + Body layout (can be repeated multiple times). + + + + + + + + + + + + + + + + + + + + + Layout text. + + + + + + + + + + + + + + + Action to be taken when filter matches. + + + + + Condition expression. + + + + + + + + + + + + + + + + + + + + + + + + + + Action to be taken when filter matches. + + + + + Indicates whether to ignore case when comparing strings. + + + + + Layout to be used to filter log messages. + + + + + Substring to be matched. + + + + + + + + + + + + + + + + + Action to be taken when filter matches. + + + + + String to compare the layout to. + + + + + Indicates whether to ignore case when comparing strings. + + + + + Layout to be used to filter log messages. + + + + + + + + + + + + + + + + + Action to be taken when filter matches. + + + + + Indicates whether to ignore case when comparing strings. + + + + + Layout to be used to filter log messages. + + + + + Substring to be matched. + + + + + + + + + + + + + + + + + Action to be taken when filter matches. + + + + + String to compare the layout to. + + + + + Indicates whether to ignore case when comparing strings. + + + + + Layout to be used to filter log messages. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/FFXIVClassic Proxy Server/Program.cs b/FFXIVClassic Proxy Server/Program.cs new file mode 100644 index 00000000..dfb02c88 --- /dev/null +++ b/FFXIVClassic Proxy Server/Program.cs @@ -0,0 +1,72 @@ +using MySql.Data.MySqlClient; +using NLog; +using NLog.Fluent; +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace FFXIVClassic_World_Server +{ + class Program + { + public static Logger Log; + + static void Main(string[] args) + { + // set up logging + Log = LogManager.GetCurrentClassLogger(); +#if DEBUG + TextWriterTraceListener myWriter = new TextWriterTraceListener(System.Console.Out); + Debug.Listeners.Add(myWriter); +#endif + bool startServer = true; + + Log.Info("=================================="); + Log.Info("FFXIV Classic World Server"); + Log.Info("Version: 0.0.1"); + Log.Info("=================================="); + + //Load Config + if (!ConfigConstants.Load()) + startServer = false; + + //Test DB Connection + 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 + { + conn.Open(); + conn.Close(); + + Log.Info("Connection ok."); + } + catch (MySqlException e) + { + Log.Error(e.ToString()); + startServer = false; + } + } + + //Start server if A-OK + if (startServer) + { + Server server = new Server(); + server.StartServer(); + + while (startServer) + { + String input = Console.ReadLine(); + Log.Info("[Console Input] " + input); + //cp.DoCommand(input, null); + } + } + + Program.Log.Info("Press any key to continue..."); + Console.ReadKey(); + } + } +} diff --git a/FFXIVClassic Proxy Server/Properties/AssemblyInfo.cs b/FFXIVClassic Proxy Server/Properties/AssemblyInfo.cs new file mode 100644 index 00000000..2bb7a8a3 --- /dev/null +++ b/FFXIVClassic Proxy Server/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 Proxy Server")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("FFXIVClassic Proxy Server")] +[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("3067889d-8a50-40d6-9cd5-23aa8ea96f26")] + +// 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 Proxy Server/Server.cs b/FFXIVClassic Proxy Server/Server.cs new file mode 100644 index 00000000..011f5015 --- /dev/null +++ b/FFXIVClassic Proxy Server/Server.cs @@ -0,0 +1,241 @@ +using FFXIVClassic.Common; +using FFXIVClassic_World_Server.DataObjects; +using System; +using System.Collections.Generic; +using System.Net; +using System.Net.Sockets; + +namespace FFXIVClassic_World_Server +{ + class Server + { + public const int FFXIV_MAP_PORT = 54992; + public const int BUFFER_SIZE = 0xFFFF; //Max basepacket size is 0xFFFF + public const int BACKLOG = 100; + public const int HEALTH_THREAD_SLEEP_TIME = 5; + + private static Server mSelf; + + private Socket mServerSocket; + + private List mConnectionList = new List(); + private Dictionary mSessionList = new Dictionary(); + + public Server() + { + mSelf = this; + } + + public static Server GetServer() + { + return mSelf; + } + + public bool StartServer() + { + + IPEndPoint serverEndPoint = new System.Net.IPEndPoint(IPAddress.Parse(ConfigConstants.OPTIONS_BINDIP), int.Parse(ConfigConstants.OPTIONS_PORT)); + + try + { + mServerSocket = new System.Net.Sockets.Socket(serverEndPoint.Address.AddressFamily, SocketType.Stream, ProtocolType.Tcp); + } + catch (Exception e) + { + throw new ApplicationException("Could not Create socket, check to make sure not duplicating port", e); + } + try + { + mServerSocket.Bind(serverEndPoint); + mServerSocket.Listen(BACKLOG); + } + catch (Exception e) + { + throw new ApplicationException("Error occured while binding socket, check inner exception", e); + } + try + { + mServerSocket.BeginAccept(new AsyncCallback(AcceptCallback), mServerSocket); + } + catch (Exception e) + { + throw new ApplicationException("Error occured starting listeners, check inner exception", e); + } + + Console.ForegroundColor = ConsoleColor.White; + Program.Log.Info("Map Server has started @ {0}:{1}", (mServerSocket.LocalEndPoint as IPEndPoint).Address, (mServerSocket.LocalEndPoint as IPEndPoint).Port); + Console.ForegroundColor = ConsoleColor.Gray; + + return true; + } + + #region Socket Handling + private void AcceptCallback(IAsyncResult result) + { + ClientConnection conn = null; + Socket socket = (System.Net.Sockets.Socket)result.AsyncState; + + try + { + conn = new ClientConnection(); + conn.socket = socket.EndAccept(result); + conn.buffer = new byte[BUFFER_SIZE]; + + lock (mConnectionList) + { + mConnectionList.Add(conn); + } + + Program.Log.Info("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 + mServerSocket.BeginAccept(new AsyncCallback(AcceptCallback), mServerSocket); + } + catch (SocketException) + { + if (conn != null) + { + + lock (mConnectionList) + { + mConnectionList.Remove(conn); + } + } + mServerSocket.BeginAccept(new AsyncCallback(AcceptCallback), mServerSocket); + } + catch (Exception) + { + if (conn != null) + { + lock (mConnectionList) + { + mConnectionList.Remove(conn); + } + } + mServerSocket.BeginAccept(new AsyncCallback(AcceptCallback), mServerSocket); + } + } + + /// + /// Receive Callback. Reads in incoming data, converting them to base packets. Base packets are sent to be parsed. If not enough data at the end to build a basepacket, move to the beginning and prepend. + /// + /// + private void ReceiveCallback(IAsyncResult result) + { + ClientConnection conn = (ClientConnection)result.AsyncState; + + //Check if disconnected + if ((conn.socket.Poll(1, SelectMode.SelectRead) && conn.socket.Available == 0)) + { + lock (mConnectionList) + { + mConnectionList.Remove(conn); + } + + return; + } + + try + { + int bytesRead = conn.socket.EndReceive(result); + + bytesRead += conn.lastPartialSize; + + if (bytesRead >= 0) + { + int offset = 0; + + //Build packets until can no longer or out of data + while (true) + { + BasePacket basePacket = BuildPacket(ref offset, conn.buffer, bytesRead); + + //If can't build packet, break, else process another + if (basePacket == null) + break; + else + { + //mProcessor.ProcessPacket(conn, basePacket); + } + + } + + //Not all bytes consumed, transfer leftover to beginning + if (offset < bytesRead) + Array.Copy(conn.buffer, offset, conn.buffer, 0, bytesRead - offset); + + conn.lastPartialSize = bytesRead - offset; + + //Build any queued subpackets into basepackets and send + conn.FlushQueuedSendPackets(); + + if (offset < bytesRead) + //Need offset since not all bytes consumed + conn.socket.BeginReceive(conn.buffer, bytesRead - offset, conn.buffer.Length - (bytesRead - offset), SocketFlags.None, new AsyncCallback(ReceiveCallback), conn); + else + //All bytes consumed, full buffer available + conn.socket.BeginReceive(conn.buffer, 0, conn.buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveCallback), conn); + } + else + { + + lock (mConnectionList) + { + mConnectionList.Remove(conn); + } + } + } + catch (SocketException) + { + if (conn.socket != null) + { + + lock (mConnectionList) + { + mConnectionList.Remove(conn); + } + } + } + } + + /// + /// Builds a packet from the incoming buffer + offset. If a packet can be built, it is returned else null. + /// + /// Current offset in buffer. + /// Incoming buffer. + /// Returns either a BasePacket or null if not enough data. + public BasePacket BuildPacket(ref int offset, byte[] buffer, int bytesRead) + { + BasePacket newPacket = null; + + //Too small to even get length + if (bytesRead <= offset) + return null; + + ushort packetSize = BitConverter.ToUInt16(buffer, offset); + + //Too small to whole packet + if (bytesRead < offset + packetSize) + return null; + + if (buffer.Length < offset + packetSize) + return null; + + try + { + newPacket = new BasePacket(buffer, ref offset); + } + catch (OverflowException) + { + return null; + } + + return newPacket; + } + + #endregion + + + } +} diff --git a/FFXIVClassic Proxy Server/packages.config b/FFXIVClassic Proxy Server/packages.config new file mode 100644 index 00000000..e99b9209 --- /dev/null +++ b/FFXIVClassic Proxy Server/packages.config @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/FFXIVClassic.sln b/FFXIVClassic.sln index 5cb0528a..9c2838fe 100644 --- a/FFXIVClassic.sln +++ b/FFXIVClassic.sln @@ -1,7 +1,7 @@  Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio 14 -VisualStudioVersion = 14.0.25123.0 +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}" ProjectSection(ProjectDependencies) = postProject @@ -15,6 +15,11 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FFXIVClassic Lobby Server", 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 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FFXIVClassic World Server", "FFXIVClassic Proxy Server\FFXIVClassic World Server.csproj", "{3067889D-8A50-40D6-9CD5-23AA8EA96F26}" + ProjectSection(ProjectDependencies) = postProject + {3A3D6626-C820-4C18-8C81-64811424F20E} = {3A3D6626-C820-4C18-8C81-64811424F20E} + EndProjectSection +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -33,6 +38,10 @@ Global {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 + {3067889D-8A50-40D6-9CD5-23AA8EA96F26}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {3067889D-8A50-40D6-9CD5-23AA8EA96F26}.Debug|Any CPU.Build.0 = Debug|Any CPU + {3067889D-8A50-40D6-9CD5-23AA8EA96F26}.Release|Any CPU.ActiveCfg = Release|Any CPU + {3067889D-8A50-40D6-9CD5-23AA8EA96F26}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE From e24a6f99cbd58bce50a91e41658ec5c01424f114 Mon Sep 17 00:00:00 2001 From: Filip Maj Date: Mon, 22 Aug 2016 14:18:37 -0400 Subject: [PATCH 02/20] Some more work on the world server. --- FFXIVClassic Proxy Server/ConfigConstants.cs | 6 +- .../DataObjects/ZoneServer.cs | 28 +++- .../FFXIVClassic World Server.csproj | 1 + FFXIVClassic Proxy Server/Server.cs | 9 +- FFXIVClassic Proxy Server/WorldMaster.cs | 144 ++++++++++++++++++ FFXIVClassic Proxy Server/packages.config | 1 + data/world_config.ini | 11 ++ 7 files changed, 193 insertions(+), 7 deletions(-) create mode 100644 FFXIVClassic Proxy Server/WorldMaster.cs create mode 100644 data/world_config.ini diff --git a/FFXIVClassic Proxy Server/ConfigConstants.cs b/FFXIVClassic Proxy Server/ConfigConstants.cs index ff39412a..dff311f8 100644 --- a/FFXIVClassic Proxy Server/ConfigConstants.cs +++ b/FFXIVClassic Proxy Server/ConfigConstants.cs @@ -18,15 +18,15 @@ namespace FFXIVClassic_World_Server public static bool Load() { - Program.Log.Info("Loading config.ini"); + Program.Log.Info("Loading world_config.ini"); - if (!File.Exists("./config.ini")) + if (!File.Exists("./world_config.ini")) { Program.Log.Error("FILE NOT FOUND!"); return false; } - INIFile configIni = new INIFile("./config.ini"); + INIFile configIni = new INIFile("./world_config.ini"); ConfigConstants.OPTIONS_BINDIP = configIni.GetValue("General", "server_ip", "127.0.0.1"); ConfigConstants.OPTIONS_PORT = configIni.GetValue("General", "server_port", "54994"); diff --git a/FFXIVClassic Proxy Server/DataObjects/ZoneServer.cs b/FFXIVClassic Proxy Server/DataObjects/ZoneServer.cs index 2f7943e0..eafe5dae 100644 --- a/FFXIVClassic Proxy Server/DataObjects/ZoneServer.cs +++ b/FFXIVClassic Proxy Server/DataObjects/ZoneServer.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Linq; +using System.Net; using System.Net.Sockets; using System.Text; using System.Threading.Tasks; @@ -9,8 +10,31 @@ namespace FFXIVClassic_World_Server.DataObjects { class ZoneServer { - public string zoneServerIp; - public int zoneServerPort; + public readonly string zoneServerIp; + public readonly int zoneServerPort; + public bool isConnected = false; public Socket zoneServerConnection; + + public ZoneServer(string ip, int port) + { + zoneServerIp = ip; + zoneServerPort = port; + } + + public void Connect() + { + Program.Log.Info("Connecting to zone server @ {0}:{1}", zoneServerIp, zoneServerPort); + IPEndPoint remoteEP = new IPEndPoint(IPAddress.Parse(zoneServerIp), zoneServerPort); + zoneServerConnection = new Socket(AddressFamily.InterNetwork, + SocketType.Stream, ProtocolType.Tcp); + + try + { + zoneServerConnection.Connect(remoteEP); + isConnected = true; + } + catch (Exception e) + { Program.Log.Error("Failed to connect"); return; } + } } } diff --git a/FFXIVClassic Proxy Server/FFXIVClassic World Server.csproj b/FFXIVClassic Proxy Server/FFXIVClassic World Server.csproj index f05479d2..8ef6fac2 100644 --- a/FFXIVClassic Proxy Server/FFXIVClassic World Server.csproj +++ b/FFXIVClassic Proxy Server/FFXIVClassic World Server.csproj @@ -66,6 +66,7 @@ + diff --git a/FFXIVClassic Proxy Server/Server.cs b/FFXIVClassic Proxy Server/Server.cs index 011f5015..d02d8312 100644 --- a/FFXIVClassic Proxy Server/Server.cs +++ b/FFXIVClassic Proxy Server/Server.cs @@ -18,6 +18,8 @@ namespace FFXIVClassic_World_Server private Socket mServerSocket; + WorldManager worldManager; + private List mConnectionList = new List(); private Dictionary mSessionList = new Dictionary(); @@ -33,7 +35,10 @@ namespace FFXIVClassic_World_Server public bool StartServer() { - + worldManager = new WorldManager(this); + worldManager.LoadZoneServerList(); + worldManager.ConnectToZoneServers(); + IPEndPoint serverEndPoint = new System.Net.IPEndPoint(IPAddress.Parse(ConfigConstants.OPTIONS_BINDIP), int.Parse(ConfigConstants.OPTIONS_PORT)); try @@ -63,7 +68,7 @@ namespace FFXIVClassic_World_Server } Console.ForegroundColor = ConsoleColor.White; - Program.Log.Info("Map Server has started @ {0}:{1}", (mServerSocket.LocalEndPoint as IPEndPoint).Address, (mServerSocket.LocalEndPoint as IPEndPoint).Port); + Program.Log.Info("World Server accepting connections @ {0}:{1}", (mServerSocket.LocalEndPoint as IPEndPoint).Address, (mServerSocket.LocalEndPoint as IPEndPoint).Port); Console.ForegroundColor = ConsoleColor.Gray; return true; diff --git a/FFXIVClassic Proxy Server/WorldMaster.cs b/FFXIVClassic Proxy Server/WorldMaster.cs new file mode 100644 index 00000000..40c47d60 --- /dev/null +++ b/FFXIVClassic Proxy Server/WorldMaster.cs @@ -0,0 +1,144 @@ +using FFXIVClassic.Common; +using FFXIVClassic_World_Server.DataObjects; +using MySql.Data.MySqlClient; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Net; +using System.Net.Sockets; +using System.Text; +using System.Threading.Tasks; + +namespace FFXIVClassic_World_Server +{ + class WorldManager + { + private Server mServer; + private Dictionary mZoneServerList; + + public WorldManager(Server server) + { + mServer = server; + } + + public void LoadZoneServerList() + { + mZoneServerList = new Dictionary(); + + 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 + { + conn.Open(); + + string query = @" + SELECT + serverIp, + serverPort + FROM server_zones + WHERE serverIp IS NOT NULL"; + + MySqlCommand cmd = new MySqlCommand(query, conn); + + using (MySqlDataReader reader = cmd.ExecuteReader()) + { + while (reader.Read()) + { + string ip = reader.GetString(0); + int port = reader.GetInt32(1); + string address = ip + ":" + port; + + if (!mZoneServerList.ContainsKey(address)) + { + ZoneServer zone = new ZoneServer(ip, port); + mZoneServerList.Add(address, zone); + } + } + } + } + catch (MySqlException e) + { Console.WriteLine(e); } + finally + { + conn.Dispose(); + } + } + + } + + public void ConnectToZoneServers() + { + Program.Log.Info("--------------------------"); + Program.Log.Info("Connecting to zone servers"); + Program.Log.Info("--------------------------"); + + foreach (ZoneServer zs in mZoneServerList.Values) + { + zs.Connect(); + } + } + + //Moves the actor to the new zone if exists. No packets are sent nor position changed. + public void DoSeamlessZoneServerChange(Session session, uint destinationZoneId) + { + + } + + //Moves actor to new zone, and sends packets to spawn at the given zone entrance + public void DoZoneServerChange(Session session, uint zoneEntrance) + { + /* + ->Tell old server to save session info and remove + ->Update the position to zoneEntrance + ->Update routing + ->Tell new server to load session info and add + */ + } + + //Moves actor to new zone, and sends packets to spawn at the given coords. + public void DoZoneServerChange(Session session, uint destinationZoneId, string destinationPrivateArea, byte spawnType, float spawnX, float spawnY, float spawnZ, float spawnRotation) + { + /* + ->Tell old server to save session info and remove + ->Update the position to params + ->Update routing + ->Tell new server to load session info and add + */ + } + + //Login Zone In + public void DoLogin(Session session) + { + /* + ->Update routing + ->Tell new server to load session info and add + */ + + + } + + public class ZoneEntrance + { + public uint zoneId; + public string privateAreaName; + public byte spawnType; + public float spawnX; + public float spawnY; + public float spawnZ; + public float spawnRotation; + + public ZoneEntrance(uint zoneId, string privateAreaName, byte spawnType, float x, float y, float z, float rot) + { + this.zoneId = zoneId; + this.privateAreaName = privateAreaName; + this.spawnType = spawnType; + this.spawnX = x; + this.spawnY = y; + this.spawnZ = z; + this.spawnRotation = rot; + } + } + + } + +} diff --git a/FFXIVClassic Proxy Server/packages.config b/FFXIVClassic Proxy Server/packages.config index e99b9209..043c0d66 100644 --- a/FFXIVClassic Proxy Server/packages.config +++ b/FFXIVClassic Proxy Server/packages.config @@ -6,4 +6,5 @@ + \ No newline at end of file diff --git a/data/world_config.ini b/data/world_config.ini new file mode 100644 index 00000000..2251736f --- /dev/null +++ b/data/world_config.ini @@ -0,0 +1,11 @@ +[General] +server_ip=127.0.0.1 +showtimestamp = true + +[Database] +worldid=1 +host=127.0.0.1 +port=3306 +database=ffxiv_server +username=root +password= From a1ca96054317d638ce8ee775484f1522c0c4f501 Mon Sep 17 00:00:00 2001 From: Filip Maj Date: Tue, 23 Aug 2016 16:57:24 -0400 Subject: [PATCH 03/20] More work on the world server. --- FFXIVClassic Common Class Lib/SubPacket.cs | 32 +++-- .../DataObjects/ZoneServer.cs | 18 +++ .../FFXIVClassic World Server.csproj | 4 + FFXIVClassic Proxy Server/PacketProcessor.cs | 133 ++++++++++++++++++ .../Packets/Send/0x7ResponsePacket.cs | 31 ++++ FFXIVClassic Proxy Server/Server.cs | 41 +++++- FFXIVClassic Proxy Server/WorldMaster.cs | 4 +- 7 files changed, 248 insertions(+), 15 deletions(-) create mode 100644 FFXIVClassic Proxy Server/PacketProcessor.cs create mode 100644 FFXIVClassic Proxy Server/Packets/Send/0x7ResponsePacket.cs diff --git a/FFXIVClassic Common Class Lib/SubPacket.cs b/FFXIVClassic Common Class Lib/SubPacket.cs index 199199d0..6cd3ff27 100644 --- a/FFXIVClassic Common Class Lib/SubPacket.cs +++ b/FFXIVClassic Common Class Lib/SubPacket.cs @@ -72,26 +72,38 @@ namespace FFXIVClassic.Common offset += header.subpacketSize; } - public SubPacket(ushort opcode, uint sourceId, uint targetId, byte[] data) + public SubPacket(ushort opcode, uint sourceId, uint targetId, byte[] data) : this(true, opcode, sourceId, targetId, data) { } + + public SubPacket(bool isGameMessage, ushort opcode, uint sourceId, uint targetId, byte[] data) { header = new SubPacketHeader(); - gameMessage = new GameMessageHeader(); - gameMessage.opcode = opcode; + if (isGameMessage) + { + gameMessage = new GameMessageHeader(); + gameMessage.opcode = opcode; + gameMessage.timestamp = Utils.UnixTimeStampUTC(); + gameMessage.unknown4 = 0x14; + gameMessage.unknown5 = 0x00; + gameMessage.unknown6 = 0x00; + } + header.sourceId = sourceId; header.targetId = targetId; - gameMessage.timestamp = Utils.UnixTimeStampUTC(); + if (isGameMessage) + header.type = 0x03; + else + header.type = opcode; - header.type = 0x03; header.unknown1 = 0x00; - gameMessage.unknown4 = 0x14; - gameMessage.unknown5 = 0x00; - gameMessage.unknown6 = 0x00; this.data = data; - header.subpacketSize = (ushort) (SUBPACKET_SIZE + GAMEMESSAGE_SIZE + data.Length); + header.subpacketSize = (ushort) (SUBPACKET_SIZE + data.Length); + + if (isGameMessage) + header.subpacketSize += GAMEMESSAGE_SIZE; } public SubPacket(SubPacket original, uint newTargetId) @@ -158,6 +170,6 @@ namespace FFXIVClassic.Common ConsoleOutputColor.DarkMagenta); } #endif - } + } } } \ No newline at end of file diff --git a/FFXIVClassic Proxy Server/DataObjects/ZoneServer.cs b/FFXIVClassic Proxy Server/DataObjects/ZoneServer.cs index eafe5dae..b3cf09e1 100644 --- a/FFXIVClassic Proxy Server/DataObjects/ZoneServer.cs +++ b/FFXIVClassic Proxy Server/DataObjects/ZoneServer.cs @@ -5,6 +5,7 @@ using System.Net; using System.Net.Sockets; using System.Text; using System.Threading.Tasks; +using FFXIVClassic.Common; namespace FFXIVClassic_World_Server.DataObjects { @@ -12,6 +13,7 @@ namespace FFXIVClassic_World_Server.DataObjects { public readonly string zoneServerIp; public readonly int zoneServerPort; + public readonly int[] ownedZoneIds; public bool isConnected = false; public Socket zoneServerConnection; @@ -36,5 +38,21 @@ namespace FFXIVClassic_World_Server.DataObjects catch (Exception e) { Program.Log.Error("Failed to connect"); return; } } + + public void SendPacket(SubPacket subpacket) + { + if (isConnected) + { + byte[] packetBytes = subpacket.GetBytes(); + + try + { + zoneServerConnection.Send(packetBytes); + } + catch (Exception e) + { Program.Log.Error("Weird case, socket was d/ced: {0}", e); } + } + } + } } diff --git a/FFXIVClassic Proxy Server/FFXIVClassic World Server.csproj b/FFXIVClassic Proxy Server/FFXIVClassic World Server.csproj index 8ef6fac2..403e4f77 100644 --- a/FFXIVClassic Proxy Server/FFXIVClassic World Server.csproj +++ b/FFXIVClassic Proxy Server/FFXIVClassic World Server.csproj @@ -49,6 +49,10 @@ ..\packages\NLog.4.3.5\lib\net45\NLog.dll True + + ..\packages\RabbitMQ.Client.4.0.0\lib\net451\RabbitMQ.Client.dll + True + diff --git a/FFXIVClassic Proxy Server/PacketProcessor.cs b/FFXIVClassic Proxy Server/PacketProcessor.cs new file mode 100644 index 00000000..d50c10ed --- /dev/null +++ b/FFXIVClassic Proxy Server/PacketProcessor.cs @@ -0,0 +1,133 @@ +using FFXIVClassic.Common; +using FFXIVClassic_World_Server.Packets.Send.Login; +using System; +using System.Collections.Generic; +using System.IO; +using System.Text; + +namespace FFXIVClassic_World_Server +{ + class PacketProcessor + { + /* + Session Creation: + + Get 0x1 from server + Send 0x7 + Send 0x2 + + Zone Change: + + Send 0x7 + Get 0x8 - Wait?? + Send 0x2 + */ + + + Server mServer; + List mConnections; + + public PacketProcessor(Server server) + { + mServer = server; + } + + public void ProcessPacket(ClientConnection client, BasePacket packet) + { + //if (packet.header.isCompressed == 0x01) + // BasePacket.DecryptPacket(client.blowfish, ref packet); + + List subPackets = packet.GetSubpackets(); + foreach (SubPacket subpacket in subPackets) + { + //Initial Connect Packet, Create session + if (subpacket.header.type == 0x01) + { + packet.DebugPrintPacket(); + byte[] reply1Data = { + 0x01, 0x00, 0x00, 0x00, 0x28, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x18, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFD, 0xFF, 0xFF, + 0xE5, 0x6E, 0x01, 0xE0, 0x00, 0x00, 0x00, 0x0 + }; + + byte[] reply2Data = { + 0x01, 0x00, 0x00, 0x00, 0x28, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0x2B, 0x5F, 0x26, + 0x66, 0x00, 0x00, 0x00, 0xC8, 0xD6, 0xAF, 0x2B, 0x38, 0x2B, 0x5F, 0x26, 0xB8, 0x8D, 0xF0, 0x2B, + 0xC8, 0xFD, 0x85, 0xFE, 0xA8, 0x7C, 0x5B, 0x09, 0x38, 0x2B, 0x5F, 0x26, 0xC8, 0xD6, 0xAF, 0x2B, + 0xB8, 0x8D, 0xF0, 0x2B, 0x88, 0xAF, 0x5E, 0x26 + }; + + BasePacket reply1 = new BasePacket(reply1Data); + BasePacket reply2 = new BasePacket(reply2Data); + + //Write Timestamp into Reply1 + using (MemoryStream mem = new MemoryStream(reply1.data)) + { + using (BinaryWriter binReader = new BinaryWriter(mem)) + { + binReader.BaseStream.Seek(0x14, SeekOrigin.Begin); + binReader.Write((UInt32)Utils.UnixTimeStampUTC()); + } + } + + //Read in Actor Id that owns this connection + uint actorID = 0; + using (MemoryStream mem = new MemoryStream(packet.data)) + { + using (BinaryReader binReader = new BinaryReader(mem)) + { + try + { + byte[] readIn = new byte[12]; + binReader.BaseStream.Seek(0x14, SeekOrigin.Begin); + binReader.Read(readIn, 0, 12); + actorID = UInt32.Parse(Encoding.ASCII.GetString(readIn)); + } + catch (Exception) + { } + } + } + + mServer.AddSession(actorID); + + if (packet.header.connectionType == BasePacket.TYPE_ZONE) + Program.Log.Info("Got {0} connection for ActorID {1} @ {2}.", "zone", actorID, client.GetAddress()); + else if (packet.header.connectionType == BasePacket.TYPE_CHAT) + Program.Log.Info("Got {0} connection for ActorID {1} @ {2}.", "chat", actorID, client.GetAddress()); + + break; + } + //Ping from World Server + else if (subpacket.header.type == 0x07) + { + SubPacket init = Login0x7ResponsePacket.BuildPacket(0x50); + client.QueuePacket(BasePacket.CreatePacket(init, true, false)); + } + //Zoning Related + else if (subpacket.header.type == 0x08) + { + //Response, client's current [actorID][time] + //BasePacket init = Login0x7ResponsePacket.BuildPacket(BitConverter.ToUInt32(packet.data, 0x10), Utils.UnixTimeStampUTC(), 0x07); + //client.QueuePacket(init); + packet.DebugPrintPacket(); + } + //Game Message + else if (subpacket.header.type == 0x03) + { + //Send to the correct zone server + uint targetSession = subpacket.header.targetId; + + if (mServer.GetSession(targetSession).routing1 != null) + mServer.GetSession(targetSession).routing1.SendPacket(subpacket); + + if (mServer.GetSession(targetSession).routing2 != null) + mServer.GetSession(targetSession).routing2.SendPacket(subpacket); + } + else + packet.DebugPrintPacket(); + } + } + + } +} diff --git a/FFXIVClassic Proxy Server/Packets/Send/0x7ResponsePacket.cs b/FFXIVClassic Proxy Server/Packets/Send/0x7ResponsePacket.cs new file mode 100644 index 00000000..8d5a92df --- /dev/null +++ b/FFXIVClassic Proxy Server/Packets/Send/0x7ResponsePacket.cs @@ -0,0 +1,31 @@ +using FFXIVClassic.Common; +using System; +using System.IO; + +namespace FFXIVClassic_World_Server.Packets.Send.Login +{ + class Login0x7ResponsePacket + { + public static SubPacket BuildPacket(uint actorID) + { + byte[] data = new byte[0x18]; + + using (MemoryStream mem = new MemoryStream(data)) + { + using (BinaryWriter binWriter = new BinaryWriter(mem)) + { + try + { + binWriter.Write((UInt32)actorID); + binWriter.Write((UInt32)type); + } + catch (Exception) + { + } + } + } + + return BasePacket.CreatePacket(data, false, false); + } + } +} diff --git a/FFXIVClassic Proxy Server/Server.cs b/FFXIVClassic Proxy Server/Server.cs index d02d8312..a24606f0 100644 --- a/FFXIVClassic Proxy Server/Server.cs +++ b/FFXIVClassic Proxy Server/Server.cs @@ -21,7 +21,8 @@ namespace FFXIVClassic_World_Server WorldManager worldManager; private List mConnectionList = new List(); - private Dictionary mSessionList = new Dictionary(); + private Dictionary mZoneSessionList = new Dictionary(); + private Dictionary mChatSessionList = new Dictionary(); public Server() { @@ -120,7 +121,36 @@ namespace FFXIVClassic_World_Server } mServerSocket.BeginAccept(new AsyncCallback(AcceptCallback), mServerSocket); } - } + } + + public void AddSession(uint id) + { + throw new NotImplementedException(); + } + + public void RemoveSession(uint id) + { + if (mChatSessionList.ContainsKey(id)) { + mChatSessionList[id].clientSocket.Disconnect(); + mConnectionList.Remove(mChatSessionList[id].clientSocket); + mChatSessionList.Remove(id); + } + + if (mZoneSessionList.ContainsKey(id)) + { + mZoneSessionList[id].clientSocket.Disconnect(); + mConnectionList.Remove(mZoneSessionList[id].clientSocket); + mZoneSessionList.Remove(id); + } + } + + public Session GetSession(uint targetSession) + { + if (mZoneSessionList.ContainsKey(targetSession)) + return mZoneSessionList[targetSession]; + else + return null; + } /// /// Receive Callback. Reads in incoming data, converting them to base packets. Base packets are sent to be parsed. If not enough data at the end to build a basepacket, move to the beginning and prepend. @@ -202,7 +232,7 @@ namespace FFXIVClassic_World_Server } } } - } + } /// /// Builds a packet from the incoming buffer + offset. If a packet can be built, it is returned else null. @@ -241,6 +271,11 @@ namespace FFXIVClassic_World_Server #endregion + + public WorldManager GetWorldManager() + { + return worldManager; + } } } diff --git a/FFXIVClassic Proxy Server/WorldMaster.cs b/FFXIVClassic Proxy Server/WorldMaster.cs index 40c47d60..b5f2ce12 100644 --- a/FFXIVClassic Proxy Server/WorldMaster.cs +++ b/FFXIVClassic Proxy Server/WorldMaster.cs @@ -88,10 +88,10 @@ namespace FFXIVClassic_World_Server public void DoZoneServerChange(Session session, uint zoneEntrance) { /* - ->Tell old server to save session info and remove + ->Tell old server to save session info and remove session. Start zone packets. ->Update the position to zoneEntrance ->Update routing - ->Tell new server to load session info and add + ->Tell new server to load session info and add session. Send end zone packets. */ } From 4aae16e458365fd82b56b2b6051940e10b80b69f Mon Sep 17 00:00:00 2001 From: Filip Maj Date: Wed, 24 Aug 2016 14:18:37 -0400 Subject: [PATCH 04/20] More session handling code added. --- FFXIVClassic Proxy Server/PacketProcessor.cs | 35 +++----- .../Packets/Receive/HelloPacket.cs | 36 ++++++++ .../Packets/Send/0x7ResponsePacket.cs | 12 +-- FFXIVClassic Proxy Server/Server.cs | 82 +++++++++++++------ 4 files changed, 109 insertions(+), 56 deletions(-) create mode 100644 FFXIVClassic Proxy Server/Packets/Receive/HelloPacket.cs diff --git a/FFXIVClassic Proxy Server/PacketProcessor.cs b/FFXIVClassic Proxy Server/PacketProcessor.cs index d50c10ed..0e385e63 100644 --- a/FFXIVClassic Proxy Server/PacketProcessor.cs +++ b/FFXIVClassic Proxy Server/PacketProcessor.cs @@ -1,4 +1,6 @@ using FFXIVClassic.Common; +using FFXIVClassic_World_Server.DataObjects; +using FFXIVClassic_World_Server.Packets.Receive; using FFXIVClassic_World_Server.Packets.Send.Login; using System; using System.Collections.Generic; @@ -42,7 +44,9 @@ namespace FFXIVClassic_World_Server { //Initial Connect Packet, Create session if (subpacket.header.type == 0x01) - { + { + + #region Hardcoded replies packet.DebugPrintPacket(); byte[] reply1Data = { 0x01, 0x00, 0x00, 0x00, 0x28, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -69,34 +73,15 @@ namespace FFXIVClassic_World_Server binReader.BaseStream.Seek(0x14, SeekOrigin.Begin); binReader.Write((UInt32)Utils.UnixTimeStampUTC()); } - } - - //Read in Actor Id that owns this connection - uint actorID = 0; - using (MemoryStream mem = new MemoryStream(packet.data)) - { - using (BinaryReader binReader = new BinaryReader(mem)) - { - try - { - byte[] readIn = new byte[12]; - binReader.BaseStream.Seek(0x14, SeekOrigin.Begin); - binReader.Read(readIn, 0, 12); - actorID = UInt32.Parse(Encoding.ASCII.GetString(readIn)); - } - catch (Exception) - { } - } } + #endregion + + HelloPacket hello = new HelloPacket(packet.data); - mServer.AddSession(actorID); - if (packet.header.connectionType == BasePacket.TYPE_ZONE) - Program.Log.Info("Got {0} connection for ActorID {1} @ {2}.", "zone", actorID, client.GetAddress()); + mServer.AddSession(client, Session.Channel.ZONE, hello.sessionId); else if (packet.header.connectionType == BasePacket.TYPE_CHAT) - Program.Log.Info("Got {0} connection for ActorID {1} @ {2}.", "chat", actorID, client.GetAddress()); - - break; + mServer.AddSession(client, Session.Channel.CHAT, hello.sessionId); } //Ping from World Server else if (subpacket.header.type == 0x07) diff --git a/FFXIVClassic Proxy Server/Packets/Receive/HelloPacket.cs b/FFXIVClassic Proxy Server/Packets/Receive/HelloPacket.cs new file mode 100644 index 00000000..6f2992e5 --- /dev/null +++ b/FFXIVClassic Proxy Server/Packets/Receive/HelloPacket.cs @@ -0,0 +1,36 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace FFXIVClassic_World_Server.Packets.Receive +{ + class HelloPacket + { + public bool invalidPacket = false; + public uint sessionId; + + public HelloPacket(byte[] data) + { + using (MemoryStream mem = new MemoryStream(data)) + { + using (BinaryReader binReader = new BinaryReader(mem)) + { + try + { + byte[] readIn = new byte[12]; + binReader.BaseStream.Seek(0x14, SeekOrigin.Begin); + binReader.Read(readIn, 0, 12); + sessionId = UInt32.Parse(Encoding.ASCII.GetString(readIn)); + } + catch (Exception) + { + invalidPacket = true; + } + } + } + } + } +} diff --git a/FFXIVClassic Proxy Server/Packets/Send/0x7ResponsePacket.cs b/FFXIVClassic Proxy Server/Packets/Send/0x7ResponsePacket.cs index 8d5a92df..7f3b2dc7 100644 --- a/FFXIVClassic Proxy Server/Packets/Send/0x7ResponsePacket.cs +++ b/FFXIVClassic Proxy Server/Packets/Send/0x7ResponsePacket.cs @@ -6,9 +6,12 @@ namespace FFXIVClassic_World_Server.Packets.Send.Login { class Login0x7ResponsePacket { + public const ushort OPCODE = 0x0008; + public const uint PACKET_SIZE = 0x18; + public static SubPacket BuildPacket(uint actorID) { - byte[] data = new byte[0x18]; + byte[] data = new byte[PACKET_SIZE]; using (MemoryStream mem = new MemoryStream(data)) { @@ -17,15 +20,14 @@ namespace FFXIVClassic_World_Server.Packets.Send.Login try { binWriter.Write((UInt32)actorID); - binWriter.Write((UInt32)type); + binWriter.Write((UInt32)Utils.UnixTimeStampUTC()); } catch (Exception) - { - } + {} } } - return BasePacket.CreatePacket(data, false, false); + return new SubPacket(false, OPCODE, 0, 0, data); } } } diff --git a/FFXIVClassic Proxy Server/Server.cs b/FFXIVClassic Proxy Server/Server.cs index a24606f0..b82ee279 100644 --- a/FFXIVClassic Proxy Server/Server.cs +++ b/FFXIVClassic Proxy Server/Server.cs @@ -18,7 +18,8 @@ namespace FFXIVClassic_World_Server private Socket mServerSocket; - WorldManager worldManager; + WorldManager mWorldManager; + PacketProcessor mPacketProcessor; private List mConnectionList = new List(); private Dictionary mZoneSessionList = new Dictionary(); @@ -36,9 +37,10 @@ namespace FFXIVClassic_World_Server public bool StartServer() { - worldManager = new WorldManager(this); - worldManager.LoadZoneServerList(); - worldManager.ConnectToZoneServers(); + mPacketProcessor = new PacketProcessor(this); + mWorldManager = new WorldManager(this); + mWorldManager.LoadZoneServerList(); + mWorldManager.ConnectToZoneServers(); IPEndPoint serverEndPoint = new System.Net.IPEndPoint(IPAddress.Parse(ConfigConstants.OPTIONS_BINDIP), int.Parse(ConfigConstants.OPTIONS_PORT)); @@ -123,33 +125,61 @@ namespace FFXIVClassic_World_Server } } - public void AddSession(uint id) + public void AddSession(ClientConnection connection, Session.Channel type, uint id) { - throw new NotImplementedException(); - } + Session session = new Session(id, connection, type); - public void RemoveSession(uint id) - { - if (mChatSessionList.ContainsKey(id)) { - mChatSessionList[id].clientSocket.Disconnect(); - mConnectionList.Remove(mChatSessionList[id].clientSocket); - mChatSessionList.Remove(id); - } - - if (mZoneSessionList.ContainsKey(id)) + switch (type) { - mZoneSessionList[id].clientSocket.Disconnect(); - mConnectionList.Remove(mZoneSessionList[id].clientSocket); - mZoneSessionList.Remove(id); + case Session.Channel.ZONE: + if (!mZoneSessionList.ContainsKey(id)) + mZoneSessionList.Add(id, session); + break; + case Session.Channel.CHAT: + if (!mChatSessionList.ContainsKey(id)) + mChatSessionList.Add(id, session); + break; } } - public Session GetSession(uint targetSession) + public void RemoveSession(Session.Channel type, uint id) { - if (mZoneSessionList.ContainsKey(targetSession)) - return mZoneSessionList[targetSession]; - else - return null; + switch (type) + { + case Session.Channel.ZONE: + if (mZoneSessionList.ContainsKey(id)) + { + mZoneSessionList[id].clientSocket.Disconnect(); + mConnectionList.Remove(mZoneSessionList[id].clientSocket); + mZoneSessionList.Remove(id); + } + break; + case Session.Channel.CHAT: + if (mChatSessionList.ContainsKey(id)) + { + mChatSessionList[id].clientSocket.Disconnect(); + mConnectionList.Remove(mChatSessionList[id].clientSocket); + mChatSessionList.Remove(id); + } + break; + } + } + + public Session GetSession(uint targetSession, Session.Channel type = Session.Channel.ZONE) + { + switch (type) + { + case Session.Channel.ZONE: + if (mZoneSessionList.ContainsKey(targetSession)) + return mZoneSessionList[targetSession]; + break; + case Session.Channel.CHAT: + if (mChatSessionList.ContainsKey(targetSession)) + return mChatSessionList[targetSession]; + break; + } + + return null; } /// @@ -191,7 +221,7 @@ namespace FFXIVClassic_World_Server break; else { - //mProcessor.ProcessPacket(conn, basePacket); + mPacketProcessor.ProcessPacket(conn, basePacket); } } @@ -274,7 +304,7 @@ namespace FFXIVClassic_World_Server public WorldManager GetWorldManager() { - return worldManager; + return mWorldManager; } } From 364ab40b3fa381f8e2ed8c0d514d47bf19dadbe2 Mon Sep 17 00:00:00 2001 From: Filip Maj Date: Wed, 24 Aug 2016 15:41:54 -0400 Subject: [PATCH 05/20] Added decompression/compression of packets. Cleaned up handshaking. --- FFXIVClassic Common Class Lib/BasePacket.cs | 23 +++++++++ FFXIVClassic Common Class Lib/packages.config | 1 + .../DataObjects/Session.cs | 9 ++-- .../FFXIVClassic World Server.csproj | 3 ++ FFXIVClassic Proxy Server/PacketProcessor.cs | 47 ++++--------------- .../Packets/Send/_0x2Packet.cs | 44 +++++++++++++++++ .../Packets/Send/_0x7Packet.cs | 37 +++++++++++++++ ...0x7ResponsePacket.cs => _0x8PingPacket.cs} | 2 +- 8 files changed, 123 insertions(+), 43 deletions(-) create mode 100644 FFXIVClassic Proxy Server/Packets/Send/_0x2Packet.cs create mode 100644 FFXIVClassic Proxy Server/Packets/Send/_0x7Packet.cs rename FFXIVClassic Proxy Server/Packets/Send/{0x7ResponsePacket.cs => _0x8PingPacket.cs} (96%) diff --git a/FFXIVClassic Common Class Lib/BasePacket.cs b/FFXIVClassic Common Class Lib/BasePacket.cs index 384dbc88..a6fb2a89 100644 --- a/FFXIVClassic Common Class Lib/BasePacket.cs +++ b/FFXIVClassic Common Class Lib/BasePacket.cs @@ -5,6 +5,7 @@ using System.IO; using System.Runtime.InteropServices; using NLog; using NLog.Targets; +using Ionic.Zlib; namespace FFXIVClassic.Common { @@ -346,6 +347,28 @@ namespace FFXIVClassic.Common } } + public static unsafe void DecompressPacket(ref BasePacket packet) + { + using (var compressedStream = new MemoryStream(packet.data)) + using (var zipStream = new ZlibStream(compressedStream, Ionic.Zlib.CompressionMode.Decompress)) + using (var resultStream = new MemoryStream()) + { + zipStream.CopyTo(resultStream); + packet.data = resultStream.ToArray(); + } + } + + public static unsafe void CompressPacket(ref BasePacket packet) + { + using (var compressedStream = new MemoryStream(packet.data)) + using (var zipStream = new ZlibStream(compressedStream, Ionic.Zlib.CompressionMode.Compress)) + using (var resultStream = new MemoryStream()) + { + zipStream.CopyTo(resultStream); + packet.data = resultStream.ToArray(); + } + } + #endregion } diff --git a/FFXIVClassic Common Class Lib/packages.config b/FFXIVClassic Common Class Lib/packages.config index 8b2d1420..5436126a 100644 --- a/FFXIVClassic Common Class Lib/packages.config +++ b/FFXIVClassic Common Class Lib/packages.config @@ -1,5 +1,6 @@  + \ No newline at end of file diff --git a/FFXIVClassic Proxy Server/DataObjects/Session.cs b/FFXIVClassic Proxy Server/DataObjects/Session.cs index 80e9011c..31f29e9d 100644 --- a/FFXIVClassic Proxy Server/DataObjects/Session.cs +++ b/FFXIVClassic Proxy Server/DataObjects/Session.cs @@ -11,16 +11,17 @@ namespace FFXIVClassic_World_Server.DataObjects { public enum Channel {ZONE, CHAT}; - public readonly ulong sessionId; - public readonly ClientConnection clientSocket; + public readonly uint sessionId; + public readonly ClientConnection clientConnection; public readonly Channel type; public ZoneServer routing1, routing2; - public Session(ulong sessionId, ClientConnection socket, Channel type) + public Session(ulong sessionId, ClientConnection connection, Channel type) { this.sessionId = sessionId; - this.clientSocket = socket; + this.clientConnection = connection; this.type = type; + connection.owner = this; } } diff --git a/FFXIVClassic Proxy Server/FFXIVClassic World Server.csproj b/FFXIVClassic Proxy Server/FFXIVClassic World Server.csproj index 403e4f77..52bf2d63 100644 --- a/FFXIVClassic Proxy Server/FFXIVClassic World Server.csproj +++ b/FFXIVClassic Proxy Server/FFXIVClassic World Server.csproj @@ -67,6 +67,9 @@ + + + diff --git a/FFXIVClassic Proxy Server/PacketProcessor.cs b/FFXIVClassic Proxy Server/PacketProcessor.cs index 0e385e63..6b57605c 100644 --- a/FFXIVClassic Proxy Server/PacketProcessor.cs +++ b/FFXIVClassic Proxy Server/PacketProcessor.cs @@ -1,11 +1,11 @@ using FFXIVClassic.Common; using FFXIVClassic_World_Server.DataObjects; using FFXIVClassic_World_Server.Packets.Receive; +using FFXIVClassic_World_Server.Packets.Send; using FFXIVClassic_World_Server.Packets.Send.Login; using System; using System.Collections.Generic; using System.IO; -using System.Text; namespace FFXIVClassic_World_Server { @@ -27,7 +27,6 @@ namespace FFXIVClassic_World_Server Server mServer; - List mConnections; public PacketProcessor(Server server) { @@ -36,57 +35,29 @@ namespace FFXIVClassic_World_Server public void ProcessPacket(ClientConnection client, BasePacket packet) { - //if (packet.header.isCompressed == 0x01) - // BasePacket.DecryptPacket(client.blowfish, ref packet); + if (packet.header.isCompressed == 0x01) + BasePacket.DecompressPacket(ref packet); List subPackets = packet.GetSubpackets(); foreach (SubPacket subpacket in subPackets) { //Initial Connect Packet, Create session if (subpacket.header.type == 0x01) - { - - #region Hardcoded replies - packet.DebugPrintPacket(); - byte[] reply1Data = { - 0x01, 0x00, 0x00, 0x00, 0x28, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x18, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFD, 0xFF, 0xFF, - 0xE5, 0x6E, 0x01, 0xE0, 0x00, 0x00, 0x00, 0x0 - }; - - byte[] reply2Data = { - 0x01, 0x00, 0x00, 0x00, 0x28, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x38, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0x2B, 0x5F, 0x26, - 0x66, 0x00, 0x00, 0x00, 0xC8, 0xD6, 0xAF, 0x2B, 0x38, 0x2B, 0x5F, 0x26, 0xB8, 0x8D, 0xF0, 0x2B, - 0xC8, 0xFD, 0x85, 0xFE, 0xA8, 0x7C, 0x5B, 0x09, 0x38, 0x2B, 0x5F, 0x26, 0xC8, 0xD6, 0xAF, 0x2B, - 0xB8, 0x8D, 0xF0, 0x2B, 0x88, 0xAF, 0x5E, 0x26 - }; - - BasePacket reply1 = new BasePacket(reply1Data); - BasePacket reply2 = new BasePacket(reply2Data); - - //Write Timestamp into Reply1 - using (MemoryStream mem = new MemoryStream(reply1.data)) - { - using (BinaryWriter binReader = new BinaryWriter(mem)) - { - binReader.BaseStream.Seek(0x14, SeekOrigin.Begin); - binReader.Write((UInt32)Utils.UnixTimeStampUTC()); - } - } - #endregion - + { HelloPacket hello = new HelloPacket(packet.data); if (packet.header.connectionType == BasePacket.TYPE_ZONE) mServer.AddSession(client, Session.Channel.ZONE, hello.sessionId); else if (packet.header.connectionType == BasePacket.TYPE_CHAT) - mServer.AddSession(client, Session.Channel.CHAT, hello.sessionId); + mServer.AddSession(client, Session.Channel.CHAT, hello.sessionId); + + client.QueuePacket(_0x7Packet.BuildPacket(0x0E016EE5), true, false); + client.QueuePacket(_0x2Packet.BuildPacket(hello.sessionId), true, false); } //Ping from World Server else if (subpacket.header.type == 0x07) { - SubPacket init = Login0x7ResponsePacket.BuildPacket(0x50); + SubPacket init = _0x8PingPacket.BuildPacket(client.owner.sessionId); client.QueuePacket(BasePacket.CreatePacket(init, true, false)); } //Zoning Related diff --git a/FFXIVClassic Proxy Server/Packets/Send/_0x2Packet.cs b/FFXIVClassic Proxy Server/Packets/Send/_0x2Packet.cs new file mode 100644 index 00000000..3497e935 --- /dev/null +++ b/FFXIVClassic Proxy Server/Packets/Send/_0x2Packet.cs @@ -0,0 +1,44 @@ +using FFXIVClassic.Common; +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace FFXIVClassic_World_Server.Packets.Send +{ + class _0x2Packet + { + public const ushort OPCODE = 0x0002; + public const uint PACKET_SIZE = 0x38; + + public static SubPacket BuildPacket(uint actorID) + { + byte[] data = new byte[PACKET_SIZE]; + + using (MemoryStream mem = new MemoryStream(data)) + { + using (BinaryWriter binWriter = new BinaryWriter(mem)) + { + try + { + binWriter.Write((UInt32)actorID); + } + catch (Exception) + { } + } + } + + byte[] reply2Data = { + 0x66, 0x00, 0x00, 0x00, 0xC8, 0xD6, 0xAF, 0x2B, 0x38, 0x2B, 0x5F, 0x26, 0xB8, 0x8D, 0xF0, 0x2B, + 0xC8, 0xFD, 0x85, 0xFE, 0xA8, 0x7C, 0x5B, 0x09, 0x38, 0x2B, 0x5F, 0x26, 0xC8, 0xD6, 0xAF, 0x2B, + 0xB8, 0x8D, 0xF0, 0x2B, 0x88, 0xAF, 0x5E, 0x26 + }; + + data = reply2Data; + + return new SubPacket(false, OPCODE, 0, 0, data); + } + } +} diff --git a/FFXIVClassic Proxy Server/Packets/Send/_0x7Packet.cs b/FFXIVClassic Proxy Server/Packets/Send/_0x7Packet.cs new file mode 100644 index 00000000..f0854229 --- /dev/null +++ b/FFXIVClassic Proxy Server/Packets/Send/_0x7Packet.cs @@ -0,0 +1,37 @@ +using FFXIVClassic.Common; +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace FFXIVClassic_World_Server.Packets.Send +{ + class _0x7Packet + { + public const ushort OPCODE = 0x0007; + public const uint PACKET_SIZE = 0x18; + + public static SubPacket BuildPacket(uint actorID) + { + byte[] data = new byte[PACKET_SIZE]; + + using (MemoryStream mem = new MemoryStream(data)) + { + using (BinaryWriter binWriter = new BinaryWriter(mem)) + { + try + { + binWriter.Write((UInt32)actorID); + binWriter.Write((UInt32)Utils.UnixTimeStampUTC()); + } + catch (Exception) + { } + } + } + + return new SubPacket(false, OPCODE, 0, 0, data); + } + } +} diff --git a/FFXIVClassic Proxy Server/Packets/Send/0x7ResponsePacket.cs b/FFXIVClassic Proxy Server/Packets/Send/_0x8PingPacket.cs similarity index 96% rename from FFXIVClassic Proxy Server/Packets/Send/0x7ResponsePacket.cs rename to FFXIVClassic Proxy Server/Packets/Send/_0x8PingPacket.cs index 7f3b2dc7..21061c7e 100644 --- a/FFXIVClassic Proxy Server/Packets/Send/0x7ResponsePacket.cs +++ b/FFXIVClassic Proxy Server/Packets/Send/_0x8PingPacket.cs @@ -4,7 +4,7 @@ using System.IO; namespace FFXIVClassic_World_Server.Packets.Send.Login { - class Login0x7ResponsePacket + class _0x8PingPacket { public const ushort OPCODE = 0x0008; public const uint PACKET_SIZE = 0x18; From bd26a71fefe3a8e2affbe7a6c6d967de8064506a Mon Sep 17 00:00:00 2001 From: Filip Maj Date: Sun, 28 Aug 2016 14:25:37 -0400 Subject: [PATCH 06/20] Changed folder from Proxy to World. Did some nlog configing. --- .../FFXIVClassic Common Class Lib.csproj | 3 +++ FFXIVClassic Lobby Server/NLog.config | 6 +++--- .../App.config | 10 +++++----- .../ConfigConstants.cs | 8 ++++---- .../DataObjects/ClientConnection.cs | 0 .../DataObjects/Session.cs | 2 +- .../DataObjects/ZoneServer.cs | 0 .../FFXIVClassic World Server.csproj | 7 +++++-- .../NLog.config | 6 +++--- .../NLog.xsd | 0 .../PacketProcessor.cs | 2 ++ .../Packets/Receive/HelloPacket.cs | 0 .../Packets/Send/_0x2Packet.cs | 0 .../Packets/Send/_0x7Packet.cs | 0 .../Packets/Send/_0x8PingPacket.cs | 0 .../Program.cs | 0 .../Properties/AssemblyInfo.cs | 0 .../Server.cs | 8 ++++---- .../WorldMaster.cs | 0 .../packages.config | 2 +- FFXIVClassic.sln | 2 +- 21 files changed, 32 insertions(+), 24 deletions(-) rename {FFXIVClassic Proxy Server => FFXIVClassic World Server}/App.config (64%) rename {FFXIVClassic Proxy Server => FFXIVClassic World Server}/ConfigConstants.cs (87%) rename {FFXIVClassic Proxy Server => FFXIVClassic World Server}/DataObjects/ClientConnection.cs (100%) rename {FFXIVClassic Proxy Server => FFXIVClassic World Server}/DataObjects/Session.cs (88%) rename {FFXIVClassic Proxy Server => FFXIVClassic World Server}/DataObjects/ZoneServer.cs (100%) rename {FFXIVClassic Proxy Server => FFXIVClassic World Server}/FFXIVClassic World Server.csproj (95%) rename {FFXIVClassic Proxy Server => FFXIVClassic World Server}/NLog.config (85%) rename {FFXIVClassic Proxy Server => FFXIVClassic World Server}/NLog.xsd (100%) rename {FFXIVClassic Proxy Server => FFXIVClassic World Server}/PacketProcessor.cs (98%) rename {FFXIVClassic Proxy Server => FFXIVClassic World Server}/Packets/Receive/HelloPacket.cs (100%) rename {FFXIVClassic Proxy Server => FFXIVClassic World Server}/Packets/Send/_0x2Packet.cs (100%) rename {FFXIVClassic Proxy Server => FFXIVClassic World Server}/Packets/Send/_0x7Packet.cs (100%) rename {FFXIVClassic Proxy Server => FFXIVClassic World Server}/Packets/Send/_0x8PingPacket.cs (100%) rename {FFXIVClassic Proxy Server => FFXIVClassic World Server}/Program.cs (100%) rename {FFXIVClassic Proxy Server => FFXIVClassic World Server}/Properties/AssemblyInfo.cs (100%) rename {FFXIVClassic Proxy Server => FFXIVClassic World Server}/Server.cs (98%) rename {FFXIVClassic Proxy Server => FFXIVClassic World Server}/WorldMaster.cs (100%) rename {FFXIVClassic Proxy Server => FFXIVClassic World Server}/packages.config (93%) diff --git a/FFXIVClassic Common Class Lib/FFXIVClassic Common Class Lib.csproj b/FFXIVClassic Common Class Lib/FFXIVClassic Common Class Lib.csproj index df116585..2e8748d0 100644 --- a/FFXIVClassic Common Class Lib/FFXIVClassic Common Class Lib.csproj +++ b/FFXIVClassic Common Class Lib/FFXIVClassic Common Class Lib.csproj @@ -36,6 +36,9 @@ false + + ..\packages\DotNetZip.1.10.1\lib\net20\DotNetZip.dll + ..\packages\MySql.Data.6.9.8\lib\net45\MySql.Data.dll True diff --git a/FFXIVClassic Lobby Server/NLog.config b/FFXIVClassic Lobby Server/NLog.config index 2384b15b..4463f999 100644 --- a/FFXIVClassic Lobby Server/NLog.config +++ b/FFXIVClassic Lobby Server/NLog.config @@ -38,13 +38,13 @@ diff --git a/FFXIVClassic Proxy Server/App.config b/FFXIVClassic World Server/App.config similarity index 64% rename from FFXIVClassic Proxy Server/App.config rename to FFXIVClassic World Server/App.config index 78cae18f..329f3599 100644 --- a/FFXIVClassic Proxy Server/App.config +++ b/FFXIVClassic World Server/App.config @@ -1,11 +1,11 @@ - + - + - - + + - \ No newline at end of file + diff --git a/FFXIVClassic Proxy Server/ConfigConstants.cs b/FFXIVClassic World Server/ConfigConstants.cs similarity index 87% rename from FFXIVClassic Proxy Server/ConfigConstants.cs rename to FFXIVClassic World Server/ConfigConstants.cs index dff311f8..028ad36a 100644 --- a/FFXIVClassic Proxy Server/ConfigConstants.cs +++ b/FFXIVClassic World Server/ConfigConstants.cs @@ -18,18 +18,18 @@ namespace FFXIVClassic_World_Server public static bool Load() { - Program.Log.Info("Loading world_config.ini"); + Program.Log.Info("Loading config.ini"); - if (!File.Exists("./world_config.ini")) + if (!File.Exists("./config.ini")) { Program.Log.Error("FILE NOT FOUND!"); return false; } - INIFile configIni = new INIFile("./world_config.ini"); + INIFile configIni = new INIFile("./config.ini"); ConfigConstants.OPTIONS_BINDIP = configIni.GetValue("General", "server_ip", "127.0.0.1"); - ConfigConstants.OPTIONS_PORT = configIni.GetValue("General", "server_port", "54994"); + ConfigConstants.OPTIONS_PORT = configIni.GetValue("General", "server_port", "54992"); ConfigConstants.OPTIONS_TIMESTAMP = configIni.GetValue("General", "showtimestamp", "true").ToLower().Equals("true"); ConfigConstants.DATABASE_HOST = configIni.GetValue("Database", "host", ""); diff --git a/FFXIVClassic Proxy Server/DataObjects/ClientConnection.cs b/FFXIVClassic World Server/DataObjects/ClientConnection.cs similarity index 100% rename from FFXIVClassic Proxy Server/DataObjects/ClientConnection.cs rename to FFXIVClassic World Server/DataObjects/ClientConnection.cs diff --git a/FFXIVClassic Proxy Server/DataObjects/Session.cs b/FFXIVClassic World Server/DataObjects/Session.cs similarity index 88% rename from FFXIVClassic Proxy Server/DataObjects/Session.cs rename to FFXIVClassic World Server/DataObjects/Session.cs index 31f29e9d..4bebf269 100644 --- a/FFXIVClassic Proxy Server/DataObjects/Session.cs +++ b/FFXIVClassic World Server/DataObjects/Session.cs @@ -16,7 +16,7 @@ namespace FFXIVClassic_World_Server.DataObjects public readonly Channel type; public ZoneServer routing1, routing2; - public Session(ulong sessionId, ClientConnection connection, Channel type) + public Session(uint sessionId, ClientConnection connection, Channel type) { this.sessionId = sessionId; this.clientConnection = connection; diff --git a/FFXIVClassic Proxy Server/DataObjects/ZoneServer.cs b/FFXIVClassic World Server/DataObjects/ZoneServer.cs similarity index 100% rename from FFXIVClassic Proxy Server/DataObjects/ZoneServer.cs rename to FFXIVClassic World Server/DataObjects/ZoneServer.cs diff --git a/FFXIVClassic Proxy Server/FFXIVClassic World Server.csproj b/FFXIVClassic World Server/FFXIVClassic World Server.csproj similarity index 95% rename from FFXIVClassic Proxy Server/FFXIVClassic World Server.csproj rename to FFXIVClassic World Server/FFXIVClassic World Server.csproj index 52bf2d63..a2b0cb76 100644 --- a/FFXIVClassic Proxy Server/FFXIVClassic World Server.csproj +++ b/FFXIVClassic World Server/FFXIVClassic World Server.csproj @@ -9,9 +9,10 @@ Properties FFXIVClassic_World_Server FFXIVClassic World Server - v4.5.2 + v4.5 512 true + AnyCPU @@ -69,7 +70,9 @@ - + + + diff --git a/FFXIVClassic Proxy Server/NLog.config b/FFXIVClassic World Server/NLog.config similarity index 85% rename from FFXIVClassic Proxy Server/NLog.config rename to FFXIVClassic World Server/NLog.config index 917f8554..aea50410 100644 --- a/FFXIVClassic Proxy Server/NLog.config +++ b/FFXIVClassic World Server/NLog.config @@ -38,13 +38,13 @@ diff --git a/FFXIVClassic Proxy Server/NLog.xsd b/FFXIVClassic World Server/NLog.xsd similarity index 100% rename from FFXIVClassic Proxy Server/NLog.xsd rename to FFXIVClassic World Server/NLog.xsd diff --git a/FFXIVClassic Proxy Server/PacketProcessor.cs b/FFXIVClassic World Server/PacketProcessor.cs similarity index 98% rename from FFXIVClassic Proxy Server/PacketProcessor.cs rename to FFXIVClassic World Server/PacketProcessor.cs index 6b57605c..f4b32176 100644 --- a/FFXIVClassic Proxy Server/PacketProcessor.cs +++ b/FFXIVClassic World Server/PacketProcessor.cs @@ -41,6 +41,8 @@ namespace FFXIVClassic_World_Server List subPackets = packet.GetSubpackets(); foreach (SubPacket subpacket in subPackets) { + subpacket.DebugPrintSubPacket(); + //Initial Connect Packet, Create session if (subpacket.header.type == 0x01) { diff --git a/FFXIVClassic Proxy Server/Packets/Receive/HelloPacket.cs b/FFXIVClassic World Server/Packets/Receive/HelloPacket.cs similarity index 100% rename from FFXIVClassic Proxy Server/Packets/Receive/HelloPacket.cs rename to FFXIVClassic World Server/Packets/Receive/HelloPacket.cs diff --git a/FFXIVClassic Proxy Server/Packets/Send/_0x2Packet.cs b/FFXIVClassic World Server/Packets/Send/_0x2Packet.cs similarity index 100% rename from FFXIVClassic Proxy Server/Packets/Send/_0x2Packet.cs rename to FFXIVClassic World Server/Packets/Send/_0x2Packet.cs diff --git a/FFXIVClassic Proxy Server/Packets/Send/_0x7Packet.cs b/FFXIVClassic World Server/Packets/Send/_0x7Packet.cs similarity index 100% rename from FFXIVClassic Proxy Server/Packets/Send/_0x7Packet.cs rename to FFXIVClassic World Server/Packets/Send/_0x7Packet.cs diff --git a/FFXIVClassic Proxy Server/Packets/Send/_0x8PingPacket.cs b/FFXIVClassic World Server/Packets/Send/_0x8PingPacket.cs similarity index 100% rename from FFXIVClassic Proxy Server/Packets/Send/_0x8PingPacket.cs rename to FFXIVClassic World Server/Packets/Send/_0x8PingPacket.cs diff --git a/FFXIVClassic Proxy Server/Program.cs b/FFXIVClassic World Server/Program.cs similarity index 100% rename from FFXIVClassic Proxy Server/Program.cs rename to FFXIVClassic World Server/Program.cs diff --git a/FFXIVClassic Proxy Server/Properties/AssemblyInfo.cs b/FFXIVClassic World Server/Properties/AssemblyInfo.cs similarity index 100% rename from FFXIVClassic Proxy Server/Properties/AssemblyInfo.cs rename to FFXIVClassic World Server/Properties/AssemblyInfo.cs diff --git a/FFXIVClassic Proxy Server/Server.cs b/FFXIVClassic World Server/Server.cs similarity index 98% rename from FFXIVClassic Proxy Server/Server.cs rename to FFXIVClassic World Server/Server.cs index b82ee279..1a71b338 100644 --- a/FFXIVClassic Proxy Server/Server.cs +++ b/FFXIVClassic World Server/Server.cs @@ -149,16 +149,16 @@ namespace FFXIVClassic_World_Server case Session.Channel.ZONE: if (mZoneSessionList.ContainsKey(id)) { - mZoneSessionList[id].clientSocket.Disconnect(); - mConnectionList.Remove(mZoneSessionList[id].clientSocket); + mZoneSessionList[id].clientConnection.Disconnect(); + mConnectionList.Remove(mZoneSessionList[id].clientConnection); mZoneSessionList.Remove(id); } break; case Session.Channel.CHAT: if (mChatSessionList.ContainsKey(id)) { - mChatSessionList[id].clientSocket.Disconnect(); - mConnectionList.Remove(mChatSessionList[id].clientSocket); + mChatSessionList[id].clientConnection.Disconnect(); + mConnectionList.Remove(mChatSessionList[id].clientConnection); mChatSessionList.Remove(id); } break; diff --git a/FFXIVClassic Proxy Server/WorldMaster.cs b/FFXIVClassic World Server/WorldMaster.cs similarity index 100% rename from FFXIVClassic Proxy Server/WorldMaster.cs rename to FFXIVClassic World Server/WorldMaster.cs diff --git a/FFXIVClassic Proxy Server/packages.config b/FFXIVClassic World Server/packages.config similarity index 93% rename from FFXIVClassic Proxy Server/packages.config rename to FFXIVClassic World Server/packages.config index 043c0d66..6de55267 100644 --- a/FFXIVClassic Proxy Server/packages.config +++ b/FFXIVClassic World Server/packages.config @@ -6,5 +6,5 @@ - + \ No newline at end of file diff --git a/FFXIVClassic.sln b/FFXIVClassic.sln index 9c2838fe..b79d9e72 100644 --- a/FFXIVClassic.sln +++ b/FFXIVClassic.sln @@ -15,7 +15,7 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FFXIVClassic Lobby Server", 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 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FFXIVClassic World Server", "FFXIVClassic Proxy Server\FFXIVClassic World Server.csproj", "{3067889D-8A50-40D6-9CD5-23AA8EA96F26}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FFXIVClassic World Server", "FFXIVClassic World Server\FFXIVClassic World Server.csproj", "{3067889D-8A50-40D6-9CD5-23AA8EA96F26}" ProjectSection(ProjectDependencies) = postProject {3A3D6626-C820-4C18-8C81-64811424F20E} = {3A3D6626-C820-4C18-8C81-64811424F20E} EndProjectSection From 6bffe69b21ca6e0313819c33894aed2fba6fff3f Mon Sep 17 00:00:00 2001 From: Filip Maj Date: Mon, 29 Aug 2016 08:17:14 -0400 Subject: [PATCH 07/20] More work on the world server. Modified map server to communicate with it. --- FFXIVClassic Common Class Lib/BasePacket.cs | 35 + FFXIVClassic Common Class Lib/SubPacket.cs | 38 ++ FFXIVClassic Map Server/CommandProcessor.cs | 2 +- FFXIVClassic Map Server/ConfigConstants.cs | 2 +- .../FFXIVClassic Map Server.csproj | 2 +- FFXIVClassic Map Server/PacketProcessor.cs | 596 +++++++----------- FFXIVClassic Map Server/Server.cs | 96 +-- ...{ClientConnection.cs => ZoneConnection.cs} | 17 +- .../dataobjects/ConnectedPlayer.cs | 36 +- FFXIVClassic World Server/ConfigConstants.cs | 6 +- .../DataObjects/ZoneServer.cs | 81 +++ FFXIVClassic World Server/NLog.config | 1 + FFXIVClassic World Server/PacketProcessor.cs | 3 +- .../Packets/Send/_0x2Packet.cs | 10 +- FFXIVClassic World Server/Server.cs | 157 ++--- FFXIVClassic World Server/WorldMaster.cs | 2 +- 16 files changed, 507 insertions(+), 577 deletions(-) rename FFXIVClassic Map Server/{ClientConnection.cs => ZoneConnection.cs} (72%) diff --git a/FFXIVClassic Common Class Lib/BasePacket.cs b/FFXIVClassic Common Class Lib/BasePacket.cs index a6fb2a89..9f9a4c4c 100644 --- a/FFXIVClassic Common Class Lib/BasePacket.cs +++ b/FFXIVClassic Common Class Lib/BasePacket.cs @@ -295,6 +295,41 @@ namespace FFXIVClassic.Common return packet; } + /// + /// Builds a packet from the incoming buffer + offset. If a packet can be built, it is returned else null. + /// + /// Current offset in buffer. + /// Incoming buffer. + /// Returns either a BasePacket or null if not enough data. + public static BasePacket CreatePacket(ref int offset, byte[] buffer, int bytesRead) + { + BasePacket newPacket = null; + + //Too small to even get length + if (bytesRead <= offset) + return null; + + ushort packetSize = BitConverter.ToUInt16(buffer, offset); + + //Too small to whole packet + if (bytesRead < offset + packetSize) + return null; + + if (buffer.Length < offset + packetSize) + return null; + + try + { + newPacket = new BasePacket(buffer, ref offset); + } + catch (OverflowException) + { + return null; + } + + return newPacket; + } + public static unsafe void EncryptPacket(Blowfish blowfish, BasePacket packet) { var data = packet.data; diff --git a/FFXIVClassic Common Class Lib/SubPacket.cs b/FFXIVClassic Common Class Lib/SubPacket.cs index 6cd3ff27..38394e29 100644 --- a/FFXIVClassic Common Class Lib/SubPacket.cs +++ b/FFXIVClassic Common Class Lib/SubPacket.cs @@ -153,6 +153,41 @@ namespace FFXIVClassic.Common return outBytes; } + /// + /// Builds a packet from the incoming buffer + offset. If a packet can be built, it is returned else null. + /// + /// Current offset in buffer. + /// Incoming buffer. + /// Returns either a BasePacket or null if not enough data. + public static SubPacket CreatePacket(ref int offset, byte[] buffer, int bytesRead) + { + SubPacket newPacket = null; + + //Too small to even get length + if (bytesRead <= offset) + return null; + + ushort packetSize = BitConverter.ToUInt16(buffer, offset); + + //Too small to whole packet + if (bytesRead < offset + packetSize) + return null; + + if (buffer.Length < offset + packetSize) + return null; + + try + { + newPacket = new SubPacket(buffer, ref offset); + } + catch (OverflowException) + { + return null; + } + + return newPacket; + } + public void DebugPrintSubPacket() { #if DEBUG @@ -169,6 +204,9 @@ namespace FFXIVClassic.Common logger.ColorDebug(Utils.ByteArrayToHex(data, SUBPACKET_SIZE + GAMEMESSAGE_SIZE), ConsoleOutputColor.DarkMagenta); } + else + logger.ColorDebug(Utils.ByteArrayToHex(data, SUBPACKET_SIZE), + ConsoleOutputColor.DarkMagenta); #endif } } diff --git a/FFXIVClassic Map Server/CommandProcessor.cs b/FFXIVClassic Map Server/CommandProcessor.cs index 3936a2b7..af5860ed 100644 --- a/FFXIVClassic Map Server/CommandProcessor.cs +++ b/FFXIVClassic Map Server/CommandProcessor.cs @@ -88,7 +88,7 @@ namespace FFXIVClassic_Map_Server if (cmd.Any()) { // if client isnt null, take player to be the player actor - var player = client?.GetActor(); + var player = client.GetActor(); if (cmd.Equals("help")) { diff --git a/FFXIVClassic Map Server/ConfigConstants.cs b/FFXIVClassic Map Server/ConfigConstants.cs index cf4006e6..c3ea8d54 100644 --- a/FFXIVClassic Map Server/ConfigConstants.cs +++ b/FFXIVClassic Map Server/ConfigConstants.cs @@ -30,7 +30,7 @@ namespace FFXIVClassic_Map_Server INIFile configIni = new INIFile("./map_config.ini"); ConfigConstants.OPTIONS_BINDIP = configIni.GetValue("General", "server_ip", "127.0.0.1"); - ConfigConstants.OPTIONS_PORT = configIni.GetValue("General", "server_port", "54992"); + ConfigConstants.OPTIONS_PORT = configIni.GetValue("General", "server_port", "1989"); ConfigConstants.OPTIONS_TIMESTAMP = configIni.GetValue("General", "showtimestamp", "true").ToLower().Equals("true"); ConfigConstants.DATABASE_WORLDID = UInt32.Parse(configIni.GetValue("Database", "worldid", "0")); diff --git a/FFXIVClassic Map Server/FFXIVClassic Map Server.csproj b/FFXIVClassic Map Server/FFXIVClassic Map Server.csproj index d71ab75b..ff2afdbc 100644 --- a/FFXIVClassic Map Server/FFXIVClassic Map Server.csproj +++ b/FFXIVClassic Map Server/FFXIVClassic Map Server.csproj @@ -91,7 +91,7 @@ - + diff --git a/FFXIVClassic Map Server/PacketProcessor.cs b/FFXIVClassic Map Server/PacketProcessor.cs index a6673c93..1fb84ba4 100644 --- a/FFXIVClassic Map Server/PacketProcessor.cs +++ b/FFXIVClassic Map Server/PacketProcessor.cs @@ -26,393 +26,283 @@ namespace FFXIVClassic_Map_Server Server mServer; CommandProcessor cp; Dictionary mPlayers; - List mConnections; - public PacketProcessor(Server server, Dictionary playerList, List connectionList) + public PacketProcessor(Server server, Dictionary playerList) { mPlayers = playerList; - mConnections = connectionList; mServer = server; cp = new CommandProcessor(playerList); } - public void ProcessPacket(ClientConnection client, BasePacket packet) + public void ProcessPacket(ZoneConnection client, SubPacket subpacket) { - if (packet.header.isCompressed == 0x01) - BasePacket.DecryptPacket(client.blowfish, ref packet); + + ConnectedPlayer player = null; - List subPackets = packet.GetSubpackets(); - foreach (SubPacket subpacket in subPackets) - { - if (subpacket.header.type == 0x01) - { - packet.DebugPrintPacket(); - byte[] reply1Data = { - 0x01, 0x00, 0x00, 0x00, 0x28, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x18, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFD, 0xFF, 0xFF, - 0xE5, 0x6E, 0x01, 0xE0, 0x00, 0x00, 0x00, 0x0 - }; + if(mPlayers.ContainsKey(subpacket.header.targetId)) + player = mPlayers[subpacket.header.targetId]; - byte[] reply2Data = { - 0x01, 0x00, 0x00, 0x00, 0x28, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x38, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0x2B, 0x5F, 0x26, - 0x66, 0x00, 0x00, 0x00, 0xC8, 0xD6, 0xAF, 0x2B, 0x38, 0x2B, 0x5F, 0x26, 0xB8, 0x8D, 0xF0, 0x2B, - 0xC8, 0xFD, 0x85, 0xFE, 0xA8, 0x7C, 0x5B, 0x09, 0x38, 0x2B, 0x5F, 0x26, 0xC8, 0xD6, 0xAF, 0x2B, - 0xB8, 0x8D, 0xF0, 0x2B, 0x88, 0xAF, 0x5E, 0x26 - }; - - BasePacket reply1 = new BasePacket(reply1Data); - BasePacket reply2 = new BasePacket(reply2Data); - - //Write Timestamp into Reply1 - using (MemoryStream mem = new MemoryStream(reply1.data)) - { - using (BinaryWriter binReader = new BinaryWriter(mem)) - { - binReader.BaseStream.Seek(0x14, SeekOrigin.Begin); - binReader.Write((UInt32)Utils.UnixTimeStampUTC()); - } - } - - //Read in Actor Id that owns this connection - uint actorID = 0; - using (MemoryStream mem = new MemoryStream(packet.data)) - { - using (BinaryReader binReader = new BinaryReader(mem)) - { - try - { - byte[] readIn = new byte[12]; - binReader.BaseStream.Seek(0x14, SeekOrigin.Begin); - binReader.Read(readIn, 0, 12); - actorID = UInt32.Parse(Encoding.ASCII.GetString(readIn)); - } - catch (Exception) - { } - } - } - - //Should never happen.... unless actor id IS 0! - if (actorID == 0) - break; - - client.owner = actorID; - - //Write Actor ID into reply2 - using (MemoryStream mem = new MemoryStream(reply2.data)) - { - using (BinaryWriter binReader = new BinaryWriter(mem)) - { - binReader.BaseStream.Seek(0x10, SeekOrigin.Begin); - binReader.Write(actorID); - } - } - - ConnectedPlayer player = null; - - if (packet.header.connectionType == BasePacket.TYPE_ZONE) - { - while (mPlayers != null && !mPlayers.ContainsKey(client.owner)) - { } - player = mPlayers[client.owner]; - } - - //Create connected player if not Created - if (player == null) - { - player = new ConnectedPlayer(actorID); - mPlayers[actorID] = player; - } - - player.SetConnection(packet.header.connectionType, client); - - if (packet.header.connectionType == BasePacket.TYPE_ZONE) - Program.Log.Info("Got {0} connection for ActorID {1} @ {2}.", "zone", actorID, client.GetAddress()); - else if (packet.header.connectionType == BasePacket.TYPE_CHAT) - Program.Log.Info("Got {0} connection for ActorID {1} @ {2}.", "chat", actorID, client.GetAddress()); - - //Create player actor - reply1.DebugPrintPacket(); - client.QueuePacket(reply1); - client.QueuePacket(reply2); - break; - } - else if (subpacket.header.type == 0x07) - { - BasePacket init = Login0x7ResponsePacket.BuildPacket(BitConverter.ToUInt32(packet.data, 0x10), Utils.UnixTimeStampUTC(), 0x08); - //client.QueuePacket(init); - } - else if (subpacket.header.type == 0x08) + if (player == null) { - //Response, client's current [actorID][time] - //BasePacket init = Login0x7ResponsePacket.BuildPacket(BitConverter.ToUInt32(packet.data, 0x10), Utils.UnixTimeStampUTC(), 0x07); - //client.QueuePacket(init); - packet.DebugPrintPacket(); - } - else if (subpacket.header.type == 0x03) + player = new ConnectedPlayer(client, subpacket.header.targetId); + } + + subpacket.DebugPrintSubPacket(); + + //Normal Game Opcode + switch (subpacket.gameMessage.opcode) { - ConnectedPlayer player = null; + //Ping + case 0x0001: + //subpacket.DebugPrintSubPacket(); + PingPacket pingPacket = new PingPacket(subpacket.data); + client.QueuePacket(BasePacket.CreatePacket(PongPacket.BuildPacket(player.actorID, pingPacket.time), true, false)); + player.Ping(); + break; + //Unknown + case 0x0002: - if(mPlayers.ContainsKey(client.owner)) - player = mPlayers[client.owner]; + subpacket.DebugPrintSubPacket(); + + player = new ConnectedPlayer(client, subpacket.header.targetId); + mPlayers[subpacket.header.targetId] = player; + + client.QueuePacket(_0x2Packet.BuildPacket(player.actorID), true, false); - if (player == null || !player.IsClientConnectionsReady()) - return; + Server.GetWorldManager().DoLogin(player.GetActor()); - //Normal Game Opcode - switch (subpacket.gameMessage.opcode) - { - //Ping - case 0x0001: - //subpacket.DebugPrintSubPacket(); - PingPacket pingPacket = new PingPacket(subpacket.data); - client.QueuePacket(BasePacket.CreatePacket(PongPacket.BuildPacket(player.actorID, pingPacket.time), true, false)); - player.Ping(); - break; - //Unknown - case 0x0002: + break; + //Chat Received + case 0x0003: + ChatMessagePacket chatMessage = new ChatMessagePacket(subpacket.data); + Program.Log.Info("Got type-{5} message: {0} @ {1}, {2}, {3}, Rot: {4}", chatMessage.message, chatMessage.posX, chatMessage.posY, chatMessage.posZ, chatMessage.posRot, chatMessage.logType); + subpacket.DebugPrintSubPacket(); - subpacket.DebugPrintSubPacket(); - client.QueuePacket(_0x2Packet.BuildPacket(player.actorID), true, false); + if (chatMessage.message.StartsWith("!")) + { + if (cp.DoCommand(chatMessage.message, player)) + return; ; + } - Server.GetWorldManager().DoLogin(player.GetActor()); + player.GetActor().BroadcastPacket(SendMessagePacket.BuildPacket(player.actorID, player.actorID, chatMessage.logType, player.GetActor().customDisplayName, chatMessage.message), false); - - break; - //Chat Received - case 0x0003: - ChatMessagePacket chatMessage = new ChatMessagePacket(subpacket.data); - Program.Log.Info("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("!")) - { - if (cp.DoCommand(chatMessage.message, player)) - continue; - } - - player.GetActor().BroadcastPacket(SendMessagePacket.BuildPacket(player.actorID, player.actorID, chatMessage.logType, player.GetActor().customDisplayName, chatMessage.message), false); - - break; - //Langauge Code - case 0x0006: - LangaugeCodePacket langCode = new LangaugeCodePacket(subpacket.data); - player.languageCode = langCode.languageCode; - break; - //Unknown - Happens a lot at login, then once every time player zones - case 0x0007: - //subpacket.DebugPrintSubPacket(); - _0x07Packet unknown07 = new _0x07Packet(subpacket.data); - break; + break; + //Langauge Code + case 0x0006: + LangaugeCodePacket langCode = new LangaugeCodePacket(subpacket.data); + player.languageCode = langCode.languageCode; + break; + //Unknown - Happens a lot at login, then once every time player zones + case 0x0007: + //subpacket.DebugPrintSubPacket(); + _0x07Packet unknown07 = new _0x07Packet(subpacket.data); + break; + //Update Position + case 0x00CA: //Update Position - case 0x00CA: - //Update Position - //subpacket.DebugPrintSubPacket(); - UpdatePlayerPositionPacket posUpdate = new UpdatePlayerPositionPacket(subpacket.data); - player.UpdatePlayerActorPosition(posUpdate.x, posUpdate.y, posUpdate.z, posUpdate.rot, posUpdate.moveState); - player.GetActor().SendInstanceUpdate(); + //subpacket.DebugPrintSubPacket(); + UpdatePlayerPositionPacket posUpdate = new UpdatePlayerPositionPacket(subpacket.data); + player.UpdatePlayerActorPosition(posUpdate.x, posUpdate.y, posUpdate.z, posUpdate.rot, posUpdate.moveState); + player.GetActor().SendInstanceUpdate(); + + if (player.GetActor().IsInZoneChange()) + player.GetActor().SetZoneChanging(false); + + break; + //Set Target + case 0x00CD: + //subpacket.DebugPrintSubPacket(); + + SetTargetPacket setTarget = new SetTargetPacket(subpacket.data); + player.GetActor().currentTarget = setTarget.actorID; + player.GetActor().BroadcastPacket(SetActorTargetAnimatedPacket.BuildPacket(player.actorID, player.actorID, setTarget.actorID), true); + break; + //Lock Target + case 0x00CC: + LockTargetPacket lockTarget = new LockTargetPacket(subpacket.data); + player.GetActor().currentLockedTarget = lockTarget.actorID; + break; + //Start Event + case 0x012D: + subpacket.DebugPrintSubPacket(); + EventStartPacket eventStart = new EventStartPacket(subpacket.data); + + /* + if (eventStart.error != null) + { + player.errorMessage += eventStart.error; + + if (eventStart.errorIndex == eventStart.errorNum - 1) + Program.Log.Error("\n"+player.errorMessage); - if (player.GetActor().IsInZoneChange()) - player.GetActor().SetZoneChanging(false); break; - //Set Target - case 0x00CD: - //subpacket.DebugPrintSubPacket(); + } + */ - SetTargetPacket setTarget = new SetTargetPacket(subpacket.data); - player.GetActor().currentTarget = setTarget.actorID; - player.GetActor().BroadcastPacket(SetActorTargetAnimatedPacket.BuildPacket(player.actorID, player.actorID, setTarget.actorID), true); - break; - //Lock Target - case 0x00CC: - LockTargetPacket lockTarget = new LockTargetPacket(subpacket.data); - player.GetActor().currentLockedTarget = lockTarget.actorID; - break; - //Start Event - case 0x012D: - subpacket.DebugPrintSubPacket(); - EventStartPacket eventStart = new EventStartPacket(subpacket.data); - - /* - if (eventStart.error != null) - { - player.errorMessage += eventStart.error; - - if (eventStart.errorIndex == eventStart.errorNum - 1) - Program.Log.Error("\n"+player.errorMessage); - - - break; - } - */ - - Actor ownerActor = Server.GetStaticActors(eventStart.scriptOwnerActorID); + Actor ownerActor = Server.GetStaticActors(eventStart.scriptOwnerActorID); - player.GetActor().currentEventOwner = eventStart.scriptOwnerActorID; - player.GetActor().currentEventName = eventStart.triggerName; + player.GetActor().currentEventOwner = eventStart.scriptOwnerActorID; + player.GetActor().currentEventName = eventStart.triggerName; + if (ownerActor == null) + { + //Is it a instance actor? + ownerActor = Server.GetWorldManager().GetActorInWorld(player.GetActor().currentEventOwner); if (ownerActor == null) { - //Is it a instance actor? - ownerActor = Server.GetWorldManager().GetActorInWorld(player.GetActor().currentEventOwner); - if (ownerActor == null) - { - //Is it a Director? - if (player.GetActor().currentDirector != null && player.GetActor().currentEventOwner == player.GetActor().currentDirector.actorId) - ownerActor = player.GetActor().currentDirector; - else - { - Program.Log.Debug("\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; - } - } - } - - player.GetActor().StartEvent(ownerActor, eventStart); - - Program.Log.Debug("\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: - break; - //Event Result - case 0x012E: - subpacket.DebugPrintSubPacket(); - EventUpdatePacket eventUpdate = new EventUpdatePacket(subpacket.data); - Program.Log.Debug("\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); - if (updateOwnerActor == null) - { - updateOwnerActor = Server.GetWorldManager().GetActorInWorld(player.GetActor().currentEventOwner); - + //Is it a Director? if (player.GetActor().currentDirector != null && player.GetActor().currentEventOwner == player.GetActor().currentDirector.actorId) - updateOwnerActor = player.GetActor().currentDirector; - - if (updateOwnerActor == null) + ownerActor = player.GetActor().currentDirector; + else + { + Program.Log.Debug("\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; - } - */ - player.GetActor().UpdateEvent(eventUpdate); + } + } + } - //LuaEngine.DoActorOnEventUpdated(player.GetActor(), updateOwnerActor, eventUpdate); + player.GetActor().StartEvent(ownerActor, eventStart); + + Program.Log.Debug("\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: + break; + //Event Result + case 0x012E: + subpacket.DebugPrintSubPacket(); + EventUpdatePacket eventUpdate = new EventUpdatePacket(subpacket.data); + Program.Log.Debug("\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); + if (updateOwnerActor == null) + { + updateOwnerActor = Server.GetWorldManager().GetActorInWorld(player.GetActor().currentEventOwner); + + if (player.GetActor().currentDirector != null && player.GetActor().currentEventOwner == player.GetActor().currentDirector.actorId) + updateOwnerActor = player.GetActor().currentDirector; + + if (updateOwnerActor == null) + break; + } + */ + player.GetActor().UpdateEvent(eventUpdate); + + //LuaEngine.DoActorOnEventUpdated(player.GetActor(), updateOwnerActor, eventUpdate); - break; - case 0x012F: - //subpacket.DebugPrintSubPacket(); - ParameterDataRequestPacket paramRequest = new ParameterDataRequestPacket(subpacket.data); - if (paramRequest.paramName.Equals("charaWork/exp")) - player.GetActor().SendCharaExpInfo(); - break; - /* RECRUITMENT */ - //Start Recruiting - case 0x01C3: - StartRecruitingRequestPacket recruitRequestPacket = new StartRecruitingRequestPacket(subpacket.data); - client.QueuePacket(BasePacket.CreatePacket(StartRecruitingResponse.BuildPacket(player.actorID, true), true, false)); - break; - //End Recruiting - case 0x01C4: - client.QueuePacket(BasePacket.CreatePacket(EndRecruitmentPacket.BuildPacket(player.actorID), true, false)); - break; - //Party Window Opened, Request State - case 0x01C5: - client.QueuePacket(BasePacket.CreatePacket(RecruiterStatePacket.BuildPacket(player.actorID, true, true, 1), true, false)); - break; - //Search Recruiting - case 0x01C7: - RecruitmentSearchRequestPacket recruitSearchPacket = new RecruitmentSearchRequestPacket(subpacket.data); - break; - //Get Recruitment Details - case 0x01C8: - RecruitmentDetailsRequestPacket currentRecruitDetailsPacket = new RecruitmentDetailsRequestPacket(subpacket.data); - RecruitmentDetails details = new RecruitmentDetails(); - details.recruiterName = "Localhost Character"; - details.purposeId = 2; - details.locationId = 1; - details.subTaskId = 1; - details.comment = "This is a test details packet sent by the server. No implementation has been Created yet..."; - details.num[0] = 1; - client.QueuePacket(BasePacket.CreatePacket(CurrentRecruitmentDetailsPacket.BuildPacket(player.actorID, details), true, false)); - break; - //Accepted Recruiting - case 0x01C6: - subpacket.DebugPrintSubPacket(); - break; - /* SOCIAL STUFF */ - case 0x01C9: - AddRemoveSocialPacket addBlackList = new AddRemoveSocialPacket(subpacket.data); - client.QueuePacket(BasePacket.CreatePacket(BlacklistAddedPacket.BuildPacket(player.actorID, true, addBlackList.name), true, false)); - break; - case 0x01CA: - AddRemoveSocialPacket RemoveBlackList = new AddRemoveSocialPacket(subpacket.data); - client.QueuePacket(BasePacket.CreatePacket(BlacklistRemovedPacket.BuildPacket(player.actorID, true, RemoveBlackList.name), true, false)); - break; - case 0x01CB: - int offset1 = 0; - client.QueuePacket(BasePacket.CreatePacket(SendBlacklistPacket.BuildPacket(player.actorID, new String[] { "Test" }, ref offset1), true, false)); - break; - case 0x01CC: - AddRemoveSocialPacket addFriendList = new AddRemoveSocialPacket(subpacket.data); - client.QueuePacket(BasePacket.CreatePacket(FriendlistAddedPacket.BuildPacket(player.actorID, true, (uint)addFriendList.name.GetHashCode(), true, addFriendList.name), true, false)); - break; - case 0x01CD: - AddRemoveSocialPacket RemoveFriendList = new AddRemoveSocialPacket(subpacket.data); - client.QueuePacket(BasePacket.CreatePacket(FriendlistRemovedPacket.BuildPacket(player.actorID, true, RemoveFriendList.name), true, false)); - break; - case 0x01CE: - int offset2 = 0; - client.QueuePacket(BasePacket.CreatePacket(SendFriendlistPacket.BuildPacket(player.actorID, new Tuple[] { new Tuple(01, "Test2") }, ref offset2), true, false)); - break; - case 0x01CF: - client.QueuePacket(BasePacket.CreatePacket(FriendStatusPacket.BuildPacket(player.actorID, null), true, false)); - break; - /* SUPPORT DESK STUFF */ - //Request for FAQ/Info List - case 0x01D0: - FaqListRequestPacket faqRequest = new FaqListRequestPacket(subpacket.data); - client.QueuePacket(BasePacket.CreatePacket(FaqListResponsePacket.BuildPacket(player.actorID, new string[] { "Testing FAQ1", "Coded style!" }), true, false)); - break; - //Request for body of a faq/info selection - case 0x01D1: - FaqBodyRequestPacket faqBodyRequest = new FaqBodyRequestPacket(subpacket.data); - client.QueuePacket(BasePacket.CreatePacket(FaqBodyResponsePacket.BuildPacket(player.actorID, "HERE IS A GIANT BODY. Nothing else to say!"), true, false)); - break; - //Request issue list - case 0x01D2: - GMTicketIssuesRequestPacket issuesRequest = new GMTicketIssuesRequestPacket(subpacket.data); - client.QueuePacket(BasePacket.CreatePacket(IssueListResponsePacket.BuildPacket(player.actorID, new string[] { "Test1", "Test2", "Test3", "Test4", "Test5" }), true, false)); - break; - //Request if GM ticket exists - case 0x01D3: - client.QueuePacket(BasePacket.CreatePacket(StartGMTicketPacket.BuildPacket(player.actorID, false), true, false)); - break; - //Request for GM response message - case 0x01D4: - client.QueuePacket(BasePacket.CreatePacket(GMTicketPacket.BuildPacket(player.actorID, "This is a GM Ticket Title", "This is a GM Ticket Body."), true, false)); - break; - //GM Ticket Sent - case 0x01D5: - GMSupportTicketPacket gmTicket = new GMSupportTicketPacket(subpacket.data); - 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 - case 0x01D6: - client.QueuePacket(BasePacket.CreatePacket(EndGMTicketPacket.BuildPacket(player.actorID), true, false)); - break; - default: - Program.Log.Debug("Unknown command 0x{0:X} received.", subpacket.gameMessage.opcode); - subpacket.DebugPrintSubPacket(); - break; - } + break; + case 0x012F: + //subpacket.DebugPrintSubPacket(); + ParameterDataRequestPacket paramRequest = new ParameterDataRequestPacket(subpacket.data); + if (paramRequest.paramName.Equals("charaWork/exp")) + player.GetActor().SendCharaExpInfo(); + break; + /* RECRUITMENT */ + //Start Recruiting + case 0x01C3: + StartRecruitingRequestPacket recruitRequestPacket = new StartRecruitingRequestPacket(subpacket.data); + client.QueuePacket(BasePacket.CreatePacket(StartRecruitingResponse.BuildPacket(player.actorID, true), true, false)); + break; + //End Recruiting + case 0x01C4: + client.QueuePacket(BasePacket.CreatePacket(EndRecruitmentPacket.BuildPacket(player.actorID), true, false)); + break; + //Party Window Opened, Request State + case 0x01C5: + client.QueuePacket(BasePacket.CreatePacket(RecruiterStatePacket.BuildPacket(player.actorID, true, true, 1), true, false)); + break; + //Search Recruiting + case 0x01C7: + RecruitmentSearchRequestPacket recruitSearchPacket = new RecruitmentSearchRequestPacket(subpacket.data); + break; + //Get Recruitment Details + case 0x01C8: + RecruitmentDetailsRequestPacket currentRecruitDetailsPacket = new RecruitmentDetailsRequestPacket(subpacket.data); + RecruitmentDetails details = new RecruitmentDetails(); + details.recruiterName = "Localhost Character"; + details.purposeId = 2; + details.locationId = 1; + details.subTaskId = 1; + details.comment = "This is a test details packet sent by the server. No implementation has been Created yet..."; + details.num[0] = 1; + client.QueuePacket(BasePacket.CreatePacket(CurrentRecruitmentDetailsPacket.BuildPacket(player.actorID, details), true, false)); + break; + //Accepted Recruiting + case 0x01C6: + subpacket.DebugPrintSubPacket(); + break; + /* SOCIAL STUFF */ + case 0x01C9: + AddRemoveSocialPacket addBlackList = new AddRemoveSocialPacket(subpacket.data); + client.QueuePacket(BasePacket.CreatePacket(BlacklistAddedPacket.BuildPacket(player.actorID, true, addBlackList.name), true, false)); + break; + case 0x01CA: + AddRemoveSocialPacket RemoveBlackList = new AddRemoveSocialPacket(subpacket.data); + client.QueuePacket(BasePacket.CreatePacket(BlacklistRemovedPacket.BuildPacket(player.actorID, true, RemoveBlackList.name), true, false)); + break; + case 0x01CB: + int offset1 = 0; + client.QueuePacket(BasePacket.CreatePacket(SendBlacklistPacket.BuildPacket(player.actorID, new String[] { "Test" }, ref offset1), true, false)); + break; + case 0x01CC: + AddRemoveSocialPacket addFriendList = new AddRemoveSocialPacket(subpacket.data); + client.QueuePacket(BasePacket.CreatePacket(FriendlistAddedPacket.BuildPacket(player.actorID, true, (uint)addFriendList.name.GetHashCode(), true, addFriendList.name), true, false)); + break; + case 0x01CD: + AddRemoveSocialPacket RemoveFriendList = new AddRemoveSocialPacket(subpacket.data); + client.QueuePacket(BasePacket.CreatePacket(FriendlistRemovedPacket.BuildPacket(player.actorID, true, RemoveFriendList.name), true, false)); + break; + case 0x01CE: + int offset2 = 0; + client.QueuePacket(BasePacket.CreatePacket(SendFriendlistPacket.BuildPacket(player.actorID, new Tuple[] { new Tuple(01, "Test2") }, ref offset2), true, false)); + break; + case 0x01CF: + client.QueuePacket(BasePacket.CreatePacket(FriendStatusPacket.BuildPacket(player.actorID, null), true, false)); + break; + /* SUPPORT DESK STUFF */ + //Request for FAQ/Info List + case 0x01D0: + FaqListRequestPacket faqRequest = new FaqListRequestPacket(subpacket.data); + client.QueuePacket(BasePacket.CreatePacket(FaqListResponsePacket.BuildPacket(player.actorID, new string[] { "Testing FAQ1", "Coded style!" }), true, false)); + break; + //Request for body of a faq/info selection + case 0x01D1: + FaqBodyRequestPacket faqBodyRequest = new FaqBodyRequestPacket(subpacket.data); + client.QueuePacket(BasePacket.CreatePacket(FaqBodyResponsePacket.BuildPacket(player.actorID, "HERE IS A GIANT BODY. Nothing else to say!"), true, false)); + break; + //Request issue list + case 0x01D2: + GMTicketIssuesRequestPacket issuesRequest = new GMTicketIssuesRequestPacket(subpacket.data); + client.QueuePacket(BasePacket.CreatePacket(IssueListResponsePacket.BuildPacket(player.actorID, new string[] { "Test1", "Test2", "Test3", "Test4", "Test5" }), true, false)); + break; + //Request if GM ticket exists + case 0x01D3: + client.QueuePacket(BasePacket.CreatePacket(StartGMTicketPacket.BuildPacket(player.actorID, false), true, false)); + break; + //Request for GM response message + case 0x01D4: + client.QueuePacket(BasePacket.CreatePacket(GMTicketPacket.BuildPacket(player.actorID, "This is a GM Ticket Title", "This is a GM Ticket Body."), true, false)); + break; + //GM Ticket Sent + case 0x01D5: + GMSupportTicketPacket gmTicket = new GMSupportTicketPacket(subpacket.data); + 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 + case 0x01D6: + client.QueuePacket(BasePacket.CreatePacket(EndGMTicketPacket.BuildPacket(player.actorID), true, false)); + break; + default: + Program.Log.Debug("Unknown command 0x{0:X} received.", subpacket.gameMessage.opcode); + subpacket.DebugPrintSubPacket(); + break; } - else - packet.DebugPrintPacket(); - } + } } diff --git a/FFXIVClassic Map Server/Server.cs b/FFXIVClassic Map Server/Server.cs index ca939e63..f8b4ece3 100644 --- a/FFXIVClassic Map Server/Server.cs +++ b/FFXIVClassic Map Server/Server.cs @@ -26,7 +26,7 @@ namespace FFXIVClassic_Map_Server private Socket mServerSocket; private Dictionary mConnectedPlayerList = new Dictionary(); - private List mConnectionList = new List(); + private ZoneConnection mWorldConnection = new ZoneConnection(); private LuaEngine mLuaEngine = new LuaEngine(); private static WorldManager mWorldManager; @@ -119,7 +119,7 @@ namespace FFXIVClassic_Map_Server Program.Log.Info("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); + mProcessor = new PacketProcessor(this, mConnectedPlayerList); //mGameThread = new Thread(new ThreadStart(mProcessor.update)); //mGameThread.Start(); @@ -138,21 +138,18 @@ namespace FFXIVClassic_Map_Server #region Socket Handling private void AcceptCallback(IAsyncResult result) { - ClientConnection conn = null; + ZoneConnection conn = null; Socket socket = (System.Net.Sockets.Socket)result.AsyncState; try { - conn = new ClientConnection(); + conn = new ZoneConnection(); conn.socket = socket.EndAccept(result); conn.buffer = new byte[BUFFER_SIZE]; - lock (mConnectionList) - { - mConnectionList.Add(conn); - } - + mWorldConnection = conn; + Program.Log.Info("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); @@ -163,11 +160,7 @@ namespace FFXIVClassic_Map_Server { if (conn != null) { - - lock (mConnectionList) - { - mConnectionList.Remove(conn); - } + mWorldConnection = null; } mServerSocket.BeginAccept(new AsyncCallback(AcceptCallback), mServerSocket); } @@ -175,10 +168,7 @@ namespace FFXIVClassic_Map_Server { if (conn != null) { - lock (mConnectionList) - { - mConnectionList.Remove(conn); - } + mWorldConnection = null; } mServerSocket.BeginAccept(new AsyncCallback(AcceptCallback), mServerSocket); } @@ -208,20 +198,13 @@ namespace FFXIVClassic_Map_Server /// private void ReceiveCallback(IAsyncResult result) { - ClientConnection conn = (ClientConnection)result.AsyncState; + ZoneConnection conn = (ZoneConnection)result.AsyncState; //Check if disconnected if ((conn.socket.Poll(1, SelectMode.SelectRead) && conn.socket.Available == 0)) { - if (mConnectedPlayerList.ContainsKey(conn.owner)) - mConnectedPlayerList.Remove(conn.owner); - lock (mConnectionList) - { - mConnectionList.Remove(conn); - } - if (conn.connType == BasePacket.TYPE_ZONE) - Program.Log.Info("{0} has disconnected.", conn.owner == 0 ? conn.GetAddress() : "User " + conn.owner); - return; + mWorldConnection = null; + Program.Log.Info("Disconnected from world server!"); } try @@ -237,13 +220,13 @@ namespace FFXIVClassic_Map_Server //Build packets until can no longer or out of data while (true) { - BasePacket basePacket = BuildPacket(ref offset, conn.buffer, bytesRead); + SubPacket subPacket = SubPacket.CreatePacket(ref offset, conn.buffer, bytesRead); //If can't build packet, break, else process another - if (basePacket == null) + if (subPacket == null) break; else - mProcessor.ProcessPacket(conn, basePacket); + mProcessor.ProcessPacket(conn, subPacket); } //Not all bytes consumed, transfer leftover to beginning @@ -264,63 +247,20 @@ namespace FFXIVClassic_Map_Server } else { - Program.Log.Info("{0} has disconnected.", conn.owner == 0 ? conn.GetAddress() : "User " + conn.owner); - - lock (mConnectionList) - { - mConnectionList.Remove(conn); - } + mWorldConnection = null; + Program.Log.Info("Disconnected from world server!"); } } catch (SocketException) { if (conn.socket != null) { - Program.Log.Info("{0} has disconnected.", conn.owner == 0 ? conn.GetAddress() : "User " + conn.owner); - - lock (mConnectionList) - { - mConnectionList.Remove(conn); - } + mWorldConnection = null; + Program.Log.Info("Disconnected from world server!"); } } } - /// - /// Builds a packet from the incoming buffer + offset. If a packet can be built, it is returned else null. - /// - /// Current offset in buffer. - /// Incoming buffer. - /// Returns either a BasePacket or null if not enough data. - public BasePacket BuildPacket(ref int offset, byte[] buffer, int bytesRead) - { - BasePacket newPacket = null; - - //Too small to even get length - if (bytesRead <= offset) - return null; - - ushort packetSize = BitConverter.ToUInt16(buffer, offset); - - //Too small to whole packet - if (bytesRead < offset + packetSize) - return null; - - if (buffer.Length < offset + packetSize) - return null; - - try - { - newPacket = new BasePacket(buffer, ref offset); - } - catch (OverflowException) - { - return null; - } - - return newPacket; - } - #endregion diff --git a/FFXIVClassic Map Server/ClientConnection.cs b/FFXIVClassic Map Server/ZoneConnection.cs similarity index 72% rename from FFXIVClassic Map Server/ClientConnection.cs rename to FFXIVClassic Map Server/ZoneConnection.cs index fcae92c6..4a1af12d 100644 --- a/FFXIVClassic Map Server/ClientConnection.cs +++ b/FFXIVClassic Map Server/ZoneConnection.cs @@ -7,27 +7,22 @@ using System.Net; namespace FFXIVClassic_Map_Server { - class ClientConnection + class ZoneConnection { //Connection stuff - public Blowfish blowfish; public Socket socket; public byte[] buffer; - private BlockingCollection SendPacketQueue = new BlockingCollection(1000); + private BlockingCollection SendPacketQueue = new BlockingCollection(1000); public int lastPartialSize = 0; - //Instance Stuff - public uint owner = 0; - public int connType = 0; - public void QueuePacket(BasePacket packet) { - SendPacketQueue.Add(packet); + //SendPacketQueue.Add(packet); } public void QueuePacket(SubPacket subpacket, bool isAuthed, bool isEncrypted) { - SendPacketQueue.Add(BasePacket.CreatePacket(subpacket, isAuthed, isEncrypted)); + SendPacketQueue.Add(subpacket); } public void FlushQueuedSendPackets() @@ -37,9 +32,9 @@ namespace FFXIVClassic_Map_Server while (SendPacketQueue.Count > 0) { - BasePacket packet = SendPacketQueue.Take(); + SubPacket packet = SendPacketQueue.Take(); - byte[] packetBytes = packet.GetPacketBytes(); + byte[] packetBytes = packet.GetBytes(); try { diff --git a/FFXIVClassic Map Server/dataobjects/ConnectedPlayer.cs b/FFXIVClassic Map Server/dataobjects/ConnectedPlayer.cs index 052bec4e..17addb4b 100644 --- a/FFXIVClassic Map Server/dataobjects/ConnectedPlayer.cs +++ b/FFXIVClassic Map Server/dataobjects/ConnectedPlayer.cs @@ -20,50 +20,20 @@ namespace FFXIVClassic_Map_Server.dataobjects public uint languageCode = 1; - private ClientConnection zoneConnection; - private ClientConnection chatConnection; + private ZoneConnection zoneConnection; private uint lastPingPacket = Utils.UnixTimeStampUTC(); public string errorMessage = ""; - public ConnectedPlayer(uint actorId) + public ConnectedPlayer(ZoneConnection zc, uint actorId) { + zoneConnection = zc; this.actorID = actorId; playerActor = new Player(this, actorId); actorInstanceList.Add(playerActor); } - public void SetConnection(int type, ClientConnection conn) - { - conn.connType = type; - switch (type) - { - case BasePacket.TYPE_ZONE: - zoneConnection = conn; - break; - case BasePacket.TYPE_CHAT: - chatConnection = conn; - break; - } - } - - public bool IsClientConnectionsReady() - { - return (zoneConnection != null && chatConnection != null); - } - - public void Disconnect() - { - zoneConnection.Disconnect(); - chatConnection.Disconnect(); - } - - public bool IsDisconnected() - { - return (!zoneConnection.IsConnected() && !chatConnection.IsConnected()); - } - public void QueuePacket(BasePacket basePacket) { zoneConnection.QueuePacket(basePacket); diff --git a/FFXIVClassic World Server/ConfigConstants.cs b/FFXIVClassic World Server/ConfigConstants.cs index 028ad36a..7f8b29aa 100644 --- a/FFXIVClassic World Server/ConfigConstants.cs +++ b/FFXIVClassic World Server/ConfigConstants.cs @@ -18,15 +18,15 @@ namespace FFXIVClassic_World_Server public static bool Load() { - Program.Log.Info("Loading config.ini"); + Program.Log.Info("Loading world_config.ini"); - if (!File.Exists("./config.ini")) + if (!File.Exists("./world_config.ini")) { Program.Log.Error("FILE NOT FOUND!"); return false; } - INIFile configIni = new INIFile("./config.ini"); + INIFile configIni = new INIFile("./world_config.ini"); ConfigConstants.OPTIONS_BINDIP = configIni.GetValue("General", "server_ip", "127.0.0.1"); ConfigConstants.OPTIONS_PORT = configIni.GetValue("General", "server_port", "54992"); diff --git a/FFXIVClassic World Server/DataObjects/ZoneServer.cs b/FFXIVClassic World Server/DataObjects/ZoneServer.cs index b3cf09e1..e7371402 100644 --- a/FFXIVClassic World Server/DataObjects/ZoneServer.cs +++ b/FFXIVClassic World Server/DataObjects/ZoneServer.cs @@ -16,6 +16,9 @@ namespace FFXIVClassic_World_Server.DataObjects public readonly int[] ownedZoneIds; public bool isConnected = false; public Socket zoneServerConnection; + private ClientConnection conn; + + private byte[] buffer = new byte[0xFFFF]; public ZoneServer(string ip, int port) { @@ -34,6 +37,18 @@ namespace FFXIVClassic_World_Server.DataObjects { zoneServerConnection.Connect(remoteEP); isConnected = true; + conn = new ClientConnection(); + conn.socket = zoneServerConnection; + conn.buffer = new byte[0xFFFF]; + + try + { + zoneServerConnection.BeginReceive(conn.buffer, 0, conn.buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveCallback), conn); + } + catch (Exception e) + { + throw new ApplicationException("Error occured starting listeners, check inner exception", e); + } } catch (Exception e) { Program.Log.Error("Failed to connect"); return; } @@ -54,5 +69,71 @@ namespace FFXIVClassic_World_Server.DataObjects } } + private void ReceiveCallback(IAsyncResult result) + { + ClientConnection conn = (ClientConnection)result.AsyncState; + //Check if disconnected + if ((conn.socket.Poll(1, SelectMode.SelectRead) && conn.socket.Available == 0)) + { + conn = null; + isConnected = false; + Program.Log.Info("Zone server @ {0}:{1} disconnected!", zoneServerIp, zoneServerPort); + return; + } + + try + { + int bytesRead = conn.socket.EndReceive(result); + + bytesRead += conn.lastPartialSize; + + if (bytesRead >= 0) + { + int offset = 0; + + //Build packets until can no longer or out of data + while (true) + { + SubPacket subpacket = SubPacket.CreatePacket(ref offset, conn.buffer, bytesRead); + + //If can't build packet, break, else process another + if (subpacket == null) + break; + else + Server.GetServer().OnReceiveSubPacketFromZone(this, subpacket); + } + + //Not all bytes consumed, transfer leftover to beginning + if (offset < bytesRead) + Array.Copy(conn.buffer, offset, conn.buffer, 0, bytesRead - offset); + + conn.lastPartialSize = bytesRead - offset; + + //Build any queued subpackets into basepackets and send + conn.FlushQueuedSendPackets(); + + if (offset < bytesRead) + //Need offset since not all bytes consumed + conn.socket.BeginReceive(conn.buffer, bytesRead - offset, conn.buffer.Length - (bytesRead - offset), SocketFlags.None, new AsyncCallback(ReceiveCallback), conn); + else + //All bytes consumed, full buffer available + conn.socket.BeginReceive(conn.buffer, 0, conn.buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveCallback), conn); + } + else + { + conn = null; + isConnected = false; + Program.Log.Info("Zone server @ {0}:{1} disconnected!", zoneServerIp, zoneServerPort); + } + } + catch (SocketException) + { + conn = null; + isConnected = false; + Program.Log.Info("Zone server @ {0}:{1} disconnected!", zoneServerIp, zoneServerPort); + } + } + + } } diff --git a/FFXIVClassic World Server/NLog.config b/FFXIVClassic World Server/NLog.config index aea50410..e3e21f9c 100644 --- a/FFXIVClassic World Server/NLog.config +++ b/FFXIVClassic World Server/NLog.config @@ -53,6 +53,7 @@ +