Index: ps/trunk/binaries/data/mods/public/simulation/components/Builder.js =================================================================== --- ps/trunk/binaries/data/mods/public/simulation/components/Builder.js +++ ps/trunk/binaries/data/mods/public/simulation/components/Builder.js @@ -42,7 +42,10 @@ return entities; let disabledTemplates = cmpPlayer.GetDisabledTemplates(); - return entities.filter(ent => !disabledTemplates[ent]); + + let cmpTemplateManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_TemplateManager); + + return entities.filter(ent => !disabledTemplates[ent] && cmpTemplateManager.TemplateExists(ent)); }; Builder.prototype.GetRange = function() Index: ps/trunk/binaries/data/mods/public/simulation/components/tests/test_Builder.js =================================================================== --- ps/trunk/binaries/data/mods/public/simulation/components/tests/test_Builder.js +++ ps/trunk/binaries/data/mods/public/simulation/components/tests/test_Builder.js @@ -6,6 +6,10 @@ const builderId = 6; const playerId = 1; +AddMock(SYSTEM_ENTITY, IID_TemplateManager, { + "TemplateExists": () => true +}); + let cmpBuilder = ConstructComponent(builderId, "Builder", { "Rate": 1.0, "Entities": { "_string": "structures/{civ}_barracks structures/{civ}_civil_centre" } @@ -38,6 +42,16 @@ TS_ASSERT_UNEVAL_EQUALS(cmpBuilder.GetEntitiesList(), ["structures/iber_barracks", "structures/iber_civil_centre"]); +AddMock(SYSTEM_ENTITY, IID_TemplateManager, { + "TemplateExists": name => name == "structures/iber_civil_centre" +}); + +TS_ASSERT_UNEVAL_EQUALS(cmpBuilder.GetEntitiesList(), ["structures/iber_civil_centre"]); + +AddMock(SYSTEM_ENTITY, IID_TemplateManager, { + "TemplateExists": () => true +}); + AddMock(1, IID_Player, { "GetDisabledTemplates": () => ({ "structures/athen_barracks": true }), "GetPlayerID": () => playerId