From a37ecfd023698156e87148b265b3e8820836f3bb Mon Sep 17 00:00:00 2001 From: Ethan Moffat Date: Mon, 7 Mar 2022 21:34:51 -0800 Subject: [PATCH] Update character renderers to take into account destination coordinates when walking. Fixes display bug where weapon would render underneath wall when walking. --- EOLib/Domain/Map/MapCoordinate.cs | 20 +++++++++++++++++-- EndlessClient/Rendering/Map/MapRenderer.cs | 14 ++++++------- .../MainCharacterEntityRenderer.cs | 15 ++++++++++---- .../OtherCharacterEntityRenderer.cs | 20 ++++++++++++++----- 4 files changed, 50 insertions(+), 19 deletions(-) diff --git a/EOLib/Domain/Map/MapCoordinate.cs b/EOLib/Domain/Map/MapCoordinate.cs index e96b169fd..276b4a5c5 100644 --- a/EOLib/Domain/Map/MapCoordinate.cs +++ b/EOLib/Domain/Map/MapCoordinate.cs @@ -1,6 +1,8 @@ -namespace EOLib.Domain.Map +using System; + +namespace EOLib.Domain.Map { - public struct MapCoordinate + public struct MapCoordinate : IComparable { public int X { get; } @@ -44,5 +46,19 @@ public override int GetHashCode() hash = (hash * 397) ^ Y.GetHashCode(); return hash; } + + public int CompareTo(MapCoordinate other) + { + if (other == null) + return -1; + + if (other.X < X || other.Y < Y) + return -1; + + if (other.X > X || other.Y > Y) + return 1; + + return 0; + } } } diff --git a/EndlessClient/Rendering/Map/MapRenderer.cs b/EndlessClient/Rendering/Map/MapRenderer.cs index da550048d..2c822bab4 100644 --- a/EndlessClient/Rendering/Map/MapRenderer.cs +++ b/EndlessClient/Rendering/Map/MapRenderer.cs @@ -210,7 +210,7 @@ private void DrawMapToRenderTarget() GraphicsDevice.SetRenderTarget(_mapObjectTarget); GraphicsDevice.Clear(ClearOptions.Target, Color.Transparent, 0, 0); - var gfxToRenderLast = new SortedList>(new PointComparer()); + var gfxToRenderLast = new SortedList>(); _sb.Begin(); @@ -228,11 +228,11 @@ private void DrawMapToRenderTarget() if (renderer.ShouldRenderLast) { - var renderLaterKey = new Point(col, row); + var renderLaterKey = new MapCoordinate(col, row); if (gfxToRenderLast.ContainsKey(renderLaterKey)) - gfxToRenderLast[renderLaterKey].Add(renderer.RenderLayer); + gfxToRenderLast[renderLaterKey].Add(renderer); else - gfxToRenderLast.Add(renderLaterKey, new List { renderer.RenderLayer }); + gfxToRenderLast.Add(renderLaterKey, new List { renderer }); } else renderer.RenderElementAt(_sb, row, col, alpha); @@ -245,11 +245,9 @@ private void DrawMapToRenderTarget() var pointKey = kvp.Key; var alpha = GetAlphaForCoordinates(pointKey.X, pointKey.Y, immutableCharacter); - foreach (var layer in kvp.Value) + foreach (var renderer in kvp.Value) { - _mapEntityRendererProvider.MapEntityRenderers - .Single(x => x.RenderLayer == layer) - .RenderElementAt(_sb, pointKey.Y, pointKey.X, alpha); + renderer.RenderElementAt(_sb, pointKey.Y, pointKey.X, alpha); } } diff --git a/EndlessClient/Rendering/MapEntityRenderers/MainCharacterEntityRenderer.cs b/EndlessClient/Rendering/MapEntityRenderers/MainCharacterEntityRenderer.cs index e3e572e4e..f6daa87fc 100644 --- a/EndlessClient/Rendering/MapEntityRenderers/MainCharacterEntityRenderer.cs +++ b/EndlessClient/Rendering/MapEntityRenderers/MainCharacterEntityRenderer.cs @@ -1,8 +1,8 @@ -using System; -using EndlessClient.Rendering.Character; +using EndlessClient.Rendering.Character; using EndlessClient.Rendering.Chat; using EndlessClient.Rendering.Map; using EOLib.Domain.Character; +using EOLib.Domain.Extensions; using Microsoft.Xna.Framework; using Microsoft.Xna.Framework.Graphics; @@ -33,8 +33,15 @@ public class MainCharacterEntityRenderer : BaseMapEntityRenderer protected override bool ElementExistsAt(int row, int col) { - return row == _characterProvider.MainCharacter.RenderProperties.MapY && - col == _characterProvider.MainCharacter.RenderProperties.MapX; + var rp = _characterProvider.MainCharacter.RenderProperties; + if (!rp.IsActing(CharacterActionState.Walking)) + { + return row == rp.MapY && col == rp.MapX; + } + else + { + return row == rp.GetDestinationY() && col == rp.GetDestinationX(); + } } public override void RenderElementAt(SpriteBatch spriteBatch, int row, int col, int alpha, Vector2 additionalOffset = default) diff --git a/EndlessClient/Rendering/MapEntityRenderers/OtherCharacterEntityRenderer.cs b/EndlessClient/Rendering/MapEntityRenderers/OtherCharacterEntityRenderer.cs index cef29a05d..346d3f48c 100644 --- a/EndlessClient/Rendering/MapEntityRenderers/OtherCharacterEntityRenderer.cs +++ b/EndlessClient/Rendering/MapEntityRenderers/OtherCharacterEntityRenderer.cs @@ -1,9 +1,9 @@ -using System; -using System.Linq; +using System.Linq; using EndlessClient.Rendering.Character; using EndlessClient.Rendering.Chat; using EndlessClient.Rendering.Map; using EOLib.Domain.Character; +using EOLib.Domain.Extensions; using Microsoft.Xna.Framework; using Microsoft.Xna.Framework.Graphics; @@ -40,9 +40,7 @@ protected override bool ElementExistsAt(int row, int col) public override void RenderElementAt(SpriteBatch spriteBatch, int row, int col, int alpha, Vector2 additionalOffset = default) { - var idsToRender = _characterStateCache.OtherCharacters.Keys.Where( - key => _characterStateCache.OtherCharacters[key].RenderProperties.MapX == col && - _characterStateCache.OtherCharacters[key].RenderProperties.MapY == row); + var idsToRender = _characterStateCache.OtherCharacters.Keys.Where(k => IsAtPosition(k, row, col)); foreach (var id in idsToRender) { @@ -58,5 +56,17 @@ public override void RenderElementAt(SpriteBatch spriteBatch, int row, int col, bubble.DrawToSpriteBatch(spriteBatch); } } + private bool IsAtPosition(int characterId, int row, int col) + { + var rp = _characterStateCache.OtherCharacters[characterId].RenderProperties; + if (!rp.IsActing(CharacterActionState.Walking)) + { + return row == rp.MapY && col == rp.MapX; + } + else + { + return row == rp.GetDestinationY() && col == rp.GetDestinationX(); + } + } } } \ No newline at end of file