Merge pull request #9414 from atlimit8/TurretFacingsInit
Support loading multiple turret facings
This commit is contained in:
@@ -14,7 +14,15 @@ using OpenRA.Traits;
|
|||||||
|
|
||||||
namespace OpenRA
|
namespace OpenRA
|
||||||
{
|
{
|
||||||
public class ActorInitializer
|
public interface IActorInitializer
|
||||||
|
{
|
||||||
|
World World { get; }
|
||||||
|
T Get<T>() where T : IActorInit;
|
||||||
|
U Get<T, U>() where T : IActorInit<U>;
|
||||||
|
bool Contains<T>() where T : IActorInit;
|
||||||
|
}
|
||||||
|
|
||||||
|
public class ActorInitializer : IActorInitializer
|
||||||
{
|
{
|
||||||
public readonly Actor Self;
|
public readonly Actor Self;
|
||||||
public World World { get { return Self.World; } }
|
public World World { get { return Self.World; } }
|
||||||
@@ -47,14 +55,6 @@ namespace OpenRA
|
|||||||
public int Value(World world) { return value; }
|
public int Value(World world) { return value; }
|
||||||
}
|
}
|
||||||
|
|
||||||
public class TurretFacingInit : IActorInit<int>
|
|
||||||
{
|
|
||||||
[FieldFromYamlKey] readonly int value = 128;
|
|
||||||
public TurretFacingInit() { }
|
|
||||||
public TurretFacingInit(int init) { value = init; }
|
|
||||||
public int Value(World world) { return value; }
|
|
||||||
}
|
|
||||||
|
|
||||||
public class LocationInit : IActorInit<CPos>
|
public class LocationInit : IActorInit<CPos>
|
||||||
{
|
{
|
||||||
[FieldFromYamlKey] readonly CPos value = CPos.Zero;
|
[FieldFromYamlKey] readonly CPos value = CPos.Zero;
|
||||||
|
|||||||
@@ -22,7 +22,7 @@ namespace OpenRA.Mods.Common.Graphics
|
|||||||
IEnumerable<IRenderable> Render(WorldRenderer wr, WPos pos);
|
IEnumerable<IRenderable> Render(WorldRenderer wr, WPos pos);
|
||||||
}
|
}
|
||||||
|
|
||||||
public class ActorPreviewInitializer
|
public class ActorPreviewInitializer : IActorInitializer
|
||||||
{
|
{
|
||||||
public readonly ActorInfo Actor;
|
public readonly ActorInfo Actor;
|
||||||
public readonly WorldRenderer WorldRenderer;
|
public readonly WorldRenderer WorldRenderer;
|
||||||
|
|||||||
@@ -45,7 +45,7 @@ namespace OpenRA.Mods.Common.Traits
|
|||||||
|
|
||||||
var ifacing = init.Actor.TraitInfoOrDefault<IFacingInfo>();
|
var ifacing = init.Actor.TraitInfoOrDefault<IFacingInfo>();
|
||||||
var bodyFacing = ifacing != null ? init.Contains<FacingInit>() ? init.Get<FacingInit, int>() : ifacing.GetInitialFacing() : 0;
|
var bodyFacing = ifacing != null ? init.Contains<FacingInit>() ? init.Get<FacingInit, int>() : ifacing.GetInitialFacing() : 0;
|
||||||
var turretFacing = init.Contains<TurretFacingInit>() ? init.Get<TurretFacingInit, int>() : t.InitialFacing;
|
var turretFacing = Turreted.GetInitialTurretFacing(init, t.InitialFacing, Turret);
|
||||||
|
|
||||||
var anim = new Animation(init.World, image, () => turretFacing);
|
var anim = new Animation(init.World, image, () => turretFacing);
|
||||||
anim.Play(RenderSprites.NormalizeSequence(anim, init.GetDamageState(), Sequence));
|
anim.Play(RenderSprites.NormalizeSequence(anim, init.GetDamageState(), Sequence));
|
||||||
|
|||||||
@@ -42,7 +42,7 @@ namespace OpenRA.Mods.Common.Traits
|
|||||||
|
|
||||||
var voxel = VoxelProvider.GetVoxel(image, Sequence);
|
var voxel = VoxelProvider.GetVoxel(image, Sequence);
|
||||||
|
|
||||||
var turretFacing = init.Contains<TurretFacingInit>() ? init.Get<TurretFacingInit, int>() : t.InitialFacing;
|
var turretFacing = Turreted.GetInitialTurretFacing(init, t.InitialFacing, t.Turret);
|
||||||
var turretOrientation = body.QuantizeOrientation(new WRot(WAngle.Zero, WAngle.Zero, WAngle.FromFacing(turretFacing) - orientation.Yaw), facings);
|
var turretOrientation = body.QuantizeOrientation(new WRot(WAngle.Zero, WAngle.Zero, WAngle.FromFacing(turretFacing) - orientation.Yaw), facings);
|
||||||
var turretOffset = body.LocalToWorld(t.Offset.Rotate(orientation));
|
var turretOffset = body.LocalToWorld(t.Offset.Rotate(orientation));
|
||||||
|
|
||||||
|
|||||||
@@ -38,7 +38,7 @@ namespace OpenRA.Mods.Common.Traits
|
|||||||
var voxel = VoxelProvider.GetVoxel(image, Sequence);
|
var voxel = VoxelProvider.GetVoxel(image, Sequence);
|
||||||
var turretOffset = body.LocalToWorld(t.Offset.Rotate(orientation));
|
var turretOffset = body.LocalToWorld(t.Offset.Rotate(orientation));
|
||||||
|
|
||||||
var turretFacing = init.Contains<TurretFacingInit>() ? init.Get<TurretFacingInit, int>() : t.InitialFacing;
|
var turretFacing = Turreted.GetInitialTurretFacing(init, t.InitialFacing, Turret);
|
||||||
var turretBodyOrientation = new WRot(WAngle.Zero, WAngle.Zero, WAngle.FromFacing(turretFacing) - orientation.Yaw);
|
var turretBodyOrientation = new WRot(WAngle.Zero, WAngle.Zero, WAngle.FromFacing(turretFacing) - orientation.Yaw);
|
||||||
var turretOrientation = new[] { turretBodyOrientation, body.QuantizeOrientation(orientation, facings) };
|
var turretOrientation = new[] { turretBodyOrientation, body.QuantizeOrientation(orientation, facings) };
|
||||||
yield return new VoxelAnimation(voxel, () => turretOffset, () => turretOrientation, () => false, () => 0);
|
yield return new VoxelAnimation(voxel, () => turretOffset, () => turretOrientation, () => false, () => 0);
|
||||||
|
|||||||
@@ -9,6 +9,7 @@
|
|||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
using System;
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
using OpenRA.Traits;
|
using OpenRA.Traits;
|
||||||
|
|
||||||
namespace OpenRA.Mods.Common.Traits
|
namespace OpenRA.Mods.Common.Traits
|
||||||
@@ -47,8 +48,15 @@ namespace OpenRA.Mods.Common.Traits
|
|||||||
public WVec Offset { get { return info.Offset + localOffset; } }
|
public WVec Offset { get { return info.Offset + localOffset; } }
|
||||||
public string Name { get { return info.Turret; } }
|
public string Name { get { return info.Turret; } }
|
||||||
|
|
||||||
public static int GetInitialTurretFacing(ActorInitializer init, int def)
|
public static int GetInitialTurretFacing(IActorInitializer init, int def, string turret = null)
|
||||||
{
|
{
|
||||||
|
if (turret != null && init.Contains<TurretFacingsInit>())
|
||||||
|
{
|
||||||
|
int facing;
|
||||||
|
if (init.Get<TurretFacingsInit, Dictionary<string, int>>().TryGetValue(turret, out facing))
|
||||||
|
return facing;
|
||||||
|
}
|
||||||
|
|
||||||
if (init.Contains<TurretFacingInit>())
|
if (init.Contains<TurretFacingInit>())
|
||||||
return init.Get<TurretFacingInit, int>();
|
return init.Get<TurretFacingInit, int>();
|
||||||
|
|
||||||
@@ -61,7 +69,7 @@ namespace OpenRA.Mods.Common.Traits
|
|||||||
public Turreted(ActorInitializer init, TurretedInfo info)
|
public Turreted(ActorInitializer init, TurretedInfo info)
|
||||||
{
|
{
|
||||||
this.info = info;
|
this.info = info;
|
||||||
TurretFacing = GetInitialTurretFacing(init, info.InitialFacing);
|
TurretFacing = GetInitialTurretFacing(init, info.InitialFacing, info.Turret);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Created(Actor self)
|
public void Created(Actor self)
|
||||||
@@ -128,4 +136,21 @@ namespace OpenRA.Mods.Common.Traits
|
|||||||
return new WRot(WAngle.Zero, WAngle.Zero, WAngle.FromFacing(facing));
|
return new WRot(WAngle.Zero, WAngle.Zero, WAngle.FromFacing(facing));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public class TurretFacingInit : IActorInit<int>
|
||||||
|
{
|
||||||
|
[FieldFromYamlKey] readonly int value = 128;
|
||||||
|
public TurretFacingInit() { }
|
||||||
|
public TurretFacingInit(int init) { value = init; }
|
||||||
|
public int Value(World world) { return value; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public class TurretFacingsInit : IActorInit<Dictionary<string, int>>
|
||||||
|
{
|
||||||
|
[DictionaryFromYamlKey]
|
||||||
|
readonly Dictionary<string, int> value = new Dictionary<string, int>();
|
||||||
|
public TurretFacingsInit() { }
|
||||||
|
public TurretFacingsInit(Dictionary<string, int> init) { value = init; }
|
||||||
|
public Dictionary<string, int> Value(World world) { return value; }
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -8,6 +8,7 @@
|
|||||||
*/
|
*/
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using OpenRA.Mods.Common.Traits;
|
using OpenRA.Mods.Common.Traits;
|
||||||
using OpenRA.Mods.Common.Warheads;
|
using OpenRA.Mods.Common.Warheads;
|
||||||
@@ -107,11 +108,14 @@ namespace OpenRA.Mods.RA.Traits
|
|||||||
if (facing != null)
|
if (facing != null)
|
||||||
td.Add(new FacingInit(facing.Facing));
|
td.Add(new FacingInit(facing.Facing));
|
||||||
|
|
||||||
// TODO: This will only take the first turret if there are multiple
|
var turreted = self.TraitsImplementing<Turreted>();
|
||||||
// This isn't a problem with the current units, but may be a problem for mods
|
if (turreted.Any())
|
||||||
var turreted = self.TraitsImplementing<Turreted>().FirstOrDefault();
|
{
|
||||||
if (turreted != null)
|
var turretFacings = new Dictionary<string, int>();
|
||||||
td.Add(new TurretFacingInit(turreted.TurretFacing));
|
foreach (var t in turreted)
|
||||||
|
turretFacings.Add(t.Name, t.TurretFacing);
|
||||||
|
td.Add(new TurretFacingsInit(turretFacings));
|
||||||
|
}
|
||||||
|
|
||||||
// TODO: untie this and move to Mods.Common
|
// TODO: untie this and move to Mods.Common
|
||||||
var chronoshiftable = self.TraitOrDefault<Chronoshiftable>();
|
var chronoshiftable = self.TraitOrDefault<Chronoshiftable>();
|
||||||
|
|||||||
Reference in New Issue
Block a user