Add ISingleInstanceInit interface.

Inits that are logically singletons (e.g. actor
location or owner) should implement this interface
to avoid runtime inconsistencies.

Duplicate instances are rejected at init-time,
allowing simpler queries when they are used.
This commit is contained in:
Paul Chote
2020-05-30 16:48:35 +01:00
committed by reaperrr
parent 86305879cb
commit b856613194
45 changed files with 169 additions and 95 deletions

View File

@@ -78,11 +78,11 @@ namespace OpenRA.Mods.Common.Traits
this.info = info;
self = init.Self;
TopLeft = init.GetValue<LocationInit, CPos>(info);
CenterPosition = init.GetValue<CenterPositionInit, WPos>(info, init.World.Map.CenterOfCell(TopLeft));
Facing = WAngle.FromFacing(init.GetValue<FacingInit, int>(info, 128));
TopLeft = init.GetValue<LocationInit, CPos>();
CenterPosition = init.GetValue<CenterPositionInit, WPos>(init.World.Map.CenterOfCell(TopLeft));
Facing = WAngle.FromFacing(init.GetValue<FacingInit, int>(128));
dragSpeed = init.GetValue<HuskSpeedInit, int>(info, 0);
dragSpeed = init.GetValue<HuskSpeedInit, int>(0);
finalPosition = init.World.Map.CenterOfCell(TopLeft);
effectiveOwner = init.GetValue<EffectiveOwnerInit, Player>(info, self.Owner);
@@ -171,7 +171,7 @@ namespace OpenRA.Mods.Common.Traits
Player IEffectiveOwner.Owner { get { return effectiveOwner; } }
}
public class HuskSpeedInit : ValueActorInit<int>
public class HuskSpeedInit : ValueActorInit<int>, ISingleInstanceInit
{
public HuskSpeedInit(int value)
: base(value) { }