Files
OpenRA/OpenRA.Mods.Common/Activities/Parachute.cs
reaperrr 2473b8763b Rename methods/activities with Visual in them
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'.
2021-03-08 11:19:11 +01:00

61 lines
1.5 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.Activities;
using OpenRA.Mods.Common.Traits;
using OpenRA.Traits;
namespace OpenRA.Mods.Common.Activities
{
public class Parachute : Activity
{
readonly IPositionable pos;
readonly WVec fallVector;
int groundLevel;
public Parachute(Actor self)
{
pos = self.TraitOrDefault<IPositionable>();
fallVector = new WVec(0, 0, self.Info.TraitInfo<ParachutableInfo>().FallRate);
IsInterruptible = false;
}
protected override void OnFirstRun(Actor self)
{
groundLevel = self.World.Map.CenterOfCell(self.Location).Z;
foreach (var np in self.TraitsImplementing<INotifyParachute>())
np.OnParachute(self);
}
public override bool Tick(Actor self)
{
var nextPosition = self.CenterPosition - fallVector;
if (nextPosition.Z < groundLevel)
return true;
pos.SetCenterPosition(self, nextPosition);
return false;
}
protected override void OnLastRun(Actor self)
{
var centerPosition = self.CenterPosition;
pos.SetPosition(self, centerPosition + new WVec(0, 0, groundLevel - centerPosition.Z));
foreach (var np in self.TraitsImplementing<INotifyParachute>())
np.OnLanded(self);
}
}
}