Add Replaceable and Replacement traits to support wall overrides.
This commit is contained in:
@@ -480,6 +480,8 @@
|
||||
<Compile Include="Traits\Repairable.cs" />
|
||||
<Compile Include="Traits\RepairableNear.cs" />
|
||||
<Compile Include="Traits\RepairsBridges.cs" />
|
||||
<Compile Include="Traits\Replaceable.cs" />
|
||||
<Compile Include="Traits\Replacement.cs" />
|
||||
<Compile Include="Traits\SeedsResource.cs" />
|
||||
<Compile Include="Traits\StoresResources.cs" />
|
||||
<Compile Include="Traits\Render\SelectionDecorations.cs" />
|
||||
|
||||
@@ -22,10 +22,21 @@ namespace OpenRA.Mods.Common.Traits
|
||||
if (!world.Map.Contains(cell))
|
||||
return false;
|
||||
|
||||
if (world.WorldActor.Trait<BuildingInfluence>().GetBuildingAt(cell) != null)
|
||||
var building = world.WorldActor.Trait<BuildingInfluence>().GetBuildingAt(cell);
|
||||
if (building != null)
|
||||
{
|
||||
if (ai == null)
|
||||
return false;
|
||||
|
||||
if (!bi.AllowInvalidPlacement && world.ActorMap.GetActorsAt(cell).Any(a => a != toIgnore))
|
||||
var replacementInfo = ai.TraitInfoOrDefault<ReplacementInfo>();
|
||||
if (replacementInfo == null)
|
||||
return false;
|
||||
|
||||
if (!building.TraitsImplementing<Replaceable>().Any(p => !p.IsTraitDisabled &&
|
||||
p.Info.Types.Overlaps(replacementInfo.ReplaceableTypes)))
|
||||
return false;
|
||||
}
|
||||
else if (!bi.AllowInvalidPlacement && world.ActorMap.GetActorsAt(cell).Any(a => a != toIgnore))
|
||||
return false;
|
||||
|
||||
var tile = world.Map.Tiles[cell];
|
||||
|
||||
@@ -136,6 +136,18 @@ namespace OpenRA.Mods.Common.Traits
|
||||
|| !buildingInfo.IsCloseEnoughToBase(self.World, order.Player, actorInfo, order.TargetLocation))
|
||||
return;
|
||||
|
||||
var replacementInfo = actorInfo.TraitInfoOrDefault<ReplacementInfo>();
|
||||
if (replacementInfo != null)
|
||||
{
|
||||
var buildingInfluence = self.World.WorldActor.Trait<BuildingInfluence>();
|
||||
foreach (var t in buildingInfo.Tiles(order.TargetLocation))
|
||||
{
|
||||
var host = buildingInfluence.GetBuildingAt(t);
|
||||
if (host != null)
|
||||
host.World.Remove(host);
|
||||
}
|
||||
}
|
||||
|
||||
var building = w.CreateActor(order.TargetString, new TypeDictionary
|
||||
{
|
||||
new LocationInit(order.TargetLocation),
|
||||
|
||||
31
OpenRA.Mods.Common/Traits/Replaceable.cs
Normal file
31
OpenRA.Mods.Common/Traits/Replaceable.cs
Normal file
@@ -0,0 +1,31 @@
|
||||
#region Copyright & License Information
|
||||
/*
|
||||
* Copyright 2007-2018 The OpenRA Developers (see AUTHORS)
|
||||
* This file is part of OpenRA, which is free software. It is made
|
||||
* available to you under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation, either version 3 of
|
||||
* the License, or (at your option) any later version. For more
|
||||
* information, see COPYING.
|
||||
*/
|
||||
#endregion
|
||||
|
||||
using System.Collections.Generic;
|
||||
using OpenRA.Traits;
|
||||
|
||||
namespace OpenRA.Mods.Common.Traits
|
||||
{
|
||||
public class ReplaceableInfo : ConditionalTraitInfo, ITraitInfo
|
||||
{
|
||||
[FieldLoader.Require]
|
||||
[Desc("Replacement types this Relpaceable actor accepts.")]
|
||||
public readonly HashSet<string> Types = new HashSet<string>();
|
||||
|
||||
public override object Create(ActorInitializer init) { return new Replaceable(init, this); }
|
||||
}
|
||||
|
||||
public class Replaceable : ConditionalTrait<ReplaceableInfo>
|
||||
{
|
||||
public Replaceable(ActorInitializer init, ReplaceableInfo info)
|
||||
: base(info) { }
|
||||
}
|
||||
}
|
||||
25
OpenRA.Mods.Common/Traits/Replacement.cs
Normal file
25
OpenRA.Mods.Common/Traits/Replacement.cs
Normal file
@@ -0,0 +1,25 @@
|
||||
#region Copyright & License Information
|
||||
/*
|
||||
* Copyright 2007-2018 The OpenRA Developers (see AUTHORS)
|
||||
* This file is part of OpenRA, which is free software. It is made
|
||||
* available to you under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation, either version 3 of
|
||||
* the License, or (at your option) any later version. For more
|
||||
* information, see COPYING.
|
||||
*/
|
||||
#endregion
|
||||
|
||||
using System.Collections.Generic;
|
||||
using OpenRA.Traits;
|
||||
|
||||
namespace OpenRA.Mods.Common.Traits
|
||||
{
|
||||
public class ReplacementInfo : TraitInfo<Replacement>
|
||||
{
|
||||
[FieldLoader.Require]
|
||||
[Desc("Replacement type (matched against Conditions in Replaceable).")]
|
||||
public readonly HashSet<string> ReplaceableTypes = new HashSet<string>();
|
||||
}
|
||||
|
||||
public class Replacement { }
|
||||
}
|
||||
Reference in New Issue
Block a user