Esempio n. 1
0
        public ProductionInProgress StartPrototype(Character character, ProductionDescription productionDescription, Container container, bool useCorporationWallet, out bool hasBonus)
        {
            var foundComponents = productionDescription.SearchForAvailableComponents(container).ToList();

            var materialMultiplier = CalculateMaterialMultiplier(character, productionDescription.definition, out hasBonus);

            var itemsNeeded = productionDescription.ProcessComponentRequirement(ProductionInProgressType.prototype, foundComponents, 1, materialMultiplier);

            //put them to storage
            long[] reservedEids;
            ProductionHelper.ReserveComponents_noSQL(itemsNeeded, StorageEid, container, out reservedEids).ThrowIfError();

            var prototypeTimeSeconds = CalculatePrototypeTimeSeconds(character, productionDescription.definition);

            prototypeTimeSeconds = GetShortenedProductionTime(prototypeTimeSeconds);

            var productionInProgress = ProductionInProgressFactory();

            productionInProgress.amountOfCycles             = 1;
            productionInProgress.baseEID                    = Parent;
            productionInProgress.character                  = character;
            productionInProgress.facilityEID                = Eid;
            productionInProgress.finishTime                 = DateTime.Now.AddSeconds(prototypeTimeSeconds);
            productionInProgress.pricePerSecond             = GetPricePerSecond();
            productionInProgress.ReservedEids               = reservedEids;
            productionInProgress.resultDefinition           = productionDescription.GetPrototypeDefinition();
            productionInProgress.startTime                  = DateTime.Now;
            productionInProgress.totalProductionTimeSeconds = prototypeTimeSeconds;
            productionInProgress.type = ProductionInProgressType.prototype;
            productionInProgress.useCorporationWallet = useCorporationWallet;

            if (!productionInProgress.TryWithdrawCredit())
            {
                if (useCorporationWallet)
                {
                    throw new PerpetuumException(ErrorCodes.CorporationNotEnoughMoney);
                }

                throw new PerpetuumException(ErrorCodes.CharacterNotEnoughMoney);
            }

            return(productionInProgress);
        }
Esempio n. 2
0
        public ProductionInProgress LineStart(Character character, ProductionLine productionLine, Container sourceContainer, int cycles, bool useCorporationWallet, out bool hasBonus)
        {
            var cprg = productionLine.GetOrCreateCalibrationProgram(this);

            var components = cprg.Components;

            //search for components
            var foundComponents = ProductionHelper.SearchForAvailableComponents(sourceContainer, components).ToList();

            var materialMultiplier = CalculateFinalMaterialMultiplier(character, productionLine.GetMaterialPoints(), productionLine.TargetDefinition, out hasBonus);

            if (cprg.IsMissionRelated)
            {
                //clamp the material multiplier at 1.0
                //so it can ask less that in the mission but never more
                var preMatMult = materialMultiplier;
                materialMultiplier = materialMultiplier.Clamp();

                Logger.Info("pre material multiplier:" + preMatMult + " -> " + materialMultiplier);
            }

            //match components
            var itemsNeeded = ProductionHelper.ProcessComponentRequirement(ProductionInProgressType.massProduction, foundComponents, cycles, materialMultiplier, components);

            //put them to storage
            long[] reservedEids;
            ProductionHelper.ReserveComponents_noSQL(itemsNeeded, StorageEid, sourceContainer, out reservedEids).ThrowIfError();

            //calculate time
            var productionTimeSeconds = cycles * CalculateFinalProductionTimeSeconds(character, cprg.TargetDefinition, productionLine.GetTimePoints());

            productionTimeSeconds = GetShortenedProductionTime(productionTimeSeconds);

            if (cprg.IsMissionRelated)
            {
                productionTimeSeconds = 10;
            }

            var newProduction = ProductionInProgressFactory();

            newProduction.startTime                  = DateTime.Now;
            newProduction.finishTime                 = DateTime.Now.AddSeconds(productionTimeSeconds);
            newProduction.type                       = ProductionInProgressType.massProduction;
            newProduction.character                  = character;
            newProduction.facilityEID                = Eid;
            newProduction.resultDefinition           = productionLine.TargetDefinition;
            newProduction.totalProductionTimeSeconds = productionTimeSeconds;
            newProduction.baseEID                    = Parent;
            newProduction.pricePerSecond             = cprg.IsMissionRelated ? 0.0 : GetPricePerSecond(productionLine.TargetDefinition);
            newProduction.ReservedEids               = reservedEids;
            newProduction.amountOfCycles             = cycles;
            newProduction.useCorporationWallet       = useCorporationWallet;

            if (!newProduction.TryWithdrawCredit())
            {
                //not enough money
                return(null);
            }

            //save to sql
            newProduction.InsertProductionInProgess();

            //set running production id to line
            ProductionLine.SetRunningProductionId(productionLine.Id, newProduction.ID).ThrowIfError();

            productionLine.DecreaseRounds();

            sourceContainer.Save();

            Transaction.Current.OnCommited(() =>
            {
                //add to ram
                ProductionProcessor.AddToRunningProductions(newProduction);
            });

            //send info to client
            newProduction.SendProductionEventToCorporationMembersOnCommitted(Commands.ProductionRemoteStart);

            return(newProduction);
        }