diff --git a/OpenRA.Mods.Common/Activities/Repair.cs b/OpenRA.Mods.Common/Activities/Repair.cs index ff3f06fb2f..aeff9e65f5 100644 --- a/OpenRA.Mods.Common/Activities/Repair.cs +++ b/OpenRA.Mods.Common/Activities/Repair.cs @@ -49,6 +49,13 @@ namespace OpenRA.Mods.Common.Activities if (health.DamageState == DamageState.Undamaged) { + if (host.Owner != self.Owner) + { + var exp = host.Owner.PlayerActor.TraitOrDefault(); + if (exp != null) + exp.GiveExperience(repairsUnits.PlayerExperience); + } + Game.Sound.PlayNotification(self.World.Map.Rules, self.Owner, "Speech", repairsUnits.FinishRepairingNotification, self.Owner.Faction.InternalName); return NextActivity; } diff --git a/OpenRA.Mods.Common/Traits/Buildings/RepairableBuilding.cs b/OpenRA.Mods.Common/Traits/Buildings/RepairableBuilding.cs index a3831788bf..64f95b852f 100644 --- a/OpenRA.Mods.Common/Traits/Buildings/RepairableBuilding.cs +++ b/OpenRA.Mods.Common/Traits/Buildings/RepairableBuilding.cs @@ -35,6 +35,9 @@ namespace OpenRA.Mods.Common.Traits [Desc("Suffixed by the internal repairing player name.")] public readonly string IndicatorPalettePrefix = "player"; + [Desc("Experience gained by a player for repairing structures of allied players.")] + public readonly int PlayerExperience = 0; + public override object Create(ActorInitializer init) { return new RepairableBuilding(init.Self, this); } } @@ -133,6 +136,16 @@ namespace OpenRA.Mods.Common.Traits if (health.DamageState == DamageState.Undamaged) { + Repairers.Do(r => + { + if (r == self.Owner) + return; + + var exp = r.PlayerActor.TraitOrDefault(); + if (exp != null) + exp.GiveExperience(Info.PlayerExperience); + }); + Repairers.Clear(); RepairActive = false; return; diff --git a/OpenRA.Mods.Common/Traits/Buildings/RepairsUnits.cs b/OpenRA.Mods.Common/Traits/Buildings/RepairsUnits.cs index a1728ff5ca..063724e13e 100644 --- a/OpenRA.Mods.Common/Traits/Buildings/RepairsUnits.cs +++ b/OpenRA.Mods.Common/Traits/Buildings/RepairsUnits.cs @@ -27,6 +27,9 @@ namespace OpenRA.Mods.Common.Traits [Desc("The sound played when repairing a unit is done.")] public readonly string FinishRepairingNotification = null; + + [Desc("Experience gained by the player owning this actor for repairing an allied unit.")] + public readonly int PlayerExperience = 0; } public class RepairsUnits { }