From 0d307786ee383f609c609595ce618c3cd7d9b8e0 Mon Sep 17 00:00:00 2001 From: Ethan Moffat Date: Tue, 20 Sep 2022 00:32:14 -0700 Subject: [PATCH] Update input handling to back off when completing a warp. Fixes some issues where warping causes the character to jump about weirdly --- EOLib/Domain/Map/CurrentMapStateRepository.cs | 7 +++++++ EOLib/PacketHandlers/EndPlayerWarpHandler.cs | 6 +++++- EndlessClient/Input/ArrowKeyHandler.cs | 4 ++-- EndlessClient/Input/ControlKeyHandler.cs | 4 ++-- EndlessClient/Input/FunctionKeyHandler.cs | 4 ++-- EndlessClient/Input/InputHandlerBase.cs | 15 ++++++++++----- EndlessClient/Input/NumPadHandler.cs | 4 ++-- EndlessClient/Input/UserInputHandler.cs | 10 +++++----- EndlessClient/Input/UserInputHandlerFactory.cs | 8 ++++---- 9 files changed, 39 insertions(+), 23 deletions(-) diff --git a/EOLib/Domain/Map/CurrentMapStateRepository.cs b/EOLib/Domain/Map/CurrentMapStateRepository.cs index 6e46a3ad5..6ceb7a450 100644 --- a/EOLib/Domain/Map/CurrentMapStateRepository.cs +++ b/EOLib/Domain/Map/CurrentMapStateRepository.cs @@ -1,5 +1,6 @@ using AutomaticTypeMapper; using Optional; +using System; using System.Collections.Generic; namespace EOLib.Domain.Map @@ -30,6 +31,8 @@ public interface ICurrentMapStateRepository Option MapWarpID { get; set; } + Option MapWarpTime { get; set; } + HashSet UnknownPlayerIDs { get; set; } HashSet UnknownNPCIndexes { get; set; } @@ -61,6 +64,8 @@ public interface ICurrentMapStateProvider Option MapWarpID { get; } + Option MapWarpTime { get; } + HashSet UnknownPlayerIDs { get; } HashSet UnknownNPCIndexes { get; } @@ -93,6 +98,8 @@ public class CurrentMapStateRepository : ICurrentMapStateRepository, ICurrentMap public Option MapWarpID { get; set; } + public Option MapWarpTime { get; set; } + public HashSet UnknownPlayerIDs { get; set; } public HashSet UnknownNPCIndexes { get; set; } diff --git a/EOLib/PacketHandlers/EndPlayerWarpHandler.cs b/EOLib/PacketHandlers/EndPlayerWarpHandler.cs index 7c383ece9..0b340b516 100644 --- a/EOLib/PacketHandlers/EndPlayerWarpHandler.cs +++ b/EOLib/PacketHandlers/EndPlayerWarpHandler.cs @@ -10,6 +10,8 @@ using EOLib.Net; using EOLib.Net.Handlers; using EOLib.Net.Translators; +using Optional; +using System; using System.Collections.Generic; using System.Linq; @@ -52,6 +54,8 @@ public override bool HandlePacket(IPacket packet) var warpAgreePacketData = _warpAgreePacketTranslator.TranslatePacket(packet); + _currentMapStateRepository.CurrentMapID = warpAgreePacketData.MapID; + var updatedMainCharacter = warpAgreePacketData.Characters.Single(MainCharacterIDMatches); //character.renderproperties.isdead is set True by the attack handler @@ -66,7 +70,6 @@ public override bool HandlePacket(IPacket packet) var differentMapID = _currentMapStateRepository.CurrentMapID != warpAgreePacketData.MapID; - _currentMapStateRepository.CurrentMapID = warpAgreePacketData.MapID; _currentMapStateRepository.Characters = warpAgreePacketData.Characters.ToDictionary(k => k.ID, v => v); _currentMapStateRepository.NPCs = new HashSet(warpAgreePacketData.NPCs); _currentMapStateRepository.MapItems = new HashSet(warpAgreePacketData.Items); @@ -80,6 +83,7 @@ public override bool HandlePacket(IPacket packet) warpAnimation: warpAgreePacketData.WarpAnimation); _currentMapStateRepository.MapWarpState = WarpState.None; + _currentMapStateRepository.MapWarpTime = Option.Some(DateTime.Now); return true; } diff --git a/EndlessClient/Input/ArrowKeyHandler.cs b/EndlessClient/Input/ArrowKeyHandler.cs index 82c1d2745..18dd4c06d 100644 --- a/EndlessClient/Input/ArrowKeyHandler.cs +++ b/EndlessClient/Input/ArrowKeyHandler.cs @@ -14,8 +14,8 @@ public class ArrowKeyHandler : InputHandlerBase IUserInputProvider userInputProvider, IUserInputTimeRepository userInputTimeRepository, IArrowKeyController arrowKeyController, - ICurrentMapStateProvider currentMapStateProvider) - : base(endlessGameProvider, userInputProvider, userInputTimeRepository, currentMapStateProvider) + ICurrentMapStateRepository currentMapStateRepository) + : base(endlessGameProvider, userInputProvider, userInputTimeRepository, currentMapStateRepository) { _arrowKeyController = arrowKeyController; } diff --git a/EndlessClient/Input/ControlKeyHandler.cs b/EndlessClient/Input/ControlKeyHandler.cs index 362d14cc3..270ecea55 100644 --- a/EndlessClient/Input/ControlKeyHandler.cs +++ b/EndlessClient/Input/ControlKeyHandler.cs @@ -14,8 +14,8 @@ public class ControlKeyHandler : InputHandlerBase IUserInputProvider userInputProvider, IUserInputTimeRepository userInputTimeRepository, IControlKeyController controlKeyController, - ICurrentMapStateProvider currentMapStateProvider) - : base(endlessGameProvider, userInputProvider, userInputTimeRepository, currentMapStateProvider) + ICurrentMapStateRepository currentMapStateRepository) + : base(endlessGameProvider, userInputProvider, userInputTimeRepository, currentMapStateRepository) { _controlKeyController = controlKeyController; } diff --git a/EndlessClient/Input/FunctionKeyHandler.cs b/EndlessClient/Input/FunctionKeyHandler.cs index b68d84184..18d692bee 100644 --- a/EndlessClient/Input/FunctionKeyHandler.cs +++ b/EndlessClient/Input/FunctionKeyHandler.cs @@ -14,8 +14,8 @@ public class FunctionKeyHandler : InputHandlerBase IUserInputProvider userInputProvider, IUserInputTimeRepository userInputTimeRepository, IFunctionKeyController functionKeyController, - ICurrentMapStateProvider currentMapStateProvider) - : base(endlessGameProvider, userInputProvider, userInputTimeRepository, currentMapStateProvider) + ICurrentMapStateRepository currentMapStateRepository) + : base(endlessGameProvider, userInputProvider, userInputTimeRepository, currentMapStateRepository) { _functionKeyController = functionKeyController; } diff --git a/EndlessClient/Input/InputHandlerBase.cs b/EndlessClient/Input/InputHandlerBase.cs index 3e77253b5..b967fb833 100644 --- a/EndlessClient/Input/InputHandlerBase.cs +++ b/EndlessClient/Input/InputHandlerBase.cs @@ -10,11 +10,12 @@ namespace EndlessClient.Input public abstract class InputHandlerBase : IInputHandler { private const int INPUT_RATE_LIMIT_MILLISECONDS = 200; + private const int WARP_BACKOFF_TIME_MILLISECONDS = 300; private readonly IEndlessGameProvider _endlessGameProvider; private readonly IUserInputProvider _keyStateProvider; private readonly IUserInputTimeRepository _userInputTimeRepository; - private readonly ICurrentMapStateProvider _mapStateProvider; + private readonly ICurrentMapStateRepository _currentMapStateRepository; private KeyboardState CurrentState => _keyStateProvider.CurrentKeyState; @@ -23,12 +24,12 @@ public abstract class InputHandlerBase : IInputHandler protected InputHandlerBase(IEndlessGameProvider endlessGameProvider, IUserInputProvider userInputProvider, IUserInputTimeRepository userInputTimeRepository, - ICurrentMapStateProvider mapStateProvider) + ICurrentMapStateRepository currentMapStateRepository) { _endlessGameProvider = endlessGameProvider; _keyStateProvider = userInputProvider; _userInputTimeRepository = userInputTimeRepository; - _mapStateProvider = mapStateProvider; + _currentMapStateRepository = currentMapStateRepository; } public void HandleKeyboardInput(DateTime timeAtBeginningOfUpdate) @@ -36,10 +37,14 @@ public void HandleKeyboardInput(DateTime timeAtBeginningOfUpdate) var millisecondsSinceLastUpdate = GetMillisecondsSinceLastUpdate(timeAtBeginningOfUpdate); if (!_endlessGameProvider.Game.IsActive || millisecondsSinceLastUpdate < INPUT_RATE_LIMIT_MILLISECONDS || - _mapStateProvider.MapWarpState != WarpState.None) + _currentMapStateRepository.MapWarpState != WarpState.None) return; - HandleInput().MatchSome(_ => _userInputTimeRepository.LastInputTime = timeAtBeginningOfUpdate); + _currentMapStateRepository.MapWarpTime = _currentMapStateRepository.MapWarpTime.Match( + some: t => (DateTime.Now - t).TotalMilliseconds > WARP_BACKOFF_TIME_MILLISECONDS ? Option.None() : Option.Some(t), + none: () => Option.None()); + + _currentMapStateRepository.MapWarpTime.MatchNone(() => HandleInput().MatchSome(_ => _userInputTimeRepository.LastInputTime = timeAtBeginningOfUpdate)); } private double GetMillisecondsSinceLastUpdate(DateTime timeAtBeginningOfUpdate) diff --git a/EndlessClient/Input/NumPadHandler.cs b/EndlessClient/Input/NumPadHandler.cs index 2bd1fc30b..8a9bae140 100644 --- a/EndlessClient/Input/NumPadHandler.cs +++ b/EndlessClient/Input/NumPadHandler.cs @@ -15,9 +15,9 @@ public class NumPadHandler : InputHandlerBase public NumPadHandler(IEndlessGameProvider endlessGameProvider, IUserInputProvider userInputProvider, IUserInputTimeRepository userInputTimeRepository, - ICurrentMapStateProvider mapStateProvider, + ICurrentMapStateRepository currentMapStateRepository, INumPadController numPadController) - : base(endlessGameProvider, userInputProvider, userInputTimeRepository, mapStateProvider) + : base(endlessGameProvider, userInputProvider, userInputTimeRepository, currentMapStateRepository) { _numPadController = numPadController; } diff --git a/EndlessClient/Input/UserInputHandler.cs b/EndlessClient/Input/UserInputHandler.cs index bb5e114c0..54a92b9f4 100644 --- a/EndlessClient/Input/UserInputHandler.cs +++ b/EndlessClient/Input/UserInputHandler.cs @@ -22,7 +22,7 @@ public class UserInputHandler : XNAControl, IUserInputHandler IControlKeyController controlKeyController, IFunctionKeyController functionKeyController, INumPadController numPadController, - ICurrentMapStateProvider currentMapStateProvider, + ICurrentMapStateRepository currentMapStateRepository, IActiveDialogProvider activeDialogProvider) { _handlers = new List @@ -31,21 +31,21 @@ public class UserInputHandler : XNAControl, IUserInputHandler userInputProvider, userInputTimeRepository, arrowKeyController, - currentMapStateProvider), + currentMapStateRepository), new ControlKeyHandler(endlessGameProvider, userInputProvider, userInputTimeRepository, controlKeyController, - currentMapStateProvider), + currentMapStateRepository), new FunctionKeyHandler(endlessGameProvider, userInputProvider, userInputTimeRepository, functionKeyController, - currentMapStateProvider), + currentMapStateRepository), new NumPadHandler(endlessGameProvider, userInputProvider, userInputTimeRepository, - currentMapStateProvider, + currentMapStateRepository, numPadController), }; _activeDialogProvider = activeDialogProvider; diff --git a/EndlessClient/Input/UserInputHandlerFactory.cs b/EndlessClient/Input/UserInputHandlerFactory.cs index 9369c6b58..4d365c947 100644 --- a/EndlessClient/Input/UserInputHandlerFactory.cs +++ b/EndlessClient/Input/UserInputHandlerFactory.cs @@ -16,7 +16,7 @@ public class UserInputHandlerFactory : IUserInputHandlerFactory private readonly IControlKeyController _controlKeyController; private readonly IFunctionKeyController _functionKeyController; private readonly INumPadController _numPadController; - private readonly ICurrentMapStateProvider _currentMapStateProvider; + private readonly ICurrentMapStateRepository _currentMapStateRepository; private readonly IActiveDialogProvider _activeDialogProvider; public UserInputHandlerFactory(IEndlessGameProvider endlessGameProvider, @@ -26,7 +26,7 @@ public class UserInputHandlerFactory : IUserInputHandlerFactory IControlKeyController controlKeyController, IFunctionKeyController functionKeyController, INumPadController numPadController, - ICurrentMapStateProvider currentMapStateProvider, + ICurrentMapStateRepository currentMapStateRepository, IActiveDialogProvider activeDialogProvider) { _endlessGameProvider = endlessGameProvider; @@ -36,7 +36,7 @@ public class UserInputHandlerFactory : IUserInputHandlerFactory _controlKeyController = controlKeyController; _functionKeyController = functionKeyController; _numPadController = numPadController; - _currentMapStateProvider = currentMapStateProvider; + _currentMapStateRepository = currentMapStateRepository; _activeDialogProvider = activeDialogProvider; } @@ -49,7 +49,7 @@ public IUserInputHandler CreateUserInputHandler() _controlKeyController, _functionKeyController, _numPadController, - _currentMapStateProvider, + _currentMapStateRepository, _activeDialogProvider); } }