Added int subCell = -1 to IMove.MoveIntoWorld & IPositionable.SetPosition(Actor self, CPos cell)
This commit is contained in:
@@ -182,7 +182,7 @@ namespace OpenRA.Traits
|
|||||||
{
|
{
|
||||||
bool CanEnterCell(CPos location);
|
bool CanEnterCell(CPos location);
|
||||||
bool CanEnterCell(CPos location, Actor ignoreActor, bool checkTransientActors);
|
bool CanEnterCell(CPos location, Actor ignoreActor, bool checkTransientActors);
|
||||||
void SetPosition(Actor self, CPos cell);
|
void SetPosition(Actor self, CPos cell, int subCell = -1);
|
||||||
void SetPosition(Actor self, WPos pos);
|
void SetPosition(Actor self, WPos pos);
|
||||||
void SetVisualPosition(Actor self, WPos pos);
|
void SetVisualPosition(Actor self, WPos pos);
|
||||||
}
|
}
|
||||||
@@ -195,7 +195,7 @@ namespace OpenRA.Traits
|
|||||||
Activity MoveWithinRange(Target target, WRange range);
|
Activity MoveWithinRange(Target target, WRange range);
|
||||||
Activity MoveWithinRange(Target target, WRange minRange, WRange maxRange);
|
Activity MoveWithinRange(Target target, WRange minRange, WRange maxRange);
|
||||||
Activity MoveFollow(Actor self, Target target, WRange minRange, WRange maxRange);
|
Activity MoveFollow(Actor self, Target target, WRange minRange, WRange maxRange);
|
||||||
Activity MoveIntoWorld(Actor self, CPos cell);
|
Activity MoveIntoWorld(Actor self, CPos cell, int subCell = -1);
|
||||||
Activity VisualMove(Actor self, WPos fromPos, WPos toPos);
|
Activity VisualMove(Actor self, WPos fromPos, WPos toPos);
|
||||||
CPos NearestMoveableCell(CPos target);
|
CPos NearestMoveableCell(CPos target);
|
||||||
bool IsMoving { get; set; }
|
bool IsMoving { get; set; }
|
||||||
|
|||||||
@@ -88,8 +88,11 @@ namespace OpenRA.Traits
|
|||||||
return FreeSubCell(a) >= 0;
|
return FreeSubCell(a) >= 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
public int FreeSubCell(CPos a)
|
public int FreeSubCell(CPos a, int preferredSubCell = -1)
|
||||||
{
|
{
|
||||||
|
if (preferredSubCell >= 0 && !AnyUnitsAt(a, preferredSubCell))
|
||||||
|
return preferredSubCell;
|
||||||
|
|
||||||
if (!AnyUnitsAt(a))
|
if (!AnyUnitsAt(a))
|
||||||
return map.SubCellDefaultIndex;
|
return map.SubCellDefaultIndex;
|
||||||
|
|
||||||
|
|||||||
@@ -170,7 +170,10 @@ namespace OpenRA.Mods.RA.Air
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Changes position, but not altitude
|
// Changes position, but not altitude
|
||||||
public void SetPosition(Actor self, CPos cell) { SetPosition(self, self.World.Map.CenterOfCell(cell) + new WVec(0, 0, CenterPosition.Z)); }
|
public void SetPosition(Actor self, CPos cell, int subCell = -1)
|
||||||
|
{
|
||||||
|
SetPosition(self, self.World.Map.CenterOfCell(cell) + new WVec(0, 0, CenterPosition.Z));
|
||||||
|
}
|
||||||
public void SetVisualPosition(Actor self, WPos pos) { SetPosition(self, pos); }
|
public void SetVisualPosition(Actor self, WPos pos) { SetPosition(self, pos); }
|
||||||
|
|
||||||
public void AddedToWorld(Actor self)
|
public void AddedToWorld(Actor self)
|
||||||
|
|||||||
@@ -148,7 +148,7 @@ namespace OpenRA.Mods.RA.Air
|
|||||||
public Activity MoveFollow(Actor self, Target target, WRange minRange, WRange maxRange) { return new Follow(self, target, minRange, maxRange); }
|
public Activity MoveFollow(Actor self, Target target, WRange minRange, WRange maxRange) { return new Follow(self, target, minRange, maxRange); }
|
||||||
public CPos NearestMoveableCell(CPos cell) { return cell; }
|
public CPos NearestMoveableCell(CPos cell) { return cell; }
|
||||||
|
|
||||||
public Activity MoveIntoWorld(Actor self, CPos cell)
|
public Activity MoveIntoWorld(Actor self, CPos cell, int subCell = -1)
|
||||||
{
|
{
|
||||||
return new HeliFly(self, Target.FromCell(self.World, cell));
|
return new HeliFly(self, Target.FromCell(self.World, cell));
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -127,7 +127,7 @@ namespace OpenRA.Mods.RA.Air
|
|||||||
public Activity MoveFollow(Actor self, Target target, WRange minRange, WRange maxRange) { return new FlyFollow(self, target, minRange, maxRange); }
|
public Activity MoveFollow(Actor self, Target target, WRange minRange, WRange maxRange) { return new FlyFollow(self, target, minRange, maxRange); }
|
||||||
public CPos NearestMoveableCell(CPos cell) { return cell; }
|
public CPos NearestMoveableCell(CPos cell) { return cell; }
|
||||||
|
|
||||||
public Activity MoveIntoWorld(Actor self, CPos cell) { return new Fly(self, Target.FromCell(self.World, cell)); }
|
public Activity MoveIntoWorld(Actor self, CPos cell, int subCell = -1) { return new Fly(self, Target.FromCell(self.World, cell)); }
|
||||||
public Activity VisualMove(Actor self, WPos fromPos, WPos toPos) { return Util.SequenceActivities(new CallFunc(() => SetVisualPosition(self, fromPos)), new Fly(self, Target.FromPos(toPos))); }
|
public Activity VisualMove(Actor self, WPos fromPos, WPos toPos) { return Util.SequenceActivities(new CallFunc(() => SetVisualPosition(self, fromPos)), new Fly(self, Target.FromPos(toPos))); }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -116,7 +116,7 @@ namespace OpenRA.Mods.RA
|
|||||||
|
|
||||||
public bool CanEnterCell(CPos cell) { return CanEnterCell(cell, null, true); }
|
public bool CanEnterCell(CPos cell) { return CanEnterCell(cell, null, true); }
|
||||||
|
|
||||||
public void SetPosition(Actor self, CPos cell)
|
public void SetPosition(Actor self, CPos cell, int subCell = -1)
|
||||||
{
|
{
|
||||||
self.World.ActorMap.RemoveInfluence(self, this);
|
self.World.ActorMap.RemoveInfluence(self, this);
|
||||||
Location = cell;
|
Location = cell;
|
||||||
|
|||||||
@@ -70,7 +70,7 @@ namespace OpenRA.Mods.RA
|
|||||||
}
|
}
|
||||||
|
|
||||||
public bool CanEnterCell(CPos cell) { return CanEnterCell(cell, null, true); }
|
public bool CanEnterCell(CPos cell) { return CanEnterCell(cell, null, true); }
|
||||||
public void SetPosition(Actor self, CPos cell) { SetPosition(self, self.World.Map.CenterOfCell(cell)); }
|
public void SetPosition(Actor self, CPos cell, int subCell = -1) { SetPosition(self, self.World.Map.CenterOfCell(cell)); }
|
||||||
|
|
||||||
public void SetVisualPosition(Actor self, WPos pos)
|
public void SetVisualPosition(Actor self, WPos pos)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -258,10 +258,11 @@ namespace OpenRA.Mods.RA.Move
|
|||||||
SetVisualPosition(self, init.Get<CenterPositionInit, WPos>());
|
SetVisualPosition(self, init.Get<CenterPositionInit, WPos>());
|
||||||
}
|
}
|
||||||
|
|
||||||
public void SetPosition(Actor self, CPos cell)
|
public void SetPosition(Actor self, CPos cell, int subCell = -1)
|
||||||
{
|
{
|
||||||
SetLocation(cell, fromSubCell, cell, fromSubCell);
|
SetLocation(cell, fromSubCell, cell, fromSubCell);
|
||||||
SetVisualPosition(self, self.World.Map.CenterOfCell(fromCell) + self.World.Map.SubCellOffsets[fromSubCell]);
|
SetVisualPosition(self, self.World.Map.CenterOfCell(fromCell)
|
||||||
|
+ self.World.Map.SubCellOffsets[subCell >= 0 ? subCell : fromSubCell]);
|
||||||
FinishedMoving(self);
|
FinishedMoving(self);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -603,10 +604,16 @@ namespace OpenRA.Mods.RA.Move
|
|||||||
Nudge(self, blocking, true);
|
Nudge(self, blocking, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
public Activity MoveIntoWorld(Actor self, CPos cell)
|
public Activity MoveIntoWorld(Actor self, CPos cell, int subCell = -1)
|
||||||
{
|
{
|
||||||
var pos = self.CenterPosition;
|
var pos = self.CenterPosition;
|
||||||
|
|
||||||
|
subCell = self.World.ActorMap.FreeSubCell(cell, subCell);
|
||||||
|
|
||||||
|
// TODO: solve/reduce cell is full problem
|
||||||
|
if (subCell < 0)
|
||||||
|
subCell = self.World.Map.SubCellDefaultIndex;
|
||||||
|
|
||||||
// Reserve the exit cell
|
// Reserve the exit cell
|
||||||
SetPosition(self, cell);
|
SetPosition(self, cell);
|
||||||
SetVisualPosition(self, pos);
|
SetVisualPosition(self, pos);
|
||||||
|
|||||||
Reference in New Issue
Block a user