From f21572d22a71582b06494b8f088c351c8a73144f Mon Sep 17 00:00:00 2001 From: Gustas <37534529+PunkPun@users.noreply.github.com> Date: Wed, 4 Sep 2024 20:53:34 +0300 Subject: [PATCH] Fix DynamicFacingInit not being dynamic --- OpenRA.Mods.Common/Graphics/ActorPreview.cs | 51 ++++++++++++++------- 1 file changed, 34 insertions(+), 17 deletions(-) diff --git a/OpenRA.Mods.Common/Graphics/ActorPreview.cs b/OpenRA.Mods.Common/Graphics/ActorPreview.cs index afca3a4fe9..4fccdc45e4 100644 --- a/OpenRA.Mods.Common/Graphics/ActorPreview.cs +++ b/OpenRA.Mods.Common/Graphics/ActorPreview.cs @@ -69,30 +69,47 @@ namespace OpenRA.Mods.Common.Graphics WAngle facing; - // Dynamic facing takes priority - var dynamicInit = reference.GetOrDefault(); - if (dynamicInit != null) - { - var getFacing = dynamicInit.Value; - facing = getFacing(); - } - else - { - // Fall back to initial actor facing if an Init isn't available - var facingInit = reference.GetOrDefault(); - facing = facingInit != null ? facingInit.Value : facingInfo.GetInitialFacing(); - } - var mobileInfo = Actor.TraitInfoOrDefault(); var location = reference.GetOrDefault(); if (location == null || mobileInfo == null || mobileInfo.TerrainOrientationAdjustmentMargin.Length < 0) - return () => WRot.FromYaw(facing); + { + // Dynamic facing takes priority. + var dynamicInit = reference.GetOrDefault(); + if (dynamicInit != null) + { + var getFacing = dynamicInit.Value; + return () => WRot.FromYaw(getFacing()); + } + else + { + // Fall back to initial actor facing if an Init isn't available. + var facingInit = reference.GetOrDefault(); + facing = facingInit != null ? facingInit.Value : facingInfo.GetInitialFacing(); + return () => WRot.FromYaw(facing); + } + } var orientationInit = reference.GetOrDefault(); var terrainOrientation = orientationInit != null ? orientationInit.Value : World.Map.TerrainOrientation(location.Value); - var terrainAdjustedFacing = new WRot(new WVec(0, 0, 1024).Rotate(terrainOrientation), facing); + var normalVector = new WVec(0, 0, 1024).Rotate(terrainOrientation); - return () => terrainOrientation + terrainAdjustedFacing; + // Duplicated as to make more efficient delegates. + { + // Dynamic facing takes priority. + var dynamicInit = reference.GetOrDefault(); + if (dynamicInit != null) + { + var getFacing = dynamicInit.Value; + return () => terrainOrientation + new WRot(normalVector, getFacing()); + } + else + { + // Fall back to initial actor facing if an Init isn't available. + var facingInit = reference.GetOrDefault(); + facing = facingInit != null ? facingInit.Value : facingInfo.GetInitialFacing(); + return () => terrainOrientation + new WRot(normalVector, facing); + } + } } public Func GetFacing()