While they may be only 'visual' in terms of influence/cell grid, they all do update CenterPosition, which is essentially the actual world position of the actor. 'Visual' would imply that it only affects the position where the actor is drawn, which is inaccurate. Furthermore, using the term 'Visual' here would make naming future methods/properties related to visual interpolation unnecessarily complicated, because that's where we might need a real 'Visual(Only)Position'.
73 lines
2.1 KiB
C#
73 lines
2.1 KiB
C#
#region Copyright & License Information
|
|
/*
|
|
* Copyright 2007-2020 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 OpenRA.Mods.Common.Activities;
|
|
using OpenRA.Mods.Common.Traits;
|
|
using OpenRA.Scripting;
|
|
using OpenRA.Traits;
|
|
|
|
namespace OpenRA.Mods.Common.Scripting
|
|
{
|
|
[ScriptPropertyGroup("Movement")]
|
|
public class MobileProperties : ScriptActorProperties, Requires<MobileInfo>
|
|
{
|
|
readonly Mobile mobile;
|
|
|
|
public MobileProperties(ScriptContext context, Actor self)
|
|
: base(context, self)
|
|
{
|
|
mobile = self.Trait<Mobile>();
|
|
}
|
|
|
|
[ScriptActorPropertyActivity]
|
|
[Desc("Moves within the cell grid. closeEnough defines an optional range " +
|
|
"(in cells) that will be considered close enough to complete the activity.")]
|
|
public void Move(CPos cell, int closeEnough = 0)
|
|
{
|
|
Self.QueueActivity(new Move(Self, cell, WDist.FromCells(closeEnough)));
|
|
}
|
|
|
|
[ScriptActorPropertyActivity]
|
|
[Desc("Moves within the cell grid, ignoring lane biases.")]
|
|
public void ScriptedMove(CPos cell)
|
|
{
|
|
Self.QueueActivity(new Move(Self, cell));
|
|
}
|
|
|
|
[ScriptActorPropertyActivity]
|
|
[Desc("Moves from outside the world into the cell grid.")]
|
|
public void MoveIntoWorld(CPos cell)
|
|
{
|
|
var pos = Self.CenterPosition;
|
|
mobile.SetPosition(Self, cell);
|
|
mobile.SetCenterPosition(Self, pos);
|
|
Self.QueueActivity(mobile.ReturnToCell(Self));
|
|
}
|
|
|
|
[ScriptActorPropertyActivity]
|
|
[Desc("Leave the current position in a random direction.")]
|
|
public void Scatter()
|
|
{
|
|
mobile.Nudge(Self);
|
|
}
|
|
|
|
[ScriptActorPropertyActivity]
|
|
[Desc("Move to and enter the transport.")]
|
|
public void EnterTransport(Actor transport)
|
|
{
|
|
Self.QueueActivity(new RideTransport(Self, Target.FromActor(transport), null));
|
|
}
|
|
|
|
[Desc("Whether the actor can move (false if immobilized).")]
|
|
public bool IsMobile => !mobile.IsTraitDisabled && !mobile.IsTraitPaused;
|
|
}
|
|
}
|