Index: binaries/data/mods/public/art/actors/structures/gauls/ambush_camp.xml =================================================================== --- binaries/data/mods/public/art/actors/structures/gauls/ambush_camp.xml +++ binaries/data/mods/public/art/actors/structures/gauls/ambush_camp.xml @@ -0,0 +1,42 @@ + + + + + + structural/field_propped_8x8.dae + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + basic_trans.xml + Index: binaries/data/mods/public/art/actors/structures/plot_ambush.xml =================================================================== --- binaries/data/mods/public/art/actors/structures/plot_ambush.xml +++ binaries/data/mods/public/art/actors/structures/plot_ambush.xml @@ -0,0 +1,26 @@ + + + + + + structural/field_propped_8x8.dae + + + + + + + + + + + + + + + + + + + basic_trans.xml + Index: binaries/data/mods/public/simulation/components/Ambush.js =================================================================== --- binaries/data/mods/public/simulation/components/Ambush.js +++ binaries/data/mods/public/simulation/components/Ambush.js @@ -0,0 +1,21 @@ +function Ambush() {} + +Ambush.prototype.Schema = + "Specifies if an entity is hidden, so that it will not automatically be attacked by UnitAI." + + "" + + "false" + + "" + + "" + + "" + + "" ; + +Ambush.prototype.Init = function() +{ +}; + + Ambush.prototype.IsEntityHidden = function() + { + return (this.template.Hidden) + }; + +Engine.RegisterComponentType(IID_Ambush, "Ambush", Ambush); Index: binaries/data/mods/public/simulation/components/BuildRestrictions.js =================================================================== --- binaries/data/mods/public/simulation/components/BuildRestrictions.js +++ binaries/data/mods/public/simulation/components/BuildRestrictions.js @@ -18,6 +18,7 @@ "land" + "shore" + "land-shore"+ + "land-ignore-obstruction"+ "" + "" + "" + @@ -131,6 +132,10 @@ passClassName = "default-terrain-only"; break; + case "land-ignore-obstruction": + passClassName = "building-land-no-obstruction"; + break; + case "land": default: passClassName = "building-land"; @@ -146,6 +151,15 @@ // for walls, only test the center point var ret = cmpObstruction.CheckFoundation(passClassName, true); } + else if (this.template.PlacementType == "land-ignore-obstruction") + { + // this is needed as the the none + // is not actually used when building + // it is rather assumed to be foundation + // by the c++ part. See palisades as another example who use + // land-shore but are still obstructed by foundations + var ret = "success"; + } else { var ret = cmpObstruction.CheckFoundation(passClassName, false); Index: binaries/data/mods/public/simulation/components/BuildingAI.js =================================================================== --- binaries/data/mods/public/simulation/components/BuildingAI.js +++ binaries/data/mods/public/simulation/components/BuildingAI.js @@ -185,9 +185,14 @@ // Add new targets. for (let entity of msg.added) + { + const cmpAmbush = Engine.QueryInterface(entity, IID_Ambush); + if (cmpAmbush && cmpAmbush.IsEntityHidden(entity)) + continue; + if (cmpAttack.CanAttack(entity)) this.targetUnits.push(entity); - + } // Remove targets outside of vision-range. for (let entity of msg.removed) { Index: binaries/data/mods/public/simulation/components/Player.js =================================================================== --- binaries/data/mods/public/simulation/components/Player.js +++ binaries/data/mods/public/simulation/components/Player.js @@ -45,7 +45,7 @@ /** * Which units will be shown with special icons at the top. */ -var panelEntityClasses = "Hero Relic"; +var panelEntityClasses = "Hero Relic Ambush"; Player.prototype.Init = function() { Index: binaries/data/mods/public/simulation/components/UnitAI.js =================================================================== --- binaries/data/mods/public/simulation/components/UnitAI.js +++ binaries/data/mods/public/simulation/components/UnitAI.js @@ -6413,6 +6413,10 @@ if (!cmpAttack.CanAttack(e)) return false; + const cmpAmbush = Engine.QueryInterface(e, IID_Ambush); + if (cmpAmbush && cmpAmbush.IsEntityHidden(e)) + return false; + let cmpOwnership = Engine.QueryInterface(e, IID_Ownership); if (cmpOwnership && cmpOwnership.GetOwner() > 0) return true; Index: binaries/data/mods/public/simulation/components/interfaces/Ambush.js =================================================================== --- binaries/data/mods/public/simulation/components/interfaces/Ambush.js +++ binaries/data/mods/public/simulation/components/interfaces/Ambush.js @@ -0,0 +1 @@ +Engine.RegisterInterface("Ambush"); Index: binaries/data/mods/public/simulation/components/tests/test_UnitAI.js =================================================================== --- binaries/data/mods/public/simulation/components/tests/test_UnitAI.js +++ binaries/data/mods/public/simulation/components/tests/test_UnitAI.js @@ -1,6 +1,7 @@ Engine.LoadHelperScript("Player.js"); Engine.LoadHelperScript("Position.js"); Engine.LoadHelperScript("Sound.js"); +Engine.LoadComponentScript("interfaces/Ambush.js"); Engine.LoadComponentScript("interfaces/Auras.js"); Engine.LoadComponentScript("interfaces/Builder.js"); Engine.LoadComponentScript("interfaces/BuildingAI.js"); Index: binaries/data/mods/public/simulation/data/pathfinder.xml =================================================================== --- binaries/data/mods/public/simulation/data/pathfinder.xml +++ binaries/data/mods/public/simulation/data/pathfinder.xml @@ -63,6 +63,8 @@ from water and not on cliffs or mountains. * Shore is used for docks, which must be near water and land, yet shallow enough for builders to approach. + * Land-no-obstruction is used for buildings which should + be land only, but ignore all obstructions. --> foundation @@ -75,6 +77,12 @@ 8.0 1.25 + + none + 0 + 4.0 + 1.0 +