Example #1
0
        public ErrorCodes StartResearch(Character character, int researchTimeSeconds, Item sourceItem, ResearchKit researchKit, bool useCorporationWallet, out ProductionInProgress newProduction)
        {
            newProduction = ProductionInProgressFactory();

            var itemsList = new [] { researchKit, sourceItem };

            ItemResearchLevel itemResearchLevel;

            if (!ProductionDataAccess.ResearchLevels.TryGetValue(sourceItem.Definition, out itemResearchLevel))
            {
                Logger.Error("consistency error. no research level or calibration program was defined for " + EntityDefault.Get(sourceItem.Definition).Name + " " + sourceItem.Definition);
                return(ErrorCodes.ServerError);
            }

            if (itemResearchLevel.calibrationProgramDefinition == null)
            {
                Logger.Error("consistency error. CPRG definition is NULL for " + EntityDefault.Get(sourceItem.Definition).Name + " " + sourceItem.Definition);
                return(ErrorCodes.ServerError);
            }

            var cprgDefiniton = (int)itemResearchLevel.calibrationProgramDefinition;


            MoveItemsToStorage(itemsList);

            newProduction                            = ProductionInProgressFactory();
            newProduction.startTime                  = DateTime.Now;
            newProduction.finishTime                 = DateTime.Now.AddSeconds(researchTimeSeconds);
            newProduction.type                       = ProductionInProgressType.research;
            newProduction.character                  = character;
            newProduction.facilityEID                = Eid;
            newProduction.resultDefinition           = cprgDefiniton;
            newProduction.totalProductionTimeSeconds = researchTimeSeconds;
            newProduction.baseEID                    = Parent;
            newProduction.pricePerSecond             = GetPricePerSecond(sourceItem.Definition);
            newProduction.ReservedEids               = (from i in itemsList select i.Eid).ToArray();
            newProduction.useCorporationWallet       = useCorporationWallet;
            newProduction.amountOfCycles             = 1;

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

                throw new PerpetuumException(ErrorCodes.CharacterNotEnoughMoney);
            }

            return(ErrorCodes.NoError);
        }