From 188b9c0befd8edc19790a143925813b93175a609 Mon Sep 17 00:00:00 2001 From: Ethan Moffat Date: Fri, 8 Apr 2022 11:11:12 -0700 Subject: [PATCH] Refactor UnwalkableTileActions to not send packets directly. Move sending of packets for door/chair into appropriate domain model actions classes. --- EOLib/Domain/Character/CharacterActions.cs | 15 +++++ EOLib/Domain/Map/MapActions.cs | 18 ++++- .../Controllers/ArrowKeyController.cs | 16 ++++- EndlessClient/Input/UnwalkableTileActions.cs | 66 ++++++++----------- 4 files changed, 72 insertions(+), 43 deletions(-) diff --git a/EOLib/Domain/Character/CharacterActions.cs b/EOLib/Domain/Character/CharacterActions.cs index 86c560108..6c1f455a9 100644 --- a/EOLib/Domain/Character/CharacterActions.cs +++ b/EOLib/Domain/Character/CharacterActions.cs @@ -79,6 +79,19 @@ public void ToggleSit() _packetSendService.SendPacket(packet); } + public void SitInChair() + { + var rp = _characterProvider.MainCharacter.RenderProperties; + var action = rp.SitState == SitState.Chair ? SitAction.Stand : SitAction.Sit; + var packet = new PacketBuilder(PacketFamily.Chair, PacketAction.Request) + .AddChar((byte)action) + .AddChar((byte)rp.GetDestinationX()) + .AddChar((byte)rp.GetDestinationY()) + .Build(); + + _packetSendService.SendPacket(packet); + } + public void PrepareCastSpell(int spellId) { var packet = new PacketBuilder(PacketFamily.Spell, PacketAction.Request) @@ -159,6 +172,8 @@ public interface ICharacterActions void ToggleSit(); + void SitInChair(); + void PrepareCastSpell(int spellId); void CastSpell(int spellId, ISpellTargetable target); diff --git a/EOLib/Domain/Map/MapActions.cs b/EOLib/Domain/Map/MapActions.cs index b94cfa21f..4439cd57f 100644 --- a/EOLib/Domain/Map/MapActions.cs +++ b/EOLib/Domain/Map/MapActions.cs @@ -12,14 +12,17 @@ public class MapActions : IMapActions private readonly IPacketSendService _packetSendService; private readonly IItemPickupValidator _itemPickupValidator; private readonly ICharacterProvider _characterProvider; + private readonly ICurrentMapStateRepository _currentMapStateRepository; public MapActions(IPacketSendService packetSendService, IItemPickupValidator itemPickupValidator, - ICharacterProvider characterProvider) + ICharacterProvider characterProvider, + ICurrentMapStateRepository currentMapStateRepository) { _packetSendService = packetSendService; _itemPickupValidator = itemPickupValidator; _characterProvider = characterProvider; + _currentMapStateRepository = currentMapStateRepository; } public void RequestRefresh() @@ -42,6 +45,17 @@ public ItemPickupResult PickUpItem(IItem item) return pickupResult; } + + public void OpenDoor(IWarp warp) + { + var packet = new PacketBuilder(PacketFamily.Door, PacketAction.Open) + .AddChar((byte)warp.X) + .AddChar((byte)warp.Y) + .Build(); + + _packetSendService.SendPacket(packet); + _currentMapStateRepository.PendingDoors.Add(warp); + } } public interface IMapActions @@ -49,5 +63,7 @@ public interface IMapActions void RequestRefresh(); ItemPickupResult PickUpItem(IItem item); + + void OpenDoor(IWarp warp); } } diff --git a/EndlessClient/Controllers/ArrowKeyController.cs b/EndlessClient/Controllers/ArrowKeyController.cs index 8222cf4b1..ed0b7914f 100644 --- a/EndlessClient/Controllers/ArrowKeyController.cs +++ b/EndlessClient/Controllers/ArrowKeyController.cs @@ -17,18 +17,24 @@ public class ArrowKeyController : IArrowKeyController private readonly ICharacterProvider _characterProvider; private readonly IUnwalkableTileActions _unwalkableTileActions; private readonly ISpikeTrapActions _spikeTrapActions; + private readonly ICharacterActions _characterActions; + private readonly IMapActions _mapActions; public ArrowKeyController(IWalkValidationActions walkValidationActions, ICharacterAnimationActions characterAnimationActions, ICharacterProvider characterProvider, IUnwalkableTileActions walkErrorHandler, - ISpikeTrapActions spikeTrapActions) + ISpikeTrapActions spikeTrapActions, + ICharacterActions characterActions, + IMapActions mapActions) { _walkValidationActions = walkValidationActions; _characterAnimationActions = characterAnimationActions; _characterProvider = characterProvider; _unwalkableTileActions = walkErrorHandler; _spikeTrapActions = spikeTrapActions; + _characterActions = characterActions; + _mapActions = mapActions; } public bool MoveLeft() @@ -99,7 +105,13 @@ private void AttemptToStartWalking() { if (!_walkValidationActions.CanMoveToDestinationCoordinates()) { - _unwalkableTileActions.HandleUnwalkableTile(); + var (unwalkableAction, cellState) = _unwalkableTileActions.HandleUnwalkableTile(); + switch (unwalkableAction) + { + case UnwalkableTileAction.Chest: /* todo: request chest and show dialog */ break; + case UnwalkableTileAction.Chair: _characterActions.SitInChair(); break; + case UnwalkableTileAction.Door: cellState.Warp.MatchSome(w => _mapActions.OpenDoor(w)); break; + } } else { diff --git a/EndlessClient/Input/UnwalkableTileActions.cs b/EndlessClient/Input/UnwalkableTileActions.cs index b497bf276..2c90c9b7f 100644 --- a/EndlessClient/Input/UnwalkableTileActions.cs +++ b/EndlessClient/Input/UnwalkableTileActions.cs @@ -1,5 +1,4 @@ using AutomaticTypeMapper; -using EndlessClient.Dialogs; using EndlessClient.Dialogs.Factories; using EndlessClient.HUD; using EOLib.Domain.Character; @@ -7,12 +6,17 @@ using EOLib.Domain.Map; using EOLib.IO.Map; using EOLib.Localization; -using EOLib.Net; -using EOLib.Net.Communication; -using Optional; namespace EndlessClient.Input { + public enum UnwalkableTileAction + { + None, + Chair, + Chest, + Door, + } + [AutoMappedType] public class UnwalkableTileActions : IUnwalkableTileActions { @@ -23,7 +27,6 @@ public class UnwalkableTileActions : IUnwalkableTileActions private readonly IUnlockDoorValidator _unlockDoorValidator; private readonly IUnlockChestValidator _unlockChestValidator; private readonly IEOMessageBoxFactory _eoMessageBoxFactory; - private readonly IPacketSendService _packetSendService; private readonly IEOMessageBoxFactory _messageBoxFactory; public UnwalkableTileActions(IMapCellStateProvider mapCellStateProvider, @@ -33,7 +36,6 @@ public class UnwalkableTileActions : IUnwalkableTileActions IUnlockDoorValidator unlockDoorValidator, IUnlockChestValidator unlockChestValidator, IEOMessageBoxFactory eoMessageBoxFactory, - IPacketSendService packetSendService, IEOMessageBoxFactory messageBoxFactory) { _mapCellStateProvider = mapCellStateProvider; @@ -43,27 +45,27 @@ public class UnwalkableTileActions : IUnwalkableTileActions _unlockDoorValidator = unlockDoorValidator; _unlockChestValidator = unlockChestValidator; _eoMessageBoxFactory = eoMessageBoxFactory; - _packetSendService = packetSendService; _messageBoxFactory = messageBoxFactory; } - public void HandleUnwalkableTile() + public (UnwalkableTileAction, IMapCellState) HandleUnwalkableTile() { if (MainCharacter.RenderProperties.SitState != SitState.Standing) - return; + return (UnwalkableTileAction.None, new MapCellState()); var destX = MainCharacter.RenderProperties.GetDestinationX(); var destY = MainCharacter.RenderProperties.GetDestinationY(); var cellState = _mapCellStateProvider.GetCellStateAt(destX, destY); - cellState.Character.Match( + var action = cellState.Character.Match( some: c => HandleWalkThroughOtherCharacter(c), //todo: walk through players after certain elapsed time (3-5sec?) none: () => cellState.Warp.Match( some: w => HandleWalkToWarpTile(w), none: () => HandleWalkToTileSpec(cellState))); + return (action, cellState); } - private void HandleWalkThroughOtherCharacter(ICharacter c) + private UnwalkableTileAction HandleWalkThroughOtherCharacter(ICharacter c) { // EOGame.Instance.Hud.SetStatusLabel(EOResourceID.STATUS_LABEL_TYPE_ACTION, // EOResourceID.STATUS_LABEL_KEEP_MOVING_THROUGH_PLAYER); @@ -74,9 +76,10 @@ private void HandleWalkThroughOtherCharacter(ICharacter c) // _startWalkingThroughPlayerTime = null; // goto case TileInfoReturnType.IsTileSpec; // } + return UnwalkableTileAction.None; } - private void HandleWalkToWarpTile(IWarp warp) + private UnwalkableTileAction HandleWalkToWarpTile(IWarp warp) { if (warp.DoorType != DoorSpec.NoDoor) { @@ -93,13 +96,7 @@ private void HandleWalkToWarpTile(IWarp warp) else if (!_currentMapStateRepository.OpenDoors.Contains(warp) && !_currentMapStateRepository.PendingDoors.Contains(warp)) { - var packet = new PacketBuilder(PacketFamily.Door, PacketAction.Open) - .AddChar((byte) warp.X) - .AddChar((byte) warp.Y) - .Build(); - - _packetSendService.SendPacket(packet); - _currentMapStateRepository.PendingDoors.Add(warp); + return UnwalkableTileAction.Door; } } else if (warp.LevelRequirement > 0 && MainCharacter.Stats[CharacterStat.Level] < warp.LevelRequirement) @@ -108,9 +105,11 @@ private void HandleWalkToWarpTile(IWarp warp) EOResourceID.STATUS_LABEL_NOT_READY_TO_USE_ENTRANCE, " - LVL " + warp.LevelRequirement); } + + return UnwalkableTileAction.None; } - private void HandleWalkToTileSpec(IMapCellState cellState) + private UnwalkableTileAction HandleWalkToTileSpec(IMapCellState cellState) { switch (cellState.TileSpec) { @@ -121,10 +120,9 @@ private void HandleWalkToTileSpec(IMapCellState cellState) case TileSpec.ChairDownRight: case TileSpec.ChairUpLeft: case TileSpec.ChairAll: - HandleWalkToChair(); - break; + return UnwalkableTileAction.Chair; case TileSpec.Chest: - cellState.ChestKey.Match( + return cellState.ChestKey.Match( some: key => { if (!_unlockChestValidator.CanMainCharacterOpenChest(key)) @@ -134,17 +132,17 @@ private void HandleWalkToTileSpec(IMapCellState cellState) var requiredKey = _unlockChestValidator.GetRequiredKeyName(key); _statusLabelSetter.SetStatusLabel(EOResourceID.STATUS_LABEL_TYPE_WARNING, EOResourceID.STATUS_LABEL_THE_CHEST_IS_LOCKED_EXCLAMATION, " - " + requiredKey); + return UnwalkableTileAction.None; } else { - // todo: chest request, show dialog + return UnwalkableTileAction.Chest; } }, none: () => { - // todo: chest request, show dialog + return UnwalkableTileAction.Chest; }); - break; case TileSpec.BankVault: //todo: locker //walkValid = Renderer.NoWall; //if (!walkValid) @@ -164,20 +162,8 @@ private void HandleWalkToTileSpec(IMapCellState cellState) case TileSpec.Jukebox: //todo: jukebox break; } - } - - private void HandleWalkToChair() - { - // server validates that chair direction is OK and that no one is already sitting there - var rp = _characterProvider.MainCharacter.RenderProperties; - var action = rp.SitState == SitState.Chair ? SitAction.Stand : SitAction.Sit; - var packet = new PacketBuilder(PacketFamily.Chair, PacketAction.Request) - .AddChar((byte)action) - .AddChar((byte)rp.GetDestinationX()) - .AddChar((byte)rp.GetDestinationY()) - .Build(); - _packetSendService.SendPacket(packet); + return UnwalkableTileAction.None; } private ICharacter MainCharacter => _characterProvider.MainCharacter; @@ -185,6 +171,6 @@ private void HandleWalkToChair() public interface IUnwalkableTileActions { - void HandleUnwalkableTile(); + (UnwalkableTileAction, IMapCellState) HandleUnwalkableTile(); } }