Ticket #2243: actorTech.2.diff

File actorTech.2.diff, 6.7 KB (added by sanderd17, 10 years ago)
  • binaries/data/mods/public/simulation/components/TechnologyManager.js

     
    356356        this.modificationCache[valueName][ent] = {"origValue": curValue};
    357357        var cmpTemplateManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_TemplateManager);
    358358        var templateName = cmpTemplateManager.GetCurrentTemplateName(ent);
    359         // Ensure that preview entites have the same properties as the final building
    360         if (templateName.indexOf("preview|") != -1)
    361             templateName = templateName.slice(8);
     359        // Ensure that preview or construction entites have the same properties as the final building
     360        if (templateName.indexOf("preview|") > -1 || templateName.indexOf("construction|") > -1 )
     361            templateName = templateName.slice(templateName.indexOf("|") + 1);
    362362        this.modificationCache[valueName][ent].newValue = GetTechModifiedProperty(this.modifications, cmpTemplateManager.GetTemplate(templateName), valueName, curValue);
    363363    }
    364    
    365364    return this.modificationCache[valueName][ent].newValue;
    366365};
    367366
  • binaries/data/mods/public/simulation/data/technologies/phase_town.json

     
    22    "genericName": "Town Phase",
    33    "requirements": { "any": [{"tech":"phase_town_generic"}, {"tech":"phase_town_athen"}]},
    44    "autoResearch": true,
    5     "modifications": [{"value": "TerritoryInfluence/Radius", "multiply": 1.30}],
     5    "modifications": [{"value": "TerritoryInfluence/Radius", "multiply": 1.30},{"value": "VisualActor/Actor", "replace":"structures/athenians/gymnasion.xml"}],
    66    "affects": ["CivCentre"],
    77    "soundComplete": "interface/alarm/alarm_phase.xml"
    88}
  • source/simulation2/components/CCmpVisualActor.cpp

     
    3030#include "ICmpTemplateManager.h"
    3131#include "ICmpTerrain.h"
    3232#include "ICmpUnitMotion.h"
     33#include "ICmpValueModificationManager.h"
    3334#include "ICmpVision.h"
    3435
    3536#include "graphics/Decal.h"
     
    5657        componentManager.SubscribeToMessageType(MT_Interpolate);
    5758        componentManager.SubscribeToMessageType(MT_RenderSubmit);
    5859        componentManager.SubscribeToMessageType(MT_OwnershipChanged);
     60        componentManager.SubscribeToMessageType(MT_ValueModification);
    5961        componentManager.SubscribeGloballyToMessageType(MT_TerrainChanged);
    6062    }
    6163
     
    6264    DEFAULT_COMPONENT_ALLOCATOR(VisualActor)
    6365
    6466private:
    65     std::wstring m_ActorName;
     67    std::wstring m_OriginalActorName, m_ActorName;
     68    bool m_IsFoundationActor;
    6669    CUnit* m_Unit;
    6770
    6871    fixed m_R, m_G, m_B; // shading colour
     
    181184
    182185        m_Seed = GetEntityId();
    183186
    184         if (paramNode.GetChild("Foundation").IsOk() && paramNode.GetChild("FoundationActor").IsOk())
    185             m_ActorName = paramNode.GetChild("FoundationActor").ToString();
     187        m_IsFoundationActor = paramNode.GetChild("Foundation").IsOk() && paramNode.GetChild("FoundationActor").IsOk();
     188        if (m_IsFoundationActor)
     189            m_OriginalActorName = m_ActorName = paramNode.GetChild("FoundationActor").ToString();
    186190        else
    187             m_ActorName = paramNode.GetChild("Actor").ToString();
     191            m_OriginalActorName = m_ActorName = paramNode.GetChild("Actor").ToString();
    188192
    189193        m_VisibleInAtlasOnly = paramNode.GetChild("VisibleInAtlasOnly").ToBool();
    190194
     
    297301        {
    298302            const CMessageOwnershipChanged& msgData = static_cast<const CMessageOwnershipChanged&> (msg);
    299303            m_Unit->GetModel().SetPlayerID(msgData.to);
     304
     305            // also update the actor in case of ownership changes
     306            CmpPtr<ICmpValueModificationManager> cmpValueModificationManager(GetSystemEntity());
     307            std::wstring newActorName;
     308            if (m_IsFoundationActor)
     309                newActorName = cmpValueModificationManager->ApplyModifications(L"VisualActor/FoundationActor", m_OriginalActorName, GetEntityId());
     310            else
     311                newActorName = cmpValueModificationManager->ApplyModifications(L"VisualActor/Actor", m_OriginalActorName, GetEntityId());
     312            if (newActorName != m_ActorName)
     313            {
     314                m_ActorName = newActorName;
     315                ReloadActor();
     316            }
    300317            break;
    301318        }
    302319        case MT_TerrainChanged:
     
    305322            m_Unit->GetModel().SetTerrainDirty(msgData.i0, msgData.j0, msgData.i1, msgData.j1);
    306323            break;
    307324        }
     325        case MT_ValueModification:
     326        {
     327            const CMessageValueModification& msgData = static_cast<const CMessageValueModification&> (msg);
     328            if (msgData.component != L"VisualActor")
     329                break;
     330            CmpPtr<ICmpValueModificationManager> cmpValueModificationManager(GetSystemEntity());
     331            std::wstring newActorName;
     332            if (m_IsFoundationActor)
     333                newActorName = cmpValueModificationManager->ApplyModifications(L"VisualActor/FoundationActor", m_OriginalActorName, GetEntityId());
     334            else
     335                newActorName = cmpValueModificationManager->ApplyModifications(L"VisualActor/Actor", m_OriginalActorName, GetEntityId());
     336            if (newActorName != m_ActorName)
     337            {
     338                m_ActorName = newActorName;
     339                ReloadActor();
     340            }
     341            break;
    308342        }
     343        }
    309344    }
    310345
    311346    virtual CBoundingBoxAligned GetBounds()
  • source/simulation2/components/ICmpValueModificationManager.cpp

     
    3939    {
    4040        return m_Script.Call<u32>("ApplyModifications", valueName, currentValue, entity);
    4141    }
     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    }
    4247};
    4348
    4449REGISTER_COMPONENT_SCRIPT_WRAPPER(ValueModificationManagerScripted)
  • source/simulation2/components/ICmpValueModificationManager.h

     
    3232public:
    3333    virtual fixed ApplyModifications(std::wstring valueName, fixed currentValue, entity_id_t entity) = 0;
    3434    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;
    3536
    3637    DECLARE_INTERFACE_TYPE(ValueModificationManager)
    3738};