PyResult RamProxyService::Handle_CompleteJob(PyCallArgs &call) { Call_CompleteJob args; if(!args.Decode(&call.tuple)) { _log(CLIENT__ERROR, "Failed to decode args."); return NULL; } _VerifyCompleteJob(args, call.client); // hundreds of variables to allocate ... maybe we can make struct for GetJobProperties and InstallJob? uint32 installedItemID, ownerID, runs, licensedProductionRuns; EVEItemFlags outputFlag; EVERamActivity activity; if(!m_db.GetJobProperties(args.jobID, installedItemID, ownerID, outputFlag, runs, licensedProductionRuns, activity)) return NULL; // return item InventoryItemRef installedItem = m_manager->item_factory.GetItem( installedItemID ); if( !installedItem ) return NULL; installedItem->Move( installedItem->locationID(), outputFlag ); std::vector<RequiredItem> reqItems; if( !m_db.GetRequiredItems( installedItem->typeID(), activity, reqItems ) ) return NULL; // return materials which weren't completely consumed std::vector<RequiredItem>::iterator cur, end; cur = reqItems.begin(); end = reqItems.end(); for(; cur != end; cur++) { if(!cur->isSkill && cur->damagePerJob != 1.0) { uint32 quantity = static_cast<uint32>(cur->quantity * runs * (1.0 - cur->damagePerJob)); if(quantity == 0) continue; ItemData idata( cur->typeID, ownerID, 0, //temp location outputFlag, quantity ); InventoryItemRef item = m_manager->item_factory.SpawnItem( idata ); if( !item ) return NULL; item->Move(args.containerID, outputFlag); } } // if not cancelled, realize result of activity if(!args.cancel) { switch(activity) { /* * Manufacturing */ case ramActivityManufacturing: { BlueprintRef bp = BlueprintRef::StaticCast( installedItem ); ItemData idata( bp->productTypeID(), ownerID, 0, // temp location outputFlag, bp->productType().portionSize() * runs ); InventoryItemRef item = m_manager->item_factory.SpawnItem( idata ); if( !item ) return NULL; item->Move(args.containerID, outputFlag); } break; /* * Time productivity research */ case ramActivityResearchingTimeProductivity: { BlueprintRef bp = BlueprintRef::StaticCast( installedItem ); bp->AlterProductivityLevel( runs ); } break; /* * Material productivity research */ case ramActivityResearchingMaterialProductivity: { BlueprintRef bp = BlueprintRef::StaticCast( installedItem ); bp->AlterMaterialLevel( runs) ; } break; /* * Copying */ case ramActivityCopying: { BlueprintRef bp = BlueprintRef::StaticCast( installedItem ); ItemData idata( installedItem->typeID(), ownerID, 0, //temp location outputFlag, runs ); BlueprintData bdata( true, bp->materialLevel(), bp->productivityLevel(), licensedProductionRuns ); BlueprintRef copy = m_manager->item_factory.SpawnBlueprint( idata, bdata ); if( !copy ) return NULL; copy->Move(args.containerID, outputFlag); } break; /* * The rest is unsupported */ case ramActivityResearchingTechnology: case ramActivityDuplicating: case ramActivityReverseEngineering: case ramActivityInvention: default: { _log(SERVICE__ERROR, "Activity %u is currently unsupported.", activity); } break; } } // regardless on success of this, we will return NULL, so there's no condition here m_db.CompleteJob(args.jobID, args.cancel ? ramCompletedStatusAbort : ramCompletedStatusDelivered); return NULL; }