Index: binaries/data/mods/public/art/actors/props/special/common/waypoint_flag.xml =================================================================== --- binaries/data/mods/public/art/actors/props/special/common/waypoint_flag.xml +++ /dev/null @@ -1,91 +0,0 @@ - - - - - - - - - - props/waypoint_flag.dae - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - basic_trans.xml - Index: binaries/data/mods/public/art/actors/props/special/common/waypoint_flag_athen.xml =================================================================== --- /dev/null +++ binaries/data/mods/public/art/actors/props/special/common/waypoint_flag_athen.xml @@ -0,0 +1,17 @@ + + + + + + + + + + props/waypoint_flag.dae + + + + + + basic_trans.xml + Index: binaries/data/mods/public/art/actors/props/special/common/waypoint_flag_brit.xml =================================================================== --- /dev/null +++ binaries/data/mods/public/art/actors/props/special/common/waypoint_flag_brit.xml @@ -0,0 +1,17 @@ + + + + + + + + + + props/waypoint_flag.dae + + + + + + basic_trans.xml + Index: binaries/data/mods/public/art/actors/props/special/common/waypoint_flag_cart.xml =================================================================== --- /dev/null +++ binaries/data/mods/public/art/actors/props/special/common/waypoint_flag_cart.xml @@ -0,0 +1,17 @@ + + + + + + + + + + props/waypoint_flag.dae + + + + + + basic_trans.xml + Index: binaries/data/mods/public/art/actors/props/special/common/waypoint_flag_gaul.xml =================================================================== --- /dev/null +++ binaries/data/mods/public/art/actors/props/special/common/waypoint_flag_gaul.xml @@ -0,0 +1,17 @@ + + + + + + + + + + props/waypoint_flag.dae + + + + + + basic_trans.xml + Index: binaries/data/mods/public/art/actors/props/special/common/waypoint_flag_iber.xml =================================================================== --- /dev/null +++ binaries/data/mods/public/art/actors/props/special/common/waypoint_flag_iber.xml @@ -0,0 +1,17 @@ + + + + + + + + + + props/waypoint_flag.dae + + + + + + basic_trans.xml + Index: binaries/data/mods/public/art/actors/props/special/common/waypoint_flag_kush.xml =================================================================== --- /dev/null +++ binaries/data/mods/public/art/actors/props/special/common/waypoint_flag_kush.xml @@ -0,0 +1,17 @@ + + + + + + + + + + props/waypoint_flag.dae + + + + + + basic_trans.xml + Index: binaries/data/mods/public/art/actors/props/special/common/waypoint_flag_mace.xml =================================================================== --- /dev/null +++ binaries/data/mods/public/art/actors/props/special/common/waypoint_flag_mace.xml @@ -0,0 +1,17 @@ + + + + + + + + + + props/waypoint_flag.dae + + + + + + basic_trans.xml + Index: binaries/data/mods/public/art/actors/props/special/common/waypoint_flag_maur.xml =================================================================== --- /dev/null +++ binaries/data/mods/public/art/actors/props/special/common/waypoint_flag_maur.xml @@ -0,0 +1,17 @@ + + + + + + + + + + props/waypoint_flag.dae + + + + + + basic_trans.xml + Index: binaries/data/mods/public/art/actors/props/special/common/waypoint_flag_pers.xml =================================================================== --- /dev/null +++ binaries/data/mods/public/art/actors/props/special/common/waypoint_flag_pers.xml @@ -0,0 +1,17 @@ + + + + + + + + + + props/waypoint_flag.dae + + + + + + basic_trans.xml + Index: binaries/data/mods/public/art/actors/props/special/common/waypoint_flag_ptol.xml =================================================================== --- /dev/null +++ binaries/data/mods/public/art/actors/props/special/common/waypoint_flag_ptol.xml @@ -0,0 +1,17 @@ + + + + + + + + + + props/waypoint_flag.dae + + + + + + basic_trans.xml + Index: binaries/data/mods/public/art/actors/props/special/common/waypoint_flag_rome.xml =================================================================== --- /dev/null +++ binaries/data/mods/public/art/actors/props/special/common/waypoint_flag_rome.xml @@ -0,0 +1,17 @@ + + + + + + + + + + props/waypoint_flag.dae + + + + + + basic_trans.xml + Index: binaries/data/mods/public/art/actors/props/special/common/waypoint_flag_sele.xml =================================================================== --- /dev/null +++ binaries/data/mods/public/art/actors/props/special/common/waypoint_flag_sele.xml @@ -0,0 +1,17 @@ + + + + + + + + + + props/waypoint_flag.dae + + + + + + basic_trans.xml + Index: binaries/data/mods/public/art/actors/props/special/common/waypoint_flag_spart.xml =================================================================== --- /dev/null +++ binaries/data/mods/public/art/actors/props/special/common/waypoint_flag_spart.xml @@ -0,0 +1,17 @@ + + + + + + + + + + props/waypoint_flag.dae + + + + + + basic_trans.xml + Index: binaries/data/mods/public/simulation/templates/special/rallypoint.xml =================================================================== --- binaries/data/mods/public/simulation/templates/special/rallypoint.xml +++ binaries/data/mods/public/simulation/templates/special/rallypoint.xml @@ -1,9 +1,13 @@ + + Rally point flag + true + true - props/special/common/waypoint_flag.xml + props/special/common/waypoint_flag_{civ}.xml Index: binaries/data/mods/public/simulation/templates/special/rallypoints/athen.xml =================================================================== --- /dev/null +++ binaries/data/mods/public/simulation/templates/special/rallypoints/athen.xml @@ -0,0 +1,6 @@ + + + + athen + + Index: binaries/data/mods/public/simulation/templates/special/rallypoints/brit.xml =================================================================== --- /dev/null +++ binaries/data/mods/public/simulation/templates/special/rallypoints/brit.xml @@ -0,0 +1,6 @@ + + + + brit + + Index: binaries/data/mods/public/simulation/templates/special/rallypoints/cart.xml =================================================================== --- /dev/null +++ binaries/data/mods/public/simulation/templates/special/rallypoints/cart.xml @@ -0,0 +1,6 @@ + + + + cart + + Index: binaries/data/mods/public/simulation/templates/special/rallypoints/gaul.xml =================================================================== --- /dev/null +++ binaries/data/mods/public/simulation/templates/special/rallypoints/gaul.xml @@ -0,0 +1,6 @@ + + + + gaul + + Index: binaries/data/mods/public/simulation/templates/special/rallypoints/iber.xml =================================================================== --- /dev/null +++ binaries/data/mods/public/simulation/templates/special/rallypoints/iber.xml @@ -0,0 +1,6 @@ + + + + iber + + Index: binaries/data/mods/public/simulation/templates/special/rallypoints/kush.xml =================================================================== --- /dev/null +++ binaries/data/mods/public/simulation/templates/special/rallypoints/kush.xml @@ -0,0 +1,6 @@ + + + + kush + + Index: binaries/data/mods/public/simulation/templates/special/rallypoints/mace.xml =================================================================== --- /dev/null +++ binaries/data/mods/public/simulation/templates/special/rallypoints/mace.xml @@ -0,0 +1,6 @@ + + + + mace + + Index: binaries/data/mods/public/simulation/templates/special/rallypoints/maur.xml =================================================================== --- /dev/null +++ binaries/data/mods/public/simulation/templates/special/rallypoints/maur.xml @@ -0,0 +1,6 @@ + + + + maur + + Index: binaries/data/mods/public/simulation/templates/special/rallypoints/pers.xml =================================================================== --- /dev/null +++ binaries/data/mods/public/simulation/templates/special/rallypoints/pers.xml @@ -0,0 +1,6 @@ + + + + pers + + Index: binaries/data/mods/public/simulation/templates/special/rallypoints/ptol.xml =================================================================== --- /dev/null +++ binaries/data/mods/public/simulation/templates/special/rallypoints/ptol.xml @@ -0,0 +1,6 @@ + + + + ptol + + Index: binaries/data/mods/public/simulation/templates/special/rallypoints/rome.xml =================================================================== --- /dev/null +++ binaries/data/mods/public/simulation/templates/special/rallypoints/rome.xml @@ -0,0 +1,6 @@ + + + + rome + + Index: binaries/data/mods/public/simulation/templates/special/rallypoints/sele.xml =================================================================== --- /dev/null +++ binaries/data/mods/public/simulation/templates/special/rallypoints/sele.xml @@ -0,0 +1,6 @@ + + + + sele + + Index: binaries/data/mods/public/simulation/templates/special/rallypoints/spart.xml =================================================================== --- /dev/null +++ binaries/data/mods/public/simulation/templates/special/rallypoints/spart.xml @@ -0,0 +1,6 @@ + + + + spart + + Index: binaries/data/mods/public/simulation/templates/template_structure.xml =================================================================== --- binaries/data/mods/public/simulation/templates/template_structure.xml +++ binaries/data/mods/public/simulation/templates/template_structure.xml @@ -103,7 +103,7 @@ - special/rallypoint + special/rallypoints/{civ} art/textures/misc/rallypoint_line.png art/textures/misc/rallypoint_line_mask.png 0.25 Index: source/simulation2/components/CCmpRallyPointRenderer.cpp =================================================================== --- source/simulation2/components/CCmpRallyPointRenderer.cpp +++ source/simulation2/components/CCmpRallyPointRenderer.cpp @@ -17,6 +17,7 @@ #include "precompiled.h" #include "CCmpRallyPointRenderer.h" +#include "ICmpIdentity.h" std::string CCmpRallyPointRenderer::GetSchema() { @@ -221,11 +222,22 @@ if (m_MarkerEntityIds[i] == INVALID_ENTITY) { // No marker exists yet, create one first - CComponentManager& componentMgr = GetSimContext().GetComponentManager(); - // Allocate a new entity for the marker if (!m_MarkerTemplate.empty()) { + CComponentManager& componentMgr = GetSimContext().GetComponentManager(); + const std::wstring pattern = L"{civ}"; + size_t pos = m_MarkerTemplate.find(pattern); + CmpPtr cmpIdentity(GetEntityHandle()); + if(cmpIdentity) + { + while (pos != std::string::npos) + { + m_MarkerTemplate.replace(pos, pattern.size(), cmpIdentity->GetCiv()); + pos = m_MarkerTemplate.find(pattern, pos + pattern.size()); + } + } + m_MarkerEntityIds[i] = componentMgr.AllocateNewLocalEntity(); if (m_MarkerEntityIds[i] != INVALID_ENTITY) m_MarkerEntityIds[i] = componentMgr.AddEntity(m_MarkerTemplate, m_MarkerEntityIds[i]); @@ -259,19 +271,6 @@ continue; m_LastOwner = ownerId; - CmpPtr cmpPlayerManager(GetSystemEntity()); - // cmpPlayerManager should not be null as long as this method is called on-demand instead of at Init() time - // (we can't rely on component initialization order in Init()) - if (!cmpPlayerManager) - continue; - - CmpPtr cmpPlayer(GetSimContext(), cmpPlayerManager->GetPlayerByID(ownerId)); - if (!cmpPlayer) - continue; - - CmpPtr cmpVisualActor(GetSimContext(), m_MarkerEntityIds[i]); - if (cmpVisualActor) - cmpVisualActor->SetVariant("civ", CStrW(cmpPlayer->GetCiv()).ToUTF8()); } m_LastMarkerCount = m_RallyPoints.size() - 1; } Index: source/simulation2/components/CCmpVisualActor.cpp =================================================================== --- source/simulation2/components/CCmpVisualActor.cpp +++ source/simulation2/components/CCmpVisualActor.cpp @@ -26,6 +26,8 @@ #include "ICmpIdentity.h" #include "ICmpUnitRenderer.h" #include "ICmpOwnership.h" +#include "ICmpPlayer.h" +#include "ICmpPlayerManager.h" #include "ICmpPosition.h" #include "ICmpTemplateManager.h" #include "ICmpTerrain.h" @@ -467,7 +469,7 @@ if (!m_Unit || !m_Unit->GetAnimation() || !m_Unit->GetID()) return; - m_Unit->GetAnimation()->SetAnimationState(m_AnimName, m_AnimOnce, m_AnimSpeed.ToFloat(), m_AnimDesync.ToFloat(), m_SoundGroup.c_str()); + m_Unit->GetAnimation()->SetAnimationState(m_AnimName, m_AnimOnce, m_AnimSpeed.ToFloat(), m_AnimDesync.ToFloat(), m_SoundGroup.c_str()); } virtual void SelectMovementAnimation(const std::string& name, fixed speed) @@ -545,9 +547,11 @@ } private: - // Replace {phenotype} with the correct value in m_ActorName + // Replace {phenotype} and {civ} with the correct value in m_ActorName void ParseActorName(std::wstring base); + void CCmpVisualActor::ReplacePatternInString(std::wstring& base, std::wstring pattern, std::wstring value) const; + /// Helper function shared by component init and actor reloading void InitModel(); @@ -565,17 +569,42 @@ // ------------------------------------------------------------------------------------------------------------------ + +void CCmpVisualActor::ReplacePatternInString(std::wstring& base, std::wstring pattern, std::wstring value) const +{ + size_t pos = base.find(pattern); + while (pos != std::string::npos) + { + base.replace(pos, pattern.size(), value); + pos = base.find(pattern, pos + pattern.size()); + } +} + void CCmpVisualActor::ParseActorName(std::wstring base) { CmpPtr cmpIdentity(GetEntityHandle()); - const std::wstring pattern = L"{phenotype}"; if (cmpIdentity) { - size_t pos = base.find(pattern); - while (pos != std::string::npos) + ReplacePatternInString(base, L"{phenotype}", cmpIdentity->GetPhenotype()); + ReplacePatternInString(base, L"{civ}", cmpIdentity->GetCiv()); + } + else + { + // Template might have no civ but might be owned by something that does. + CmpPtr cmpOwnership(GetEntityHandle()); + if (cmpOwnership) { - base.replace(pos, pattern.size(), cmpIdentity->GetPhenotype()); - pos = base.find(pattern, pos + pattern.size()); + player_id_t ownerId = cmpOwnership->GetOwner(); + if (ownerId != INVALID_PLAYER) + { + CmpPtr cmpPlayerManager(GetSystemEntity()); + if (cmpPlayerManager) + { + CmpPtr cmpPlayer(GetSimContext(), cmpPlayerManager->GetPlayerByID(ownerId)); + if (cmpPlayer) + ReplacePatternInString(base, L"{civ}", cmpPlayer->GetCiv()); + } + } } } Index: source/simulation2/components/ICmpIdentity.h =================================================================== --- source/simulation2/components/ICmpIdentity.h +++ source/simulation2/components/ICmpIdentity.h @@ -31,6 +31,8 @@ virtual std::wstring GetPhenotype() = 0; + virtual std::wstring GetCiv() = 0; + DECLARE_INTERFACE_TYPE(Identity) }; Index: source/simulation2/components/ICmpIdentity.cpp =================================================================== --- source/simulation2/components/ICmpIdentity.cpp +++ source/simulation2/components/ICmpIdentity.cpp @@ -40,6 +40,11 @@ { return m_Script.Call("GetPhenotype"); } + + virtual std::wstring GetCiv() + { + return m_Script.Call("GetCiv"); + } }; REGISTER_COMPONENT_SCRIPT_WRAPPER(IdentityScripted)