Index: binaries/data/mods/public/simulation/components/Fogging.js =================================================================== --- binaries/data/mods/public/simulation/components/Fogging.js +++ binaries/data/mods/public/simulation/components/Fogging.js @@ -110,6 +110,7 @@ return; } cmpMirageVisualActor.SetActorSeed(cmpParentVisualActor.GetActorSeed()); + cmpMirageVisualActor.SetActor(cmpParentVisualActor.GetActorName()); // Store valuable information into the mirage component (especially for the GUI) var cmpFoundation = Engine.QueryInterface(this.entity, IID_Foundation); Index: binaries/data/mods/public/simulation/components/GuiInterface.js =================================================================== --- binaries/data/mods/public/simulation/components/GuiInterface.js +++ binaries/data/mods/public/simulation/components/GuiInterface.js @@ -1107,6 +1107,14 @@ cmpVisual.SetShadingColor(1.4, 0.4, 0.4, 1); else cmpVisual.SetShadingColor(1, 1, 1, 1); + + let cmpTemplateManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_TemplateManager); + let entityTemplate = cmpTemplateManager.GetTemplate(this.placementEntity[0]); + + let visualActor = ApplyValueModificationsToTemplate("VisualActor/Actor", cmpVisual.GetActorName(), + QueryOwnerInterface(ent).GetPlayerID(), entityTemplate); + + cmpVisual.SetActor(visualActor); } } Index: binaries/data/mods/public/simulation/components/Health.js =================================================================== --- binaries/data/mods/public/simulation/components/Health.js +++ binaries/data/mods/public/simulation/components/Health.js @@ -321,6 +321,7 @@ var cmpVisual = Engine.QueryInterface(this.entity, IID_Visual); var cmpCorpseVisual = Engine.QueryInterface(corpse, IID_Visual); cmpCorpseVisual.SetActorSeed(cmpVisual.GetActorSeed()); + cmpCorpseVisual.SetActor(cmpVisual.GetActorName()); // Make it fall over cmpCorpseVisual.SelectAnimation("death", true, 1.0, ""); Index: source/simulation2/components/CCmpVisualActor.cpp =================================================================== --- source/simulation2/components/CCmpVisualActor.cpp +++ source/simulation2/components/CCmpVisualActor.cpp @@ -511,6 +511,20 @@ ReloadActor(); } + virtual void SetActor(const std::wstring& newActorName) + { + if (!m_Unit) + return; + + m_ActorName = newActorName; + ReloadActor(); + } + + virtual std::wstring GetActorName() const + { + return m_ActorName; + } + virtual bool HasConstructionPreview() const { return m_ConstructionPreview; Index: source/simulation2/components/ICmpVisual.h =================================================================== --- source/simulation2/components/ICmpVisual.h +++ source/simulation2/components/ICmpVisual.h @@ -164,6 +164,16 @@ virtual void SetActorSeed(u32 seed) = 0; /** + * Set the visual actor and reload model. + */ + virtual void SetActor(const std::wstring& newActorName) = 0; + + /** + * Get actor name. + */ + virtual std::wstring GetActorName() const = 0; + + /** * Returns true if this entity should have a construction preview */ virtual bool HasConstructionPreview() const = 0; Index: source/simulation2/components/ICmpVisual.cpp =================================================================== --- source/simulation2/components/ICmpVisual.cpp +++ source/simulation2/components/ICmpVisual.cpp @@ -34,5 +34,7 @@ DEFINE_INTERFACE_METHOD_2("SetVariable", void, ICmpVisual, SetVariable, std::string, float) DEFINE_INTERFACE_METHOD_CONST_0("GetActorSeed", u32, ICmpVisual, GetActorSeed) DEFINE_INTERFACE_METHOD_1("SetActorSeed", void, ICmpVisual, SetActorSeed, u32) +DEFINE_INTERFACE_METHOD_1("SetActor", void, ICmpVisual, SetActor, std::wstring) +DEFINE_INTERFACE_METHOD_CONST_0("GetActorName", std::wstring, ICmpVisual, GetActorName) DEFINE_INTERFACE_METHOD_CONST_0("HasConstructionPreview", bool, ICmpVisual, HasConstructionPreview) END_INTERFACE_WRAPPER(Visual)