Adds PlayVoice, PlayVoiceLocal and HasVoice to ActorExts.

Makes Cargo unload voice customisable.
This commit is contained in:
reaperrr
2015-05-21 05:35:08 +02:00
parent 5f68516070
commit 5e2c781c8a
5 changed files with 41 additions and 8 deletions

View File

@@ -80,6 +80,39 @@ namespace OpenRA.Mods.Common
return Target.Invalid; return Target.Invalid;
} }
public static void PlayVoice(this Actor self, Actor actor, string phrase, string variant)
{
foreach (var voiced in self.TraitsImplementing<IVoiced>())
{
if (phrase == null)
return;
if (string.IsNullOrEmpty(voiced.VoiceSet))
return;
voiced.PlayVoice(self, phrase, variant);
}
}
public static void PlayVoiceLocal(this Actor self, Actor actor, string phrase, string variant, float volume)
{
foreach (var voiced in self.TraitsImplementing<IVoiced>())
{
if (phrase == null)
return;
if (string.IsNullOrEmpty(voiced.VoiceSet))
return;
voiced.PlayVoiceLocal(self, phrase, variant, volume);
}
}
public static bool HasVoice(this Actor self, string voice)
{
return self.TraitsImplementing<IVoiced>().Any(x => x.HasVoice(self, voice));
}
public static void NotifyBlocker(this Actor self, IEnumerable<Actor> blockers) public static void NotifyBlocker(this Actor self, IEnumerable<Actor> blockers)
{ {
foreach (var blocker in blockers) foreach (var blocker in blockers)

View File

@@ -39,6 +39,9 @@ namespace OpenRA.Mods.Common.Traits
[Desc("Terrain types that this actor is allowed to eject actors onto. Leave empty for all terrain types.")] [Desc("Terrain types that this actor is allowed to eject actors onto. Leave empty for all terrain types.")]
public readonly string[] UnloadTerrainTypes = { }; public readonly string[] UnloadTerrainTypes = { };
[Desc("Voice to play when ordered to unload the passengers.")]
public readonly string UnloadVoice = "Unload";
[Desc("Which direction the passenger will face (relative to the transport) when unloading.")] [Desc("Which direction the passenger will face (relative to the transport) when unloading.")]
public readonly int PassengerFacing = 128; public readonly int PassengerFacing = 128;
@@ -204,10 +207,10 @@ namespace OpenRA.Mods.Common.Traits
public string VoicePhraseForOrder(Actor self, Order order) public string VoicePhraseForOrder(Actor self, Order order)
{ {
if (order.OrderString != "Unload" || IsEmpty(self)) if (order.OrderString != "Unload" || IsEmpty(self) || !self.HasVoice(Info.UnloadVoice))
return null; return null;
return self.TraitsImplementing<IVoiced>().Any(x => x.HasVoice(self, "Unload")) ? "Unload" : "Move"; return Info.UnloadVoice;
} }
public bool MoveDisabled(Actor self) { return reserves.Any(); } public bool MoveDisabled(Actor self) { return reserves.Any(); }

View File

@@ -19,8 +19,7 @@ namespace OpenRA.Mods.Common.Traits
{ {
public void BuildingComplete(Actor self) public void BuildingComplete(Actor self)
{ {
foreach (var voiced in self.TraitsImplementing<IVoiced>()) self.PlayVoice(self, "Build", self.Owner.Country.Race);
voiced.PlayVoice(self, "Build", self.Owner.Country.Race);
} }
} }
} }

View File

@@ -39,8 +39,7 @@ namespace OpenRA.Mods.Common.Traits
if (e.DamageState == DamageState.Dead && damaged != e.Attacker) if (e.DamageState == DamageState.Dead && damaged != e.Attacker)
{ {
if (self.World.WorldTick - lastAnnounce > info.Interval * 25) if (self.World.WorldTick - lastAnnounce > info.Interval * 25)
foreach (var voiced in self.TraitsImplementing<IVoiced>()) self.PlayVoice(self, "Kill", self.Owner.Country.Race);
voiced.PlayVoice(self, "Kill", self.Owner.Country.Race);
lastAnnounce = self.World.WorldTick; lastAnnounce = self.World.WorldTick;
} }

View File

@@ -42,8 +42,7 @@ namespace OpenRA.Mods.Common.Traits
if (info.DeathTypes.Contains(e.Warhead.DeathType) || (!info.DeathTypes.Any() && if (info.DeathTypes.Contains(e.Warhead.DeathType) || (!info.DeathTypes.Any() &&
!self.Info.Traits.WithInterface<DeathSoundsInfo>().Any(dsi => dsi.DeathTypes.Contains(e.Warhead.DeathType)))) !self.Info.Traits.WithInterface<DeathSoundsInfo>().Any(dsi => dsi.DeathTypes.Contains(e.Warhead.DeathType))))
foreach (var voiced in self.TraitsImplementing<IVoiced>()) self.PlayVoiceLocal(self, info.DeathSound, self.Owner.Country.Race, info.VolumeMultiplier);
voiced.PlayVoiceLocal(self, info.DeathSound, self.Owner.Country.Race, info.VolumeMultiplier);
} }
} }
} }