Ticket #2243: actorTech.diff
File actorTech.diff, 6.1 KB (added by , 11 years ago) |
---|
-
binaries/data/mods/public/simulation/components/TechnologyManager.js
355 355 { 356 356 var cmpTemplateManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_TemplateManager); 357 357 var templateName = cmpTemplateManager.GetCurrentTemplateName(ent); 358 // Ensure that preview entites have the same properties as the final building358 // Ensure that preview and construction entites have the same properties as the final building 359 359 if (templateName.indexOf("preview|") != -1) 360 360 templateName = templateName.slice(8); 361 if (templateName.indexOf("construction|") != -1) 362 templateName = templateName.slice(13); 361 363 this.modificationCache[valueName][ent] = GetTechModifiedProperty(this.modifications, cmpTemplateManager.GetTemplate(templateName), valueName, curValue); 362 364 } 363 365 -
binaries/data/mods/public/simulation/data/technologies/phase_town.json
2 2 "genericName": "Town Phase", 3 3 "requirements": { "any": [{"tech":"phase_town_generic"}, {"tech":"phase_town_athen"}]}, 4 4 "autoResearch": true, 5 "modifications": [{"value": "TerritoryInfluence/Radius", "multiplier": 1.30} ],5 "modifications": [{"value": "TerritoryInfluence/Radius", "multiplier": 1.30},{"value": "VisualActor/Actor", "replace":"structures/athenians/gymnasion.xml"}], 6 6 "affects": ["CivCentre"], 7 7 "soundComplete": "interface/alarm/alarm_phase.xml" 8 8 } -
source/simulation2/components/CCmpVisualActor.cpp
30 30 #include "ICmpTemplateManager.h" 31 31 #include "ICmpTerrain.h" 32 32 #include "ICmpUnitMotion.h" 33 #include "ICmpValueModificationManager.h" 33 34 #include "ICmpVision.h" 34 35 35 36 #include "graphics/Decal.h" … … 56 57 componentManager.SubscribeToMessageType(MT_Interpolate); 57 58 componentManager.SubscribeToMessageType(MT_RenderSubmit); 58 59 componentManager.SubscribeToMessageType(MT_OwnershipChanged); 60 componentManager.SubscribeToMessageType(MT_ValueModification); 59 61 componentManager.SubscribeGloballyToMessageType(MT_TerrainChanged); 60 62 } 61 63 … … 62 64 DEFAULT_COMPONENT_ALLOCATOR(VisualActor) 63 65 64 66 private: 65 std::wstring m_ ActorName;67 std::wstring m_OriginalActorName, m_ActorName; 66 68 CUnit* m_Unit; 67 69 68 70 fixed m_R, m_G, m_B; // shading colour … … 182 184 m_Seed = GetEntityId(); 183 185 184 186 if (paramNode.GetChild("Foundation").IsOk() && paramNode.GetChild("FoundationActor").IsOk()) 187 { 185 188 m_ActorName = paramNode.GetChild("FoundationActor").ToString(); 189 m_OriginalActorName = L""; 190 } 186 191 else 187 m_ActorName = paramNode.GetChild("Actor").ToString(); 192 { 193 m_OriginalActorName = m_ActorName = paramNode.GetChild("Actor").ToString(); 194 } 188 195 189 196 m_VisibleInAtlasOnly = paramNode.GetChild("VisibleInAtlasOnly").ToBool(); 190 197 … … 297 304 { 298 305 const CMessageOwnershipChanged& msgData = static_cast<const CMessageOwnershipChanged&> (msg); 299 306 m_Unit->GetModel().SetPlayerID(msgData.to); 307 308 // also apply the technology changes to preview models 309 if (m_OriginalActorName.length() == 0) 310 break; // don't change foundation actors 311 CmpPtr<ICmpValueModificationManager> cmpValueModificationManager(GetSystemEntity()); 312 std::wstring newActorName = cmpValueModificationManager->ApplyModifications(L"VisualActor/Actor", m_OriginalActorName, GetEntityId()); 313 if (newActorName != m_ActorName) 314 { 315 m_ActorName = newActorName; 316 ReloadActor(); 317 } 300 318 break; 301 319 } 302 320 case MT_TerrainChanged: … … 305 323 m_Unit->GetModel().SetTerrainDirty(msgData.i0, msgData.j0, msgData.i1, msgData.j1); 306 324 break; 307 325 } 326 case MT_ValueModification: 327 { 328 const CMessageValueModification& msgData = static_cast<const CMessageValueModification&> (msg); 329 if (msgData.component == L"VisualActor") 330 { 331 if (m_OriginalActorName.length() == 0) 332 break; // don't change foundation actors 333 CmpPtr<ICmpValueModificationManager> cmpValueModificationManager(GetSystemEntity()); 334 std::wstring newActorName = cmpValueModificationManager->ApplyModifications(L"VisualActor/Actor", m_OriginalActorName, GetEntityId()); 335 if (newActorName != m_ActorName) 336 { 337 m_ActorName = newActorName; 338 ReloadActor(); 339 } 340 } 308 341 } 342 } 309 343 } 310 344 311 345 virtual CBoundingBoxAligned GetBounds() -
source/simulation2/components/ICmpValueModificationManager.cpp
39 39 { 40 40 return m_Script.Call<u32>("ApplyModifications", valueName, currentValue, entity); 41 41 } 42 43 virtual std::wstring ApplyModifications(std::wstring valueName, std::wstring currentValue, entity_id_t entity) 44 { 45 return m_Script.Call<std::wstring>("ApplyModifications", valueName, currentValue, entity); 46 } 42 47 }; 43 48 44 49 REGISTER_COMPONENT_SCRIPT_WRAPPER(ValueModificationManagerScripted) -
source/simulation2/components/ICmpValueModificationManager.h
32 32 public: 33 33 virtual fixed ApplyModifications(std::wstring valueName, fixed currentValue, entity_id_t entity) = 0; 34 34 virtual u32 ApplyModifications(std::wstring valueName, u32 currentValue, entity_id_t entity) = 0; 35 virtual std::wstring ApplyModifications(std::wstring valueName, std::wstring currentValue, entity_id_t entity) = 0; 35 36 36 37 DECLARE_INTERFACE_TYPE(ValueModificationManager) 37 38 };