fix aircraft desync

This commit is contained in:
Bob
2010-11-06 13:36:11 +13:00
parent 0f8d9d7fb3
commit 924adc68a9
8 changed files with 52 additions and 48 deletions

View File

@@ -27,6 +27,8 @@ namespace OpenRA
public static int2 operator *(int2 b, int a) { return new int2(a * b.X, a * b.Y); }
public static int2 operator /(int2 a, int b) { return new int2(a.X / b, a.Y / b); }
public static int2 operator -(int2 a) { return new int2(-a.X, -a.Y); }
public static bool operator ==(int2 me, int2 other) { return (me.X == other.X && me.Y == other.Y); }
public static bool operator !=(int2 me, int2 other) { return !(me == other); }

View File

@@ -33,32 +33,27 @@ namespace OpenRA.Mods.RA.Air
{
protected readonly Actor self;
[Sync]
public int2 Location { get { return Util.CellContaining( center.ToInt2() ); } }
[Sync]
public int Facing { get; set; }
[Sync]
public int Altitude { get; set; }
[Sync]
public int2 SubPxPosition;
public int2 PxPosition { get { return new int2( SubPxPosition.X / 1024, SubPxPosition.Y / 1024 ); } }
public int2 TopLeft { get { return Util.CellContaining( PxPosition ); } }
public float2 center;
AircraftInfo Info;
readonly AircraftInfo Info;
public Aircraft( ActorInitializer init , AircraftInfo info)
{
this.self = init.self;
if( init.Contains<LocationInit>() )
this.center = Util.CenterOfCell( init.Get<LocationInit, int2>() );
this.SubPxPosition = 1024 * Util.CenterOfCell( init.Get<LocationInit, int2>() );
this.Facing = init.Contains<FacingInit>() ? init.Get<FacingInit,int>() : info.InitialFacing;
this.Altitude = init.Contains<AltitudeInit>() ? init.Get<AltitudeInit,int>() : 0;
Info = info;
}
public int2 TopLeft
{
get { return Location; }
}
public int ROT { get { return Info.ROT; } }
public int InitialFacing { get { return Info.InitialFacing; } }
@@ -70,7 +65,7 @@ namespace OpenRA.Mods.RA.Air
public void SetPxPosition( Actor self, int2 px )
{
center = px;
SubPxPosition = px * 1024;
}
public bool AircraftCanEnter(Actor a)
@@ -82,26 +77,31 @@ namespace OpenRA.Mods.RA.Air
public bool CanEnterCell(int2 location) { return true; }
public float MovementSpeed
public int MovementSpeed
{
get
{
var modifier = self
.TraitsImplementing<ISpeedModifier>()
.Select( t => t.GetSpeedModifier() )
.Product();
return Info.Speed * modifier;
//var modifier = self
// .TraitsImplementing<ISpeedModifier>()
// .Select( t => t.GetSpeedModifier() )
// .Product();
return Info.Speed;// *modifier;
}
}
int2[] noCells = new int2[] { };
public IEnumerable<int2> OccupiedCells() { return noCells; }
public int2 PxPosition { get { return center.ToInt2(); } }
public void TickMove( float speed, int facing )
public void TickMove( int speed, int facing )
{
var angle = facing / 128f * Math.PI;
center += speed * -float2.FromAngle((float)angle);
var rawspeed = speed * 7 / (32 * 1024);
SubPxPosition += rawspeed * -SubPxVector( facing );
}
int2 SubPxVector( int facing )
{
var angle = facing * Math.PI / 128.0;
return new int2( (int)Math.Truncate( 1024 * Math.Sin( angle ) ), (int)Math.Truncate( 1024 * Math.Cos( angle ) ) );
}
}
}

View File

@@ -57,8 +57,7 @@ namespace OpenRA.Mods.RA.Air
public static void Fly(Actor self, int desiredAltitude )
{
var aircraft = self.Trait<Aircraft>();
var speed = .2f * aircraft.MovementSpeed;
aircraft.TickMove( speed, aircraft.Facing );
aircraft.TickMove( 1024 * aircraft.MovementSpeed, aircraft.Facing );
aircraft.Altitude += Math.Sign(desiredAltitude - aircraft.Altitude);
}
}

View File

@@ -42,10 +42,9 @@ namespace OpenRA.Mods.RA.Air
var desiredFacing = Util.GetFacing(dist, aircraft.Facing);
aircraft.Facing = Util.TickFacing(aircraft.Facing, desiredFacing, aircraft.ROT);
var rawSpeed = .2f * aircraft.MovementSpeed;
if( !float2.WithinEpsilon( float2.Zero, dist, range * Game.CellSize ) )
aircraft.center += (rawSpeed / dist.Length) * dist;
aircraft.TickMove( 1024 * aircraft.MovementSpeed, desiredFacing );
attack.DoAttack( self, target );

View File

@@ -16,8 +16,8 @@ namespace OpenRA.Mods.RA.Air
{
class HeliFly : CancelableActivity
{
public readonly float2 Dest;
public HeliFly(float2 dest)
public readonly int2 Dest;
public HeliFly(int2 dest)
{
Dest = dest;
}
@@ -35,19 +35,16 @@ namespace OpenRA.Mods.RA.Air
return this;
}
var dist = Dest - self.CenterLocation;
var dist = Dest - aircraft.PxPosition;
if (float2.WithinEpsilon(float2.Zero, dist, 2))
{
aircraft.center = Dest;
aircraft.SubPxPosition = Dest * 1024;
return NextActivity;
}
var desiredFacing = Util.GetFacing(dist, aircraft.Facing);
aircraft.Facing = Util.TickFacing(aircraft.Facing, desiredFacing,
aircraft.ROT);
var rawSpeed = .2f * aircraft.MovementSpeed;
aircraft.center += (rawSpeed / dist.Length) * dist;
aircraft.Facing = Util.TickFacing(aircraft.Facing, desiredFacing, aircraft.ROT);
aircraft.TickMove( 1024 * aircraft.MovementSpeed, desiredFacing );
return this;
}

View File

@@ -43,10 +43,10 @@ namespace OpenRA.Mods.RA.Air
self.Trait<Helicopter>().reservation = res.Reserve(self);
var exit = dest.Info.Traits.WithInterface<ExitInfo>().FirstOrDefault();
var offset = exit != null ? exit.SpawnOffset : float2.Zero;
var offset = exit != null ? exit.SpawnOffset : int2.Zero;
return Util.SequenceActivities(
new HeliFly(dest.CenterLocation + offset),
new HeliFly(dest.Trait<IHasLocation>().PxPosition + offset),
new Turn(initialFacing),
new HeliLand(false),
new Rearm(),

View File

@@ -22,7 +22,7 @@ namespace OpenRA.Mods.RA.Air
{
class HelicopterInfo : AircraftInfo
{
public readonly float InstabilityMagnitude = 2.0f;
public readonly int InstabilityMagnitude = 1024;
public readonly int InstabilityTicks = 5;
public readonly int IdealSeparation = 40;
public readonly bool LandWhenIdle = true;
@@ -105,7 +105,7 @@ namespace OpenRA.Mods.RA.Air
reservation = res.Reserve(self);
var exit = order.TargetActor.Info.Traits.WithInterface<ExitInfo>().FirstOrDefault();
var offset = exit != null ? exit.SpawnOffset : float2.Zero;
var offset = exit != null ? exit.SpawnOffset : int2.Zero;
if (self.Owner == self.World.LocalPlayer)
self.World.AddFrameEndTask(w =>
@@ -118,7 +118,7 @@ namespace OpenRA.Mods.RA.Air
});
self.CancelActivity();
self.QueueActivity(new HeliFly(order.TargetActor.CenterLocation + offset));
self.QueueActivity(new HeliFly(order.TargetActor.Trait<IHasLocation>().PxPosition + offset));
self.QueueActivity(new Turn(Info.InitialFacing));
self.QueueActivity(new HeliLand(false));
self.QueueActivity(Info.RearmBuildings.Contains(order.TargetActor.Info.Name)
@@ -133,7 +133,6 @@ namespace OpenRA.Mods.RA.Air
if (aircraft.Altitude <= 0)
return;
var rawSpeed = .2f * aircraft.MovementSpeed;
var otherHelis = self.World.FindUnitsInCircle(self.CenterLocation, Info.IdealSeparation)
.Where(a => a.HasTrait<Helicopter>());
@@ -141,16 +140,26 @@ namespace OpenRA.Mods.RA.Air
.Select(h => self.Trait<Helicopter>().GetRepulseForce(self, h, h.Trait<Helicopter>()))
.Aggregate(float2.Zero, (a, b) => a + b);
aircraft.center += rawSpeed * f;
RepulsionFacing = Util.GetFacing( f, -1 );
if( RepulsionFacing != -1 )
aircraft.TickMove( 1024 * aircraft.MovementSpeed, RepulsionFacing );
if (--offsetTicks <= 0)
{
aircraft.center += Info.InstabilityMagnitude * self.World.SharedRandom.Gauss2D(5);
InstabilityFacing = Util.GetFacing( self.World.SharedRandom.Gauss2D( 5 ), -1 );
if( InstabilityFacing != -1 )
aircraft.TickMove( Info.InstabilityMagnitude, InstabilityFacing );
aircraft.Altitude += (int)(Info.InstabilityMagnitude * self.World.SharedRandom.Gauss1D(5));
offsetTicks = Info.InstabilityTicks;
}
}
[Sync]
int RepulsionFacing;
[Sync]
int InstabilityFacing;
const float Epsilon = .5f;
public float2 GetRepulseForce(Actor self, Actor h, Aircraft hAir)
{

View File

@@ -38,9 +38,7 @@ namespace OpenRA.Mods.RA.Air
var desiredFacing = Util.GetFacing(d, aircraft.Facing);
aircraft.Facing = Util.TickFacing(aircraft.Facing, desiredFacing, aircraft.ROT);
var speed = .2f * aircraft.MovementSpeed;
aircraft.TickMove( speed, aircraft.Facing );
aircraft.TickMove( 1024 * aircraft.MovementSpeed, aircraft.Facing );
return this;
}