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\Repairable.cs" />
|
||||||
<Compile Include="Traits\RepairableNear.cs" />
|
<Compile Include="Traits\RepairableNear.cs" />
|
||||||
<Compile Include="Traits\RepairsBridges.cs" />
|
<Compile Include="Traits\RepairsBridges.cs" />
|
||||||
|
<Compile Include="Traits\Replaceable.cs" />
|
||||||
|
<Compile Include="Traits\Replacement.cs" />
|
||||||
<Compile Include="Traits\SeedsResource.cs" />
|
<Compile Include="Traits\SeedsResource.cs" />
|
||||||
<Compile Include="Traits\StoresResources.cs" />
|
<Compile Include="Traits\StoresResources.cs" />
|
||||||
<Compile Include="Traits\Render\SelectionDecorations.cs" />
|
<Compile Include="Traits\Render\SelectionDecorations.cs" />
|
||||||
|
|||||||
@@ -22,10 +22,21 @@ namespace OpenRA.Mods.Common.Traits
|
|||||||
if (!world.Map.Contains(cell))
|
if (!world.Map.Contains(cell))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
if (world.WorldActor.Trait<BuildingInfluence>().GetBuildingAt(cell) != null)
|
var building = world.WorldActor.Trait<BuildingInfluence>().GetBuildingAt(cell);
|
||||||
return false;
|
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;
|
return false;
|
||||||
|
|
||||||
var tile = world.Map.Tiles[cell];
|
var tile = world.Map.Tiles[cell];
|
||||||
|
|||||||
@@ -136,6 +136,18 @@ namespace OpenRA.Mods.Common.Traits
|
|||||||
|| !buildingInfo.IsCloseEnoughToBase(self.World, order.Player, actorInfo, order.TargetLocation))
|
|| !buildingInfo.IsCloseEnoughToBase(self.World, order.Player, actorInfo, order.TargetLocation))
|
||||||
return;
|
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
|
var building = w.CreateActor(order.TargetString, new TypeDictionary
|
||||||
{
|
{
|
||||||
new LocationInit(order.TargetLocation),
|
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