From f447949b88b176245058894f8eced6539c89f960 Mon Sep 17 00:00:00 2001 From: Ethan Moffat Date: Tue, 2 May 2023 21:01:32 -0700 Subject: [PATCH] Fix emote display when sitting --- .../CharacterRenderPropertiesExtensions.cs | 4 +++- EndlessClient/Controllers/NumPadController.cs | 2 +- .../Rendering/Character/CharacterAnimator.cs | 3 ++- .../CharacterProperties/FaceRenderer.cs | 8 ++++++-- .../CharacterProperties/WeaponRenderer.cs | 3 ++- .../Sprites/CharacterSpriteCalculator.cs | 16 ++++++++++++---- 6 files changed, 26 insertions(+), 10 deletions(-) diff --git a/EOLib/Domain/Extensions/CharacterRenderPropertiesExtensions.cs b/EOLib/Domain/Extensions/CharacterRenderPropertiesExtensions.cs index e475bef6c..8ea46ba4e 100644 --- a/EOLib/Domain/Extensions/CharacterRenderPropertiesExtensions.cs +++ b/EOLib/Domain/Extensions/CharacterRenderPropertiesExtensions.cs @@ -87,8 +87,10 @@ public static CharacterRenderProperties WithNextEmoteFrame(this CharacterRenderP { var props = rp.ToBuilder(); props.EmoteFrame = (props.EmoteFrame + 1) % CharacterRenderProperties.MAX_NUMBER_OF_EMOTE_FRAMES; + + var resetAction = props.SitState == SitState.Standing ? CharacterActionState.Standing : CharacterActionState.Sitting; props.CurrentAction = props.EmoteFrame == 0 - ? CharacterActionState.Standing + ? resetAction : props.CurrentAction == CharacterActionState.Attacking // when using an instrument keep the current state as "Attacking" ? CharacterActionState.Attacking : CharacterActionState.Emote; diff --git a/EndlessClient/Controllers/NumPadController.cs b/EndlessClient/Controllers/NumPadController.cs index be501e11a..a2c390b11 100644 --- a/EndlessClient/Controllers/NumPadController.cs +++ b/EndlessClient/Controllers/NumPadController.cs @@ -23,7 +23,7 @@ public class NumPadController : INumPadController public void Emote(Emote whichEmote) { - if (!_characterProvider.MainCharacter.RenderProperties.IsActing(CharacterActionState.Standing)) + if (!_characterProvider.MainCharacter.RenderProperties.IsActing(CharacterActionState.Standing, CharacterActionState.Sitting)) return; _characterActions.Emote(whichEmote); diff --git a/EndlessClient/Rendering/Character/CharacterAnimator.cs b/EndlessClient/Rendering/Character/CharacterAnimator.cs index b21889979..ec23be281 100644 --- a/EndlessClient/Rendering/Character/CharacterAnimator.cs +++ b/EndlessClient/Rendering/Character/CharacterAnimator.cs @@ -254,6 +254,7 @@ public bool Emote(int characterID, Emote whichEmote) else { _currentMapStateRepository.UnknownPlayerIDs.Add(characterID); + return false; } _startEmoteTimes[characterID] = startEmoteTime; @@ -536,7 +537,7 @@ private void AnimateCharacterEmotes() var nextFrameRenderProperties = renderProperties.WithNextEmoteFrame(); pair.UpdateActionStartTime(); - if (nextFrameRenderProperties.IsActing(CharacterActionState.Standing)) + if (nextFrameRenderProperties.IsActing(CharacterActionState.Standing, CharacterActionState.Sitting)) playersDoneEmoting.Add(pair.UniqueID); var nextFrameCharacter = currentCharacter.WithRenderProperties(nextFrameRenderProperties); diff --git a/EndlessClient/Rendering/CharacterProperties/FaceRenderer.cs b/EndlessClient/Rendering/CharacterProperties/FaceRenderer.cs index b0c295efd..5392a2cec 100644 --- a/EndlessClient/Rendering/CharacterProperties/FaceRenderer.cs +++ b/EndlessClient/Rendering/CharacterProperties/FaceRenderer.cs @@ -35,8 +35,12 @@ public override void Render(SpriteBatch spriteBatch, Rectangle parentCharacterDr return; var skinLoc = _skinRenderLocationCalculator.CalculateDrawLocationOfCharacterSkin(_skinSheet.SourceRectangle, parentCharacterDrawArea); - var facePos = new Vector2(skinLoc.X + (_renderProperties.IsFacing(EODirection.Down) ? 2 : 3), - skinLoc.Y + (_renderProperties.Gender == 0 ? 2 : 0)); + + var adjustX = _renderProperties.IsFacing(EODirection.Down) + ? _renderProperties.SitState == SitState.Standing ? 2 : 8 + : 3; + + var facePos = new Vector2(skinLoc.X + adjustX, skinLoc.Y + (_renderProperties.Gender == 0 ? 2 : 0)); Render(spriteBatch, _faceSheet, facePos); } diff --git a/EndlessClient/Rendering/CharacterProperties/WeaponRenderer.cs b/EndlessClient/Rendering/CharacterProperties/WeaponRenderer.cs index 6dc37a046..f201c0871 100644 --- a/EndlessClient/Rendering/CharacterProperties/WeaponRenderer.cs +++ b/EndlessClient/Rendering/CharacterProperties/WeaponRenderer.cs @@ -23,7 +23,8 @@ public class WeaponRenderer : BaseCharacterPropertyRenderer public override void Render(SpriteBatch spriteBatch, Rectangle parentCharacterDrawArea) { - if (_renderProperties.IsActing(CharacterActionState.Sitting, CharacterActionState.SpellCast)) + if (_renderProperties.IsActing(CharacterActionState.Sitting, CharacterActionState.SpellCast) || + (_renderProperties.CurrentAction == CharacterActionState.Emote && _renderProperties.SitState != SitState.Standing)) return; var offsets = GetOffsets(parentCharacterDrawArea); diff --git a/EndlessClient/Rendering/Sprites/CharacterSpriteCalculator.cs b/EndlessClient/Rendering/Sprites/CharacterSpriteCalculator.cs index aa16e76ee..07a2059bd 100644 --- a/EndlessClient/Rendering/Sprites/CharacterSpriteCalculator.cs +++ b/EndlessClient/Rendering/Sprites/CharacterSpriteCalculator.cs @@ -31,7 +31,11 @@ public ISpriteSheet GetBootsTexture(CharacterRenderProperties characterRenderPro return new EmptySpriteSheet(); var type = BootsSpriteType.Standing; - switch (characterRenderProperties.CurrentAction) + var currentAction = characterRenderProperties.CurrentAction; + if (currentAction == CharacterActionState.Emote && characterRenderProperties.SitState != SitState.Standing) + currentAction = CharacterActionState.Sitting; + + switch (currentAction) { case CharacterActionState.Walking: switch (characterRenderProperties.RenderWalkFrame) @@ -71,7 +75,11 @@ public ISpriteSheet GetArmorTexture(CharacterRenderProperties characterRenderPro return new EmptySpriteSheet(); var type = ArmorShieldSpriteType.Standing; - switch (characterRenderProperties.CurrentAction) + var currentAction = characterRenderProperties.CurrentAction; + if (currentAction == CharacterActionState.Emote && characterRenderProperties.SitState != SitState.Standing) + currentAction = CharacterActionState.Sitting; + + switch (currentAction) { case CharacterActionState.Walking: switch (characterRenderProperties.RenderWalkFrame) @@ -172,7 +180,7 @@ public ISpriteSheet GetShieldTexture(CharacterRenderProperties characterRenderPr { type = ArmorShieldSpriteType.SpellCast; } - else if(characterRenderProperties.CurrentAction == CharacterActionState.Sitting) + else if(characterRenderProperties.SitState != SitState.Standing) { return new EmptySpriteSheet(); } @@ -298,7 +306,7 @@ public ISpriteSheet GetSkinTexture(CharacterRenderProperties characterRenderProp { gfxNum = 4; } - else if (characterRenderProperties.CurrentAction == CharacterActionState.Sitting) + else if (characterRenderProperties.SitState != SitState.Standing) { if (characterRenderProperties.SitState == SitState.Floor) gfxNum = 6; else if (characterRenderProperties.SitState == SitState.Chair) gfxNum = 5;