diff --git a/EOLib/Domain/Login/LoginActions.cs b/EOLib/Domain/Login/LoginActions.cs index ad4e2fa1f..45d36dda1 100644 --- a/EOLib/Domain/Login/LoginActions.cs +++ b/EOLib/Domain/Login/LoginActions.cs @@ -133,7 +133,7 @@ public async Task RequestCharacterLogin(ICharacter character) public async Task CompleteCharacterLogin() { var packet = new PacketBuilder(PacketFamily.Welcome, PacketAction.Message) - .AddThree(_playerInfoRepository.SessionID) + .AddThree((ushort)_playerInfoRepository.SessionID) .AddInt(_characterRepository.MainCharacter.ID) .Build(); diff --git a/EOLib/Net/FileTransfer/FileRequestActions.cs b/EOLib/Net/FileTransfer/FileRequestActions.cs index 9b7f08261..cbcd54154 100644 --- a/EOLib/Net/FileTransfer/FileRequestActions.cs +++ b/EOLib/Net/FileTransfer/FileRequestActions.cs @@ -60,40 +60,40 @@ public bool NeedsMapForWarp(short mapID, byte[] mapRid, int fileSize) public async Task GetMapFromServer(short mapID) { - var mapFile = await _fileRequestService.RequestMapFile(mapID, _playerInfoProvider.PlayerID); + var mapFile = await _fileRequestService.RequestMapFile(mapID, _playerInfoProvider.SessionID); SaveAndCacheMapFile(mapID, mapFile); } - public async Task GetMapForWarp(short mapID) + public async Task GetMapForWarp(short mapID, short sessionID) { - var mapFile = await _fileRequestService.RequestMapFileForWarp(mapID); + var mapFile = await _fileRequestService.RequestMapFileForWarp(mapID, sessionID); SaveAndCacheMapFile(mapID, mapFile); } public async Task GetItemFileFromServer() { - var itemFile = await _fileRequestService.RequestFile(InitFileType.Item, _playerInfoProvider.PlayerID); + var itemFile = await _fileRequestService.RequestFile(InitFileType.Item, _playerInfoProvider.SessionID); _pubFileSaveService.SaveFile(PubFileNameConstants.PathToEIFFile, itemFile, rewriteChecksum: false); _pubFileRepository.EIFFile = (EIFFile)itemFile; } public async Task GetNPCFileFromServer() { - var npcFile = await _fileRequestService.RequestFile(InitFileType.Npc, _playerInfoProvider.PlayerID); + var npcFile = await _fileRequestService.RequestFile(InitFileType.Npc, _playerInfoProvider.SessionID); _pubFileSaveService.SaveFile(PubFileNameConstants.PathToENFFile, npcFile, rewriteChecksum: false); _pubFileRepository.ENFFile = (ENFFile)npcFile; } public async Task GetSpellFileFromServer() { - var spellFile = await _fileRequestService.RequestFile(InitFileType.Spell, _playerInfoProvider.PlayerID); + var spellFile = await _fileRequestService.RequestFile(InitFileType.Spell, _playerInfoProvider.SessionID); _pubFileSaveService.SaveFile(PubFileNameConstants.PathToESFFile, spellFile, rewriteChecksum: false); _pubFileRepository.ESFFile = (ESFFile)spellFile; } public async Task GetClassFileFromServer() { - var classFile = await _fileRequestService.RequestFile(InitFileType.Class, _playerInfoProvider.PlayerID); + var classFile = await _fileRequestService.RequestFile(InitFileType.Class, _playerInfoProvider.SessionID); _pubFileSaveService.SaveFile(PubFileNameConstants.PathToECFFile, classFile, rewriteChecksum: false); _pubFileRepository.ECFFile = (ECFFile)classFile; } @@ -153,7 +153,7 @@ public interface IFileRequestActions Task GetMapFromServer(short mapID); - Task GetMapForWarp(short mapID); + Task GetMapForWarp(short mapID, short sessionID); Task GetItemFileFromServer(); diff --git a/EOLib/Net/FileTransfer/FileRequestService.cs b/EOLib/Net/FileTransfer/FileRequestService.cs index 573aae5a8..5b8ae1a1c 100644 --- a/EOLib/Net/FileTransfer/FileRequestService.cs +++ b/EOLib/Net/FileTransfer/FileRequestService.cs @@ -26,29 +26,33 @@ public class FileRequestService : IFileRequestService _pubFileDeserializer = pubFileDeserializer; } - public async Task RequestMapFile(short mapID, short playerID) + public async Task RequestMapFile(short mapID, short sessionID) { var request = new PacketBuilder(PacketFamily.Welcome, PacketAction.Agree) .AddChar((byte)InitFileType.Map) - .AddShort(playerID) + .AddShort(sessionID) .AddShort(mapID) .Build(); - return await GetMapFile(request, mapID, false); + return await GetMapFile(request, mapID); } - public async Task RequestMapFileForWarp(short mapID) + public async Task RequestMapFileForWarp(short mapID, short sessionID) { - var request = new PacketBuilder(PacketFamily.Warp, PacketAction.Take).Build(); - return await GetMapFile(request, mapID, true); + var request = new PacketBuilder(PacketFamily.Warp, PacketAction.Take) + .AddShort(mapID) + .AddShort(sessionID) + .Build(); + + return await GetMapFile(request, mapID); } - public async Task> RequestFile(InitFileType fileType, short playerID) + public async Task> RequestFile(InitFileType fileType, short sessionID) where TRecord : class, IPubRecord, new() { var request = new PacketBuilder(PacketFamily.Welcome, PacketAction.Agree) .AddChar((byte)fileType) - .AddShort(playerID) + .AddShort(sessionID) .AddChar(1) // file id (for chunking oversize pub files) .Build(); @@ -56,7 +60,7 @@ public async Task> RequestFile(InitFileType fileType, if (!PacketIsValid(response)) throw new EmptyPacketReceivedException(); - var responseFileType = (InitReply) response.ReadChar(); + var responseFileType = (InitReply) response.ReadByte(); var extraByte = response.ReadChar(); if (extraByte != 1) @@ -79,14 +83,14 @@ public async Task> RequestFile(InitFileType fileType, return _pubFileDeserializer.DeserializeFromByteArray(responseBytes, factory); } - private async Task GetMapFile(IPacket request, int mapID, bool isWarp) + private async Task GetMapFile(IPacket request, int mapID) { var response = await _packetSendService.SendEncodedPacketAndWaitAsync(request); if (!PacketIsValid(response)) throw new EmptyPacketReceivedException(); - var fileType = (InitReply)(isWarp ? response.ReadByte() : response.ReadChar()); - if (fileType != InitReply.MapFile) + var fileType = (InitReply)response.ReadByte(); + if (fileType != InitReply.MapFile && fileType != InitReply.WarpMap) throw new MalformedPacketException("Invalid file type " + fileType + " when requesting a map file", response); var fileData = response.ReadBytes(response.Length - response.ReadPosition); @@ -106,11 +110,11 @@ private static bool PacketIsValid(IPacket packet) public interface IFileRequestService { - Task RequestMapFile(short mapID, short playerID); + Task RequestMapFile(short mapID, short sessionID); - Task RequestMapFileForWarp(short mapID); + Task RequestMapFileForWarp(short mapID, short sessionID); - Task> RequestFile(InitFileType fileType, short playerID) + Task> RequestFile(InitFileType fileType, short sessionID) where TRecord : class, IPubRecord, new(); } } \ No newline at end of file diff --git a/EOLib/PacketHandlers/BeginPlayerWarpHandler.cs b/EOLib/PacketHandlers/BeginPlayerWarpHandler.cs index 990d9a711..c836f13fc 100644 --- a/EOLib/PacketHandlers/BeginPlayerWarpHandler.cs +++ b/EOLib/PacketHandlers/BeginPlayerWarpHandler.cs @@ -50,15 +50,18 @@ public override bool HandlePacket(IPacket packet) _mapStateRepository.MapWarpState = WarpState.WarpStarted; var warpType = packet.ReadChar(); + var mapID = packet.ReadShort(); + short sessionID; switch (warpType) { case WARP_SAME_MAP: - SendWarpAcceptToServer(packet); + sessionID = packet.ReadShort(); + SendWarpAcceptToServer(mapID, sessionID); break; case WARP_NEW_MAP: - var mapID = packet.ReadShort(); var mapRid = packet.ReadBytes(4).ToArray(); var fileSize = packet.ReadThree(); + sessionID = packet.ReadShort(); var mapIsDownloaded = true; try @@ -69,9 +72,9 @@ public override bool HandlePacket(IPacket packet) catch (IOException) { mapIsDownloaded = false; } if (!mapIsDownloaded || _fileRequestActions.NeedsMapForWarp(mapID, mapRid, fileSize)) - _fileRequestActions.GetMapForWarp(mapID).Wait(5000); + _fileRequestActions.GetMapForWarp(mapID, sessionID).Wait(5000); - SendWarpAcceptToServer(packet); + SendWarpAcceptToServer(mapID, sessionID); break; default: _mapStateRepository.MapWarpState = WarpState.None; @@ -81,10 +84,11 @@ public override bool HandlePacket(IPacket packet) return true; } - private void SendWarpAcceptToServer(IPacket packet) + private void SendWarpAcceptToServer(short mapID, short sessionID) { var response = new PacketBuilder(PacketFamily.Warp, PacketAction.Accept) - .AddShort(packet.ReadShort()) + .AddShort(mapID) + .AddShort(sessionID) .Build(); _packetSendService.SendPacket(response); }