OpenRA.Mods.Common.Traits.ProductionQueue.ResolveOrder C# (CSharp) Method

ResolveOrder() public method

public ResolveOrder ( Actor self, Order order ) : void
self Actor
order Order
return void
        public void ResolveOrder(Actor self, Order order)
        {
            if (!Enabled)
                return;

            var rules = self.World.Map.Rules;
            switch (order.OrderString)
            {
                case "StartProduction":
                    var unit = rules.Actors[order.TargetString];
                    var bi = unit.TraitInfo<BuildableInfo>();

                    // Not built by this queue
                    if (!bi.Queue.Contains(Info.Type))
                        return;

                    // You can't build that
                    if (BuildableItems().All(b => b.Name != order.TargetString))
                        return;

                    // Check if the player is trying to build more units that they are allowed
                    var fromLimit = int.MaxValue;
                    if (!developerMode.AllTech && bi.BuildLimit > 0)
                    {
                        var inQueue = queue.Count(pi => pi.Item == order.TargetString);
                        var owned = self.Owner.World.ActorsHavingTrait<Buildable>().Count(a => a.Info.Name == order.TargetString && a.Owner == self.Owner);
                        fromLimit = bi.BuildLimit - (inQueue + owned);

                        if (fromLimit <= 0)
                            return;
                    }

                    var valued = unit.TraitInfoOrDefault<ValuedInfo>();
                    var cost = valued != null ? valued.Cost : 0;
                    var time = GetBuildTime(unit, bi);
                    var amountToBuild = Math.Min(fromLimit, order.ExtraData);
                    for (var n = 0; n < amountToBuild; n++)
                    {
                        var hasPlayedSound = false;
                        BeginProduction(new ProductionItem(this, order.TargetString, cost, playerPower, () => self.World.AddFrameEndTask(_ =>
                        {
                            var isBuilding = unit.HasTraitInfo<BuildingInfo>();

                            if (isBuilding && !hasPlayedSound)
                                hasPlayedSound = Game.Sound.PlayNotification(rules, self.Owner, "Speech", Info.ReadyAudio, self.Owner.Faction.InternalName);
                            else if (!isBuilding)
                            {
                                if (BuildUnit(unit))
                                    Game.Sound.PlayNotification(rules, self.Owner, "Speech", Info.ReadyAudio, self.Owner.Faction.InternalName);
                                else if (!hasPlayedSound && time > 0)
                                    hasPlayedSound = Game.Sound.PlayNotification(rules, self.Owner, "Speech", Info.BlockedAudio, self.Owner.Faction.InternalName);
                            }
                        })));
                    }

                    break;
                case "PauseProduction":
                    if (queue.Count > 0 && queue[0].Item == order.TargetString)
                        queue[0].Pause(order.ExtraData != 0);

                    break;
                case "CancelProduction":
                    CancelProduction(order.TargetString, order.ExtraData);
                    break;
            }
        }