private bool isAttached_connector(AttachedGrids partner) { foreach (KeyValuePair <IMySlimBlock, wasConnected> pair in allConnectors) { IMySlimBlock connector = pair.Key; MyObjectBuilder_ShipConnector builder_conn = connector.GetObjectBuilder() as MyObjectBuilder_ShipConnector; pair.Value.connected = builder_conn.Connected; if (!builder_conn.Connected) { continue; } long connectedEntityId = builder_conn.ConnectedEntityId; foreach (IMySlimBlock connectPartner in partner.allConnectors.Keys) { if (connectedEntityId == connectPartner.FatBlock.EntityId) { log("matched " + myGrid.DisplayName + " : " + connector.FatBlock.DefinitionDisplayNameText + " to " + partner.myGrid.DisplayName + " : " + connectPartner.FatBlock.DefinitionDisplayNameText, "isAttached_connector()", Logger.severity.TRACE); tryAddAttached(partner); return(true); } } } return(false); }
public static AttachedGrids getFor(IMyCubeGrid myGrid) { AttachedGrids instance; if (registry.TryGetValue(myGrid, out instance)) { return(instance); } instance = new AttachedGrids(); instance.myGrid = myGrid; List <IMySlimBlock> allBlocks = new List <IMySlimBlock>(); myGrid.GetBlocks(allBlocks); foreach (IMySlimBlock block in allBlocks) { instance.myGrid_OnBlockAdded(block); } myGrid.OnBlockAdded += instance.myGrid_OnBlockAdded; myGrid.OnBlockRemoved += instance.myGrid_OnBlockRemoved; myGrid.OnClosing += instance.myGrid_OnClosing; registry.Add(myGrid, instance); instance.log("created for: " + myGrid.DisplayName, "getFor()"); return(instance); }
private bool tryAddAttached(AttachedGrids toAttach) { if (toAttach == this || attachedToMe.Contains(toAttach)) { //log("already attached " + toAttach.DisplayName, "tryAddAttached()", Logger.severity.TRACE); return(false); } attachedToMe.Add(toAttach); toAttach.tryAddAttached(this); log("attached " + toAttach.myGrid.DisplayName, "tryAddAttached()", Logger.severity.TRACE); return(true); }
private void buildAttached(int buildID) { if (last_build_ID == buildID) { //log("already building for : " + myGrid.DisplayName, "buildAttached()", Logger.severity.TRACE); return; } last_build_ID = buildID; log("building for : " + myGrid.DisplayName, "buildAttached()", Logger.severity.TRACE); // get all the potentially attached grids BoundingBoxD world = myGrid.WorldAABB; MatrixD scale = MatrixD.CreateScale(1.1); BoundingBoxD searchBox = world.Transform(scale); searchBox = searchBox.Translate(world.Center - searchBox.Center); foreach (IMyEntity entity in MyAPIGateway.Entities.GetEntitiesInAABB(ref searchBox)) { IMyCubeGrid grid = entity as IMyCubeGrid; if (grid == null || grid == myGrid) { continue; } AttachedGrids partner = getFor(grid); if (attachedToMe.Contains(partner)) { //log("already attached: " + grid.DisplayName, "buildAttached()", Logger.severity.TRACE); continue; } // check each grid for isAttached log("checking grid: " + grid.DisplayName, "buildAttached()", Logger.severity.TRACE); if (isAttached_piston(partner) || partner.isAttached_piston(this) || isAttached_motor(partner) || partner.isAttached_motor(this) || isAttached_connector(partner) || partner.isAttached_connector(this) || isAttached_landingGear(partner) || partner.isAttached_landingGear(this)) { continue; } } HashSet <AttachedGrids> copy = new HashSet <AttachedGrids>(attachedToMe); foreach (AttachedGrids attached in copy) { //log("building for attached: " + grid.DisplayName, "buildAttached()", Logger.severity.TRACE); attached.buildAttached(buildID); } }
private bool isAttached_motor(AttachedGrids partner) { foreach (IMySlimBlock motorBase in allMotorBases) { MyObjectBuilder_MotorBase builder_base = motorBase.GetObjectBuilder() as MyObjectBuilder_MotorBase; long rotorEntityId = builder_base.RotorEntityId; foreach (IMySlimBlock motorRotor in partner.allMotorRotors) { if (rotorEntityId == motorRotor.FatBlock.EntityId) { log("matched " + myGrid.DisplayName + " : " + motorBase.FatBlock.DefinitionDisplayNameText + " to " + partner.myGrid.DisplayName + " : " + motorRotor.FatBlock.DefinitionDisplayNameText, "isAttached_motor()", Logger.severity.TRACE); tryAddAttached(partner); return(true); } } } return(false); }
/// <summary> /// /// </summary> /// <param name="partner"></param> /// <returns>true iff a new grid was attached</returns> private bool isAttached_piston(AttachedGrids partner) { foreach (IMySlimBlock pistonBase in allPistonBases) { MyObjectBuilder_PistonBase builder_base = pistonBase.GetObjectBuilder() as MyObjectBuilder_PistonBase; long topBlockId = builder_base.TopBlockId; foreach (IMySlimBlock pistonTop in partner.allPistonTops) { if (topBlockId == pistonTop.FatBlock.EntityId) { log("matched " + myGrid.DisplayName + " : " + pistonBase.FatBlock.DefinitionDisplayNameText + " to " + partner.myGrid.DisplayName + " : " + pistonTop.FatBlock.DefinitionDisplayNameText, "isAttached_piston()", Logger.severity.TRACE); tryAddAttached(partner); return(true); } } } return(false); }
private bool isGridAttached(AttachedGrids searchFor, int searchID) { if (searchID == mySearchAttached_ID) { return(false); // already searching } mySearchAttached_ID = searchID; if (attachedToMe.Contains(searchFor)) { return(true); // found it } foreach (AttachedGrids attached in attachedToMe) { if (attached.isGridAttached(searchFor, searchID)) { return(true); // attached through another } } return(false); // not attached }
private bool isAttached_landingGear(AttachedGrids partner) { return(false); }
/// <summary> /// Tests for sendFrom is working and grid attached or in range. Use without range to skip range test. If sendTo is not a block or a grid, will skip grid test. If sendTo is a block, it must be working. /// </summary> /// <param name="sendFrom"></param> /// <param name="sendTo"></param> /// <param name="range"></param> /// <returns></returns> public static bool canSendTo(this IMyCubeBlock sendFrom, IMyEntity sendTo, bool friendsOnly, float range = 0, bool rangeIsSquared = false) { sendFrom.throwIfNull_argument("sendFrom"); sendTo.throwIfNull_argument("sendTo"); if (sendFrom.Closed || !sendFrom.IsWorking) { return(false); } IMyCubeBlock sendToAsBlock = sendTo as IMyCubeBlock; if (sendToAsBlock != null) { if (sendToAsBlock.Closed || !sendToAsBlock.IsWorking) { return(false); } if (friendsOnly && !sendFrom.canConsiderFriendly(sendToAsBlock)) { return(false); } if (AttachedGrids.isGridAttached(sendFrom.CubeGrid, sendToAsBlock.CubeGrid)) { return(true); } if (range > 0) { double distanceSquared = (sendFrom.GetPosition() - sendTo.GetPosition()).LengthSquared(); if (rangeIsSquared) { return(distanceSquared < range); } else { return(distanceSquared < range * range); } } } else { IMyCubeGrid sendToAsGrid = sendTo as IMyCubeGrid; if (sendToAsGrid != null) { if (friendsOnly && !sendFrom.canConsiderFriendly(sendToAsGrid)) { return(false); } if (Rynchodon.AttachedGrids.isGridAttached(sendFrom.CubeGrid, sendToAsGrid)) { return(true); } } // may or may not be grid if (range > 0) { double distance = sendTo.WorldAABB.Distance(sendFrom.GetPosition()); if (rangeIsSquared) { return(distance * distance < range); } else { return(distance < range); } } } return(false); }