Convert BaseProvider range check to world coords.
This commit is contained in:
@@ -29,7 +29,7 @@ namespace OpenRA.Mods.RA
|
|||||||
{
|
{
|
||||||
// Offset effective position to the top of the northernmost occupied cell
|
// Offset effective position to the top of the northernmost occupied cell
|
||||||
var bi = self.Info.Traits.GetOrDefault<BuildingInfo>();
|
var bi = self.Info.Traits.GetOrDefault<BuildingInfo>();
|
||||||
offset = (bi != null) ? -FootprintUtils.CenterOffset(bi).Y : -512;
|
offset = ((bi != null) ? -FootprintUtils.CenterOffset(bi).Y : 0) - 512;
|
||||||
}
|
}
|
||||||
|
|
||||||
public IEnumerable<IRenderable> ModifyRender(Actor self, WorldRenderer wr, IEnumerable<IRenderable> r)
|
public IEnumerable<IRenderable> ModifyRender(Actor self, WorldRenderer wr, IEnumerable<IRenderable> r)
|
||||||
|
|||||||
@@ -17,7 +17,7 @@ namespace OpenRA.Mods.RA.Buildings
|
|||||||
{
|
{
|
||||||
public class BaseProviderInfo : ITraitInfo
|
public class BaseProviderInfo : ITraitInfo
|
||||||
{
|
{
|
||||||
public readonly float Range = 10;
|
public readonly int Range = 10;
|
||||||
public readonly int Cooldown = 0;
|
public readonly int Cooldown = 0;
|
||||||
public readonly int InitialDelay = 0;
|
public readonly int InitialDelay = 0;
|
||||||
|
|
||||||
|
|||||||
@@ -38,23 +38,20 @@ namespace OpenRA.Mods.RA.Buildings
|
|||||||
|
|
||||||
public object Create(ActorInitializer init) { return new Building(init, this); }
|
public object Create(ActorInitializer init) { return new Building(init, this); }
|
||||||
|
|
||||||
public PPos CenterLocation(CPos topLeft)
|
public Actor FindBaseProvider(World world, Player p, CPos topLeft)
|
||||||
{
|
{
|
||||||
return (PPos)((2 * topLeft.ToInt2() + Dimensions) * Game.CellSize / 2);
|
var center = topLeft.CenterPosition + FootprintUtils.CenterOffset(this);
|
||||||
}
|
|
||||||
|
|
||||||
bool HasBaseProvider(World world, Player p, CPos topLeft)
|
|
||||||
{
|
|
||||||
var center = CenterLocation(topLeft);
|
|
||||||
foreach (var bp in world.ActorsWithTrait<BaseProvider>())
|
foreach (var bp in world.ActorsWithTrait<BaseProvider>())
|
||||||
{
|
{
|
||||||
if (bp.Actor.Owner.Stances[p] != Stance.Ally || !bp.Trait.Ready())
|
if (bp.Actor.Owner.Stances[p] != Stance.Ally || !bp.Trait.Ready())
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (Combat.IsInRange(center, bp.Trait.Info.Range, bp.Actor.CenterLocation))
|
// Range is counted from the center of the actor, not from each cell.
|
||||||
return true;
|
var target = Target.FromPos(bp.Actor.CenterLocation);
|
||||||
|
if (target.IsInRange(center, WRange.FromCells(bp.Trait.Info.Range)))
|
||||||
|
return bp.Actor;
|
||||||
}
|
}
|
||||||
return false;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
public bool IsCloseEnoughToBase(World world, Player p, string buildingName, CPos topLeft)
|
public bool IsCloseEnoughToBase(World world, Player p, string buildingName, CPos topLeft)
|
||||||
@@ -62,7 +59,7 @@ namespace OpenRA.Mods.RA.Buildings
|
|||||||
if (p.PlayerActor.Trait<DeveloperMode>().BuildAnywhere)
|
if (p.PlayerActor.Trait<DeveloperMode>().BuildAnywhere)
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
if (RequiresBaseProvider && !HasBaseProvider(world, p, topLeft))
|
if (RequiresBaseProvider && FindBaseProvider(world, p, topLeft) == null)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
var buildingMaxBounds = (CVec)Dimensions;
|
var buildingMaxBounds = (CVec)Dimensions;
|
||||||
@@ -126,7 +123,9 @@ namespace OpenRA.Mods.RA.Buildings
|
|||||||
|
|
||||||
occupiedCells = FootprintUtils.UnpathableTiles( self.Info.Name, Info, TopLeft )
|
occupiedCells = FootprintUtils.UnpathableTiles( self.Info.Name, Info, TopLeft )
|
||||||
.Select(c => Pair.New(c, SubCell.FullCell)).ToArray();
|
.Select(c => Pair.New(c, SubCell.FullCell)).ToArray();
|
||||||
pxPosition = Info.CenterLocation(topLeft);
|
|
||||||
|
var position = topLeft.CenterPosition + FootprintUtils.CenterOffset(Info);
|
||||||
|
pxPosition = PPos.FromWPosHackZ(position);
|
||||||
}
|
}
|
||||||
|
|
||||||
public int GetPowerUsage()
|
public int GetPowerUsage()
|
||||||
|
|||||||
@@ -65,7 +65,8 @@ namespace OpenRA.Mods.RA.Buildings
|
|||||||
public static WVec CenterOffset(BuildingInfo buildingInfo)
|
public static WVec CenterOffset(BuildingInfo buildingInfo)
|
||||||
{
|
{
|
||||||
var dim = buildingInfo.Dimensions;
|
var dim = buildingInfo.Dimensions;
|
||||||
return new CVec(dim.X, dim.Y).ToWVec() / 2;
|
// Offset is measured relative to the center of the cell, so need to subtract an additional half cell.
|
||||||
|
return new CVec(dim.X, dim.Y).ToWVec() / 2 - new WVec(512, 512, 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -98,7 +98,7 @@ namespace OpenRA.Mods.RA.Orders
|
|||||||
initialized = true;
|
initialized = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
var offset = (topLeft - CPos.Zero).ToWVec() + FootprintUtils.CenterOffset(BuildingInfo);
|
var offset = topLeft.CenterPosition + FootprintUtils.CenterOffset(BuildingInfo) - WPos.Zero;
|
||||||
foreach (var r in preview)
|
foreach (var r in preview)
|
||||||
r.WithPos(r.Pos + offset).Render(wr);
|
r.WithPos(r.Pos + offset).Render(wr);
|
||||||
|
|
||||||
|
|||||||
@@ -83,18 +83,11 @@ namespace OpenRA.Mods.RA
|
|||||||
|
|
||||||
if (buildingInfo.RequiresBaseProvider)
|
if (buildingInfo.RequiresBaseProvider)
|
||||||
{
|
{
|
||||||
var center = buildingInfo.CenterLocation(order.TargetLocation);
|
// May be null if the build anywhere cheat is active
|
||||||
foreach (var bp in w.ActorsWithTrait<BaseProvider>())
|
// BuildingInfo.IsCloseEnoughToBase has already verified that this is a valid build location
|
||||||
{
|
var producer = buildingInfo.FindBaseProvider(w, self.Owner, order.TargetLocation);
|
||||||
if (bp.Actor.Owner.Stances[self.Owner] != Stance.Ally || !bp.Trait.Ready())
|
if (producer != null)
|
||||||
continue;
|
producer.Trait<BaseProvider>().BeginCooldown();
|
||||||
|
|
||||||
if (Combat.IsInRange(center, bp.Trait.Info.Range, bp.Actor.CenterLocation))
|
|
||||||
{
|
|
||||||
bp.Trait.BeginCooldown();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (GetNumBuildables(self.Owner) > prevItems)
|
if (GetNumBuildables(self.Owner) > prevItems)
|
||||||
|
|||||||
@@ -49,10 +49,12 @@ namespace OpenRA.Mods.RA.Render
|
|||||||
: base(init, info)
|
: base(init, info)
|
||||||
{
|
{
|
||||||
roof = new Animation(GetImage(init.self));
|
roof = new Animation(GetImage(init.self));
|
||||||
|
|
||||||
var bi = init.self.Info.Traits.Get<BuildingInfo>();
|
var bi = init.self.Info.Traits.Get<BuildingInfo>();
|
||||||
|
|
||||||
|
// Additional 512 units move from center -> top of cell
|
||||||
|
var offset = FootprintUtils.CenterOffset(bi).Y + 512;
|
||||||
anims.Add("roof", new AnimationWithOffset(roof, null,
|
anims.Add("roof", new AnimationWithOffset(roof, null,
|
||||||
() => !buildComplete, FootprintUtils.CenterOffset(bi).Y));
|
() => !buildComplete, offset));
|
||||||
}
|
}
|
||||||
|
|
||||||
public void BuildingComplete( Actor self )
|
public void BuildingComplete( Actor self )
|
||||||
|
|||||||
Reference in New Issue
Block a user