Clean up nudging code.
This commit is contained in:
@@ -262,7 +262,7 @@ namespace OpenRA.Mods.Cnc.Traits
|
|||||||
});
|
});
|
||||||
var driverMobile = driver.TraitOrDefault<Mobile>();
|
var driverMobile = driver.TraitOrDefault<Mobile>();
|
||||||
if (driverMobile != null)
|
if (driverMobile != null)
|
||||||
driverMobile.Nudge(driver, driver, true);
|
driverMobile.Nudge(driver);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -273,7 +273,7 @@ namespace OpenRA.Mods.Common.Activities
|
|||||||
else if (mobile.IsBlocking)
|
else if (mobile.IsBlocking)
|
||||||
{
|
{
|
||||||
// If there is no way around the blocker and blocker will not move and we are blocking others, back up to let others pass.
|
// If there is no way around the blocker and blocker will not move and we are blocking others, back up to let others pass.
|
||||||
var newCell = GetAdjacentCell(self, nextCell);
|
var newCell = mobile.GetAdjacentCell(nextCell);
|
||||||
if (newCell != null)
|
if (newCell != null)
|
||||||
{
|
{
|
||||||
if ((nextCell - newCell).Value.LengthSquared > 2)
|
if ((nextCell - newCell).Value.LengthSquared > 2)
|
||||||
@@ -309,38 +309,6 @@ namespace OpenRA.Mods.Common.Activities
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
CPos? GetAdjacentCell(Actor self, CPos nextCell)
|
|
||||||
{
|
|
||||||
var availCells = new List<CPos>();
|
|
||||||
var notStupidCells = new List<CPos>();
|
|
||||||
for (var i = -1; i <= 1; i++)
|
|
||||||
{
|
|
||||||
for (var j = -1; j <= 1; j++)
|
|
||||||
{
|
|
||||||
var p = mobile.ToCell + new CVec(i, j);
|
|
||||||
if (mobile.CanEnterCell(p))
|
|
||||||
availCells.Add(p);
|
|
||||||
else if (p != nextCell && p != mobile.ToCell)
|
|
||||||
notStupidCells.Add(p);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
CPos? newCell = null;
|
|
||||||
if (availCells.Count > 0)
|
|
||||||
newCell = availCells.Random(self.World.SharedRandom);
|
|
||||||
else
|
|
||||||
{
|
|
||||||
var cellInfo = notStupidCells
|
|
||||||
.SelectMany(c => self.World.ActorMap.GetActorsAt(c).Where(Mobile.Ismovable),
|
|
||||||
(c, a) => new { Cell = c, Actor = a })
|
|
||||||
.RandomOrDefault(self.World.SharedRandom);
|
|
||||||
if (cellInfo != null)
|
|
||||||
newCell = cellInfo.Cell;
|
|
||||||
}
|
|
||||||
|
|
||||||
return newCell;
|
|
||||||
}
|
|
||||||
|
|
||||||
public override void Cancel(Actor self, bool keepQueue = false)
|
public override void Cancel(Actor self, bool keepQueue = false)
|
||||||
{
|
{
|
||||||
if (path != null)
|
if (path != null)
|
||||||
|
|||||||
@@ -56,7 +56,7 @@ namespace OpenRA.Mods.Common.Scripting
|
|||||||
[Desc("Leave the current position in a random direction.")]
|
[Desc("Leave the current position in a random direction.")]
|
||||||
public void Scatter()
|
public void Scatter()
|
||||||
{
|
{
|
||||||
mobile.Nudge(Self, Self, true);
|
mobile.Nudge(Self);
|
||||||
}
|
}
|
||||||
|
|
||||||
[ScriptActorPropertyActivity]
|
[ScriptActorPropertyActivity]
|
||||||
|
|||||||
@@ -46,7 +46,7 @@ namespace OpenRA.Mods.Common.Traits
|
|||||||
|
|
||||||
var mobile = self.TraitOrDefault<Mobile>();
|
var mobile = self.TraitOrDefault<Mobile>();
|
||||||
if (mobile != null && self.World.SharedRandom.Next(100) <= Info.WarnProbability)
|
if (mobile != null && self.World.SharedRandom.Next(100) <= Info.WarnProbability)
|
||||||
mobile.Nudge(self, crusher, true);
|
mobile.Nudge(crusher);
|
||||||
}
|
}
|
||||||
|
|
||||||
void INotifyCrushed.OnCrush(Actor self, Actor crusher, BitSet<CrushClass> crushClasses)
|
void INotifyCrushed.OnCrush(Actor self, Actor crusher, BitSet<CrushClass> crushClasses)
|
||||||
|
|||||||
@@ -99,7 +99,7 @@ namespace OpenRA.Mods.Common.Traits
|
|||||||
|
|
||||||
var pilotMobile = pilot.TraitOrDefault<Mobile>();
|
var pilotMobile = pilot.TraitOrDefault<Mobile>();
|
||||||
if (pilotMobile != null)
|
if (pilotMobile != null)
|
||||||
pilotMobile.Nudge(pilot, pilot, true);
|
pilotMobile.Nudge(pilot);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -76,7 +76,7 @@ namespace OpenRA.Mods.Common.Traits
|
|||||||
if (!Panicking)
|
if (!Panicking)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
mobile.Nudge(self, self, true);
|
mobile.Nudge(self);
|
||||||
}
|
}
|
||||||
|
|
||||||
void INotifyDamage.Damaged(Actor self, AttackInfo e)
|
void INotifyDamage.Damaged(Actor self, AttackInfo e)
|
||||||
|
|||||||
@@ -330,60 +330,46 @@ namespace OpenRA.Mods.Common.Traits
|
|||||||
|
|
||||||
#region Local misc stuff
|
#region Local misc stuff
|
||||||
|
|
||||||
public void Nudge(Actor self, Actor nudger, bool force)
|
public void Nudge(Actor nudger)
|
||||||
{
|
{
|
||||||
if (IsTraitDisabled || IsTraitPaused || RequireForceMove)
|
if (IsTraitDisabled || IsTraitPaused || RequireForceMove)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
// Pick an adjacent available cell.
|
var cell = GetAdjacentCell(nudger.Location);
|
||||||
|
if (cell != null)
|
||||||
|
self.QueueActivity(false, MoveTo(cell.Value, 0));
|
||||||
|
}
|
||||||
|
|
||||||
|
public CPos? GetAdjacentCell(CPos nextCell)
|
||||||
|
{
|
||||||
var availCells = new List<CPos>();
|
var availCells = new List<CPos>();
|
||||||
var notStupidCells = new List<CPos>();
|
var notStupidCells = new List<CPos>();
|
||||||
|
foreach (CVec direction in CVec.Directions)
|
||||||
for (var i = -1; i < 2; i++)
|
|
||||||
for (var j = -1; j < 2; j++)
|
|
||||||
{
|
|
||||||
var p = ToCell + new CVec(i, j);
|
|
||||||
if (CanEnterCell(p))
|
|
||||||
availCells.Add(p);
|
|
||||||
else if (p != nudger.Location && p != ToCell)
|
|
||||||
notStupidCells.Add(p);
|
|
||||||
}
|
|
||||||
|
|
||||||
var moveTo = availCells.Any() ? availCells.Random(self.World.SharedRandom) : (CPos?)null;
|
|
||||||
|
|
||||||
if (moveTo.HasValue)
|
|
||||||
{
|
{
|
||||||
self.QueueActivity(false, new Move(self, moveTo.Value, WDist.Zero));
|
var p = ToCell + direction;
|
||||||
self.ShowTargetLines();
|
if (CanEnterCell(p))
|
||||||
|
availCells.Add(p);
|
||||||
Log.Write("debug", "OnNudge #{0} from {1} to {2}",
|
else if (p != nextCell && p != ToCell)
|
||||||
self.ActorID, self.Location, moveTo.Value);
|
notStupidCells.Add(p);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
CPos? newCell = null;
|
||||||
|
if (availCells.Count > 0)
|
||||||
|
newCell = availCells.Random(self.World.SharedRandom);
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
var cellInfo = notStupidCells
|
var cellInfo = notStupidCells
|
||||||
.SelectMany(c => self.World.ActorMap.GetActorsAt(c).Where(Ismovable),
|
.SelectMany(c => self.World.ActorMap.GetActorsAt(c).Where(IsMovable),
|
||||||
(c, a) => new { Cell = c, Actor = a })
|
(c, a) => new { Cell = c, Actor = a })
|
||||||
.RandomOrDefault(self.World.SharedRandom);
|
.RandomOrDefault(self.World.SharedRandom);
|
||||||
|
|
||||||
if (cellInfo != null)
|
if (cellInfo != null)
|
||||||
{
|
newCell = cellInfo.Cell;
|
||||||
self.QueueActivity(false, new CallFunc(() => self.NotifyBlocker(cellInfo.Cell)));
|
|
||||||
self.QueueActivity(new WaitFor(() => CanEnterCell(cellInfo.Cell)));
|
|
||||||
self.QueueActivity(new Move(self, cellInfo.Cell));
|
|
||||||
|
|
||||||
Log.Write("debug", "OnNudge (notify next blocking actor, wait and move) #{0} from {1} to {2}",
|
|
||||||
self.ActorID, self.Location, cellInfo.Cell);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
Log.Write("debug", "OnNudge #{0} refuses at {1}",
|
|
||||||
self.ActorID, self.Location);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return newCell;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static bool Ismovable(Actor otherActor)
|
static bool IsMovable(Actor otherActor)
|
||||||
{
|
{
|
||||||
if (!otherActor.IsIdle)
|
if (!otherActor.IsIdle)
|
||||||
return false;
|
return false;
|
||||||
@@ -857,7 +843,7 @@ namespace OpenRA.Mods.Common.Traits
|
|||||||
|
|
||||||
if (self.IsIdle)
|
if (self.IsIdle)
|
||||||
{
|
{
|
||||||
Nudge(self, blocking, true);
|
Nudge(blocking);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -916,7 +902,7 @@ namespace OpenRA.Mods.Common.Traits
|
|||||||
self.CancelActivity();
|
self.CancelActivity();
|
||||||
|
|
||||||
if (order.OrderString == "Scatter")
|
if (order.OrderString == "Scatter")
|
||||||
Nudge(self, self, true);
|
Nudge(self);
|
||||||
}
|
}
|
||||||
|
|
||||||
string IOrderVoice.VoicePhraseForOrder(Actor self, Order order)
|
string IOrderVoice.VoicePhraseForOrder(Actor self, Order order)
|
||||||
|
|||||||
Reference in New Issue
Block a user