public float GetMass(ItemInstance item) { return(item switch { CraftedItemInstance _ => item.Data.Value.Mass, SimpleCommodity commodity => item.Data.Value.Mass *commodity.Quantity, _ => 0 });
void OnPickup() { var haulingTask = _context.Cache.Get <HaulingTask>(Task); var target = _context.ZoneEntities[_entity.Zone][haulingTask.Origin] as OrbitalEntity; _context.SetParent(_entity, target); var itemData = _context.Cache.Get <ItemData>(haulingTask.ItemType); int quantity = min((int)((_entity.Capacity - _entity.OccupiedCapacity) / itemData.Size), haulingTask.Quantity - _itemsDelivered); if (itemData is SimpleCommodityData) { var itemMatch = target.Cargo .Select(id => _context.Cache.Get <SimpleCommodity>(id)) .FirstOrDefault(ii => ii != null && ii.Data == haulingTask.ItemType); if (itemMatch == null) { FinishTask(); } _simpleCommodityDelivery = _entity.AddCargo(target.RemoveCargo(itemMatch, quantity)); } else if (itemData is CraftedItemData) { var itemMatches = target.Cargo .Select(id => _context.Cache.Get <CraftedItemInstance>(id)) .Where(ii => ii != null && ii.Data == haulingTask.ItemType) .ToArray(); if (!itemMatches.Any()) { FinishTask(); } foreach (var match in itemMatches) { _craftedItemDelivery.Add(_entity.AddCargo(target.RemoveCargo(match))); } } Wait(_data.DockTime, OnItemObtained); }
void OnDelivery() { var haulingTask = _context.Cache.Get <HaulingTask>(Task); var target = _context.ZoneEntities[_entity.Zone][haulingTask.Target] as OrbitalEntity; _context.SetParent(_entity, target); var itemData = _context.Cache.Get <ItemData>(haulingTask.ItemType); if (itemData is SimpleCommodityData) { target.AddCargo(_entity.RemoveCargo(_simpleCommodityDelivery, _simpleCommodityDelivery.Quantity)); _itemsDelivered += _simpleCommodityDelivery.Quantity; _simpleCommodityDelivery = null; } else if (itemData is CraftedItemData) { foreach (var item in _craftedItemDelivery) { target.AddCargo(_entity.RemoveCargo(item)); } _itemsDelivered += _craftedItemDelivery.Count; _craftedItemDelivery.Clear(); } Wait(_data.DockTime, () => { if (_itemsDelivered == haulingTask.Quantity) { FinishTask(); } else { _taskStarted = false; } }); }
// public void Update() // { // foreach(var zone in _zones.Values) // zone.Update((float) Time, _deltaTime); // // foreach (var corporation in Cache.GetAll<Corporation>()) // { // foreach (var tasks in corporation.Tasks // .Select(id => Cache.Get<AgentTask>(id)) // Fetch the tasks from the database cache // .Where(task => !task.Reserved) // Filter out tasks that have already been reserved // .GroupBy(task => task.Type)) // Group tasks by type // { // // Create a list of available controllers for this task type // var availableControllers = CorporationControllers[corporation.ID] // .Where(controller => controller.Available && controller.TaskType == tasks.Key).ToList(); // // // Iterate over the highest priority tasks for which controllers are available // foreach (var task in tasks.OrderByDescending(task => task.Priority).Take(availableControllers.Count)) // { // // Find the nearest controller for this task // IController nearestController = availableControllers[0]; // List<ZoneDefinition> nearestControllerPath = FindPath(GalaxyZones[availableControllers.First().Zone.Data.ID], GalaxyZones[task.Zone], true); // foreach (var controller in availableControllers.Skip(1)) // { // var path = FindPath(GalaxyZones[controller.Zone.Data.ID], GalaxyZones[task.Zone], true); // if (path.Count < nearestControllerPath.Count) // { // nearestControllerPath = path; // nearestController = controller; // } // } // task.Reserved = true; // nearestController.AssignTask(task.ID); // } // } // } // // } // public int ItemTier(CraftedItemData itemData) // { // if (Tier.ContainsKey(itemData)) return Tier[itemData]; // // Tier[itemData] = itemData.Ingredients.Keys.Max(ci => _cache.Get<ItemData>(ci) is CraftedItemData craftableIngredient ? ItemTier(craftableIngredient) : 0); // // return Tier[itemData]; // } public SimpleCommodityData GetData(SimpleCommodity item) { return(item.Data.Value as SimpleCommodityData); }