private bool TransferFromTarget(NaniteMiningItem target) { byte material = 0; float amount = 0; //NaniteMining.CheckVoxelContent(target.VoxelId, target.Position, target.LocalPos); NaniteMining.RemoveVoxelContent(target.VoxelId, target.Position, out material, out amount); //NaniteMining.TestRemoveVoxel(target.VoxelId, target.Position, out material, out amount); //gging.Instance.WriteLine($"Removing: {target.Position} ({material} {amount})"); /* * if (material == 0) * { * Logging.Instance.WriteLine(string.Format("Material is 0", target.VoxelId)); * return false; * } */ if (amount == 0f) { Logging.Instance.WriteLine(string.Format("Amount is 0", target.VoxelId)); return(false); } var def = MyDefinitionManager.Static.GetVoxelMaterialDefinition(target.VoxelMaterial); var builder = MyObjectBuilderSerializer.CreateNewObject <MyObjectBuilder_Ore>(def.MinedOre); if (!GridHelper.FindFreeCargo((MyCubeBlock)m_constructionBlock.ConstructionBlock, builder, (int)amount, false)) { Logging.Instance.WriteLine(string.Format("Can not find free cargo space!")); return(false); } return(true); }
public override void FindTargets(ref Dictionary <string, int> available) { if (!IsEnabled()) { return; } if (TargetList.Count >= GetMaximumTargets()) { if (PotentialTargetList.Count > 0) { m_lastInvalidTargetReason = "Maximum targets reached. Add more upgrades!"; } return; } DateTime start = DateTime.Now; using (Lock.AcquireExclusiveUsing()) { if (m_constructionBlock.IsUserDefinedLimitReached()) { m_lastInvalidTargetReason = "User defined maximum nanite limit reached"; return; } //foreach (NaniteMiningItem item in PotentialTargetList) for (int r = PotentialTargetList.Count - 1; r >= 0; r--) { var item = (NaniteMiningItem)PotentialTargetList[r]; if (TargetList.Contains(item)) { continue; } if (m_globalPositionList.Contains(item.Position)) { m_lastInvalidTargetReason = "Another factory has this voxel as a target"; continue; } var blockList = NaniteConstructionManager.GetConstructionBlocks((IMyCubeGrid)m_constructionBlock.ConstructionBlock.CubeGrid); bool found = false; foreach (var block in blockList) { // This can be sped up if necessary by indexing items by position if (block.GetTarget <NaniteMiningTargets>().TargetList.FirstOrDefault(x => ((NaniteMiningItem)x).Position == item.Position) != null) { found = true; break; } } if (found) { m_lastInvalidTargetReason = "Another factory has this voxel as a target"; continue; } if (!NaniteMining.CheckVoxelContent(item.VoxelId, item.Position)) { continue; } if (Vector3D.DistanceSquared(m_constructionBlock.ConstructionBlock.GetPosition(), item.Position) < m_maxDistance * m_maxDistance && NaniteConstructionPower.HasRequiredPowerForNewTarget((IMyFunctionalBlock)m_constructionBlock.ConstructionBlock, this)) { Logging.Instance.WriteLine(string.Format("ADDING Mining Target: conid={0} pos={1} type={2}", m_constructionBlock.ConstructionBlock.EntityId, item.Position, MyDefinitionManager.Static.GetVoxelMaterialDefinition(item.VoxelMaterial).MinedOre)); //PotentialTargetList.Remove(item); TargetList.Add(item); m_globalPositionList.Add(item.Position); if (TargetList.Count >= GetMaximumTargets()) { break; } } } } //Logging.Instance.WriteLine(string.Format("FindTargets took {0}ms", (DateTime.Now - start).TotalMilliseconds)); }