/// <summary> /// Is the given player allowed get information or use commands on the grid? /// Player is able to interact with the grid if the player is part of a specific /// block's faction OR the player owns the block /// The block is dependent on the CommandsRequireClassifier setting /// </summary> /// <param name="playerID"></param> /// <param name="grid"></param> /// <returns></returns> public static bool canInteractWith(this IMyCubeGrid grid, long playerID, HullClassifier bestClassifier = null) { IMyCubeBlock blockToCheck; // Get the type of block to check based on settings if (Core.ConquestSettings.getInstance().SimpleOwnership) { if (bestClassifier != null) { blockToCheck = bestClassifier.FatBlock; } else { blockToCheck = grid.getFirstClassifierBlock(); } } else { blockToCheck = grid.getMainCockpit(); } if (blockToCheck != null) { MyRelationsBetweenPlayerAndBlock relationship = blockToCheck.GetUserRelationToOwner(playerID); if (relationship == MyRelationsBetweenPlayerAndBlock.NoOwnership || relationship == MyRelationsBetweenPlayerAndBlock.Enemies) { return(false); } else if (relationship == MyRelationsBetweenPlayerAndBlock.FactionShare || relationship == MyRelationsBetweenPlayerAndBlock.Owner) { return(true); } // Being in a faction doesn't necessarily mean FactionShare, so need to check for faction status else { IMyFactionCollection factions = MyAPIGateway.Session.Factions; IMyFaction blocksFaction = factions.TryGetPlayerFaction(blockToCheck.OwnerId); // Block is either owned by friendly faction or user's faction if (blocksFaction != null) { long owningFactionID = blocksFaction.FactionId; if (owningFactionID == factions.TryGetPlayerFaction(playerID).FactionId) { return(true); } } } } return(false); }
/// <summary> /// Group grids in the CP into subfleets /// </summary> private Dictionary <long, Subfleet> nearbySubfleets() { var foundSubfleets = new Dictionary <long, Subfleet>(); log("Grouping nearby grids into Subfleets.", "nearbySubfleets"); VRageMath.BoundingSphereD bounds = new VRageMath.BoundingSphereD(Position, (double)Radius); List <IMyEntity> entitiesInBounds = MyAPIGateway.Entities.GetEntitiesInSphere(ref bounds); foreach (IMyEntity e in entitiesInBounds) { // Is it a grid? IMyCubeGrid grid = e as IMyCubeGrid; if (grid == null) { continue; } // does it have a GE? GridEnforcer ge = grid.Components.Get <MyGameLogicComponent>() as GridEnforcer; if (ge == null) { log("Failed to retrieve GridEnforcer for grid " + grid.EntityId, "nearbySubfleets", Logger.severity.ERROR); continue; } // Is it classified? if (ge.Class == HullClass.CLASS.UNCLASSIFIED) { continue; } // There are no hooks to check if someone changed factions, // so reevaluate here to make sure info is up to date for fleet groups ge.reevaluateOwnership(); /* * if (ge.Owner.OwnerType == GridOwner.OWNER_TYPE.UNOWNED) { * log("Grid " + grid.EntityId + " is unowned, skipping", * "nearbySubfleets"); * continue; * } */ // We could check here if the grid is supported by its fleet, // or more generally if it's violation any rules // But we should notify players, b/c that could be confusing /* * if (!ge.SupportedByFleet) { * log("Grid " + grid.DisplayName + " is unsupported by its fleet, skipping.", * "getRoundWinner"); * continue; * } */ // Is its Hull Classifier broadcasting far enough? HullClassifier classifier = ge.Classifier; if (classifier == null) { log("Grid has no classifier but was classified", "nearbySubfleets", Logger.severity.ERROR); continue; } IMyCubeBlock fatblock = classifier.FatBlock; if (fatblock == null) { log("Classifier could not be referenced as fatblock", "nearbySubfleets", Logger.severity.ERROR); continue; } if (!fatblock.IsWorking) { log("Classifier not working but grid was classified", "nearbySubfleets", Logger.severity.ERROR); continue; } InGame.IMyBeacon beacon = fatblock as InGame.IMyBeacon; InGame.IMyRadioAntenna antenna = fatblock as InGame.IMyRadioAntenna; if (beacon == null && antenna == null) { log("Classifier not a beacon or antennae, no broadcast radius", "nearbySubfleets", Logger.severity.ERROR); continue; } if (beacon != null && beacon.Radius < VRageMath.Vector3.Distance(Position, grid.GetPosition())) { log("Classifier range too small, skipping", "nearbySubfleets"); // TODO notify pilot continue; } if (antenna != null && antenna.Radius < VRageMath.Vector3.Distance(Position, grid.GetPosition())) { log("Classifier range too small, skipping", "nearbySubfleets"); // TODO notify pilot continue; } // Grid passed all tests! long fleetID = ge.Owner.FleetID; log("Grid '" + ge.Grid.DisplayName + "'passed all tests, including in fleet " + fleetID, "nearbySubfleets"); if (!foundSubfleets.ContainsKey(fleetID)) { foundSubfleets[fleetID] = new Subfleet { ID = fleetID, Enforcers = new List <GridEnforcer>() { ge }, TotalValue = ge.CaptureMultiplier, }; } else { foundSubfleets[fleetID].Enforcers.Add(ge); foundSubfleets[fleetID].TotalValue += ge.CaptureMultiplier; } } return(foundSubfleets); }