private HashSet <long> GetAllOwners() { HashSet <long> owners = new HashSet <long>(); HashSet <IMyEntity> entities = new HashSet <IMyEntity>(); MyAPIGateway.Entities.GetEntities(entities); foreach (IMyEntity entity in entities) { if (!(entity is IMyCubeGrid)) { continue; } IMyCubeGrid grid = (IMyCubeGrid)entity; MyObjectBuilder_CubeGrid gridBuilder = CubeGrids.SafeGetObjectBuilder(grid); if (gridBuilder == null) { continue; } foreach (MyObjectBuilder_CubeBlock block in gridBuilder.CubeBlocks) { if (block.Owner != 0 && !owners.Contains(block.Owner)) { owners.Add(block.Owner); } } } return(owners); }
// admin nobeacon scan public override bool HandleCommand(ulong userId, string[] words) { try { HashSet <IMyEntity> entities = new HashSet <IMyEntity>(); HashSet <IMyEntity> entitiesToConfirm = new HashSet <IMyEntity>(); HashSet <IMyEntity> entitiesConnected = new HashSet <IMyEntity>(); HashSet <IMyEntity> entitiesFound = new HashSet <IMyEntity>(); Wrapper.GameAction(() => { MyAPIGateway.Entities.GetEntities(entities, x => x is IMyCubeGrid); }); foreach (IMyEntity entity in entities) { if (!(entity is IMyCubeGrid)) { continue; } IMyCubeGrid grid = (IMyCubeGrid)entity; MyObjectBuilder_CubeGrid gridBuilder = CubeGrids.SafeGetObjectBuilder(grid); if (gridBuilder == null) { continue; } bool found = false; foreach (MyObjectBuilder_CubeBlock block in gridBuilder.CubeBlocks) { if (block.TypeId == typeof(MyObjectBuilder_Beacon)) { found = true; break; } } if (!found) { entitiesToConfirm.Add(grid); } } CubeGrids.GetGridsUnconnected(entitiesFound, entitiesToConfirm); foreach (IMyEntity entity in entitiesFound) { CubeGridEntity gridEntity = (CubeGridEntity)GameEntityManager.GetEntity(entity.EntityId); Communication.SendPrivateInformation(userId, string.Format("Found entity '{0}' ({1}) at {2} with no beacon.", gridEntity.Name, gridEntity.EntityId, General.Vector3DToString(entity.GetPosition()))); } Communication.SendPrivateInformation(userId, string.Format("Found {0} grids with no beacons", entitiesFound.Count)); } catch (Exception ex) { Logging.WriteLineAndConsole(string.Format("Scan error: {0}", ex.ToString())); } return(true); }
public void Process() { lock (m_items) { if (!m_items.Any()) { return; } for (int r = m_items.Count() - 1; r >= 0; r--) { TimedEntityCleanupItem item = m_items[r]; if (DateTime.Now - item.addedTime > TimeSpan.FromSeconds(item.secondsAfterAdding)) { try { IMyEntity entity = null; Wrapper.GameAction(() => { MyAPIGateway.Entities.TryGetEntityById(item.entityId, out entity); }); if (entity != null) { MyObjectBuilder_CubeGrid gridBuilder = CubeGrids.SafeGetObjectBuilder((IMyCubeGrid)entity); if (gridBuilder == null) { continue; } CubeGridEntity entityToDispose = new CubeGridEntity((MyObjectBuilder_CubeGrid)entity.GetObjectBuilder(), entity); entityToDispose.Dispose(); } else { Logging.WriteLineAndConsole("Entity is null"); } } catch (Exception ex) { Logging.WriteLineAndConsole(string.Format("Dispose Error: {0}", ex.ToString())); } m_items.RemoveAt(r); } } } }
// admin nobeacon scan public override bool HandleCommand(ulong userId, string[] words) { HashSet <IMyEntity> grids = CubeGrids.ScanGrids(userId, words); bool confirm = true; /* * if (words.FirstOrDefault(x => x.ToLower() == "confirm") != null) * { * confirm = true; * } */ int count = 0; foreach (IMyEntity entity in grids) { if (!(entity is IMyCubeGrid)) { continue; } IMyCubeGrid grid = (IMyCubeGrid)entity; MyObjectBuilder_CubeGrid gridBuilder = CubeGrids.SafeGetObjectBuilder(grid); if (confirm) { BaseEntityNetworkManager.BroadcastRemoveEntity(entity, true); } long ownerId = 0; string ownerName = ""; if (CubeGrids.GetBigOwners(gridBuilder).Count > 0) { ownerId = CubeGrids.GetBigOwners(gridBuilder).First(); ownerName = PlayerMap.Instance.GetPlayerItemFromPlayerId(ownerId).Name; } if (confirm) { Logging.WriteLineAndConsole("Cleanup", string.Format("Cleanup Removed Grid - Id: {0} Display: {1} OwnerId: {2} OwnerName: {3}", entity.EntityId, entity.DisplayName, ownerId, ownerName)); } count++; } Communication.SendPrivateInformation(userId, string.Format("Operation deletes {0} grids", count)); return(true); }
private void ExtractCommandFromEntity(IMyEntity entity) { IMyCubeGrid grid = (IMyCubeGrid)entity; MyObjectBuilder_CubeGrid gridBuilder = CubeGrids.SafeGetObjectBuilder(grid); if (gridBuilder == null) { return; } string command = string.Empty; foreach (MyObjectBuilder_CubeBlock block in gridBuilder.CubeBlocks) { MyObjectBuilder_Beacon beacon = block as MyObjectBuilder_Beacon; if (beacon != null) { command = beacon.CustomName; break; } } string player = entity.DisplayName.Replace("CommRelay", string.Empty); long playerId = long.Parse(player); ulong steamId = PlayerMap.Instance.GetSteamIdFromPlayerId(playerId); Wrapper.GameAction(() => { entity.DisplayName = string.Empty; BaseEntityNetworkManager.BroadcastRemoveEntity(entity, false); }); Essentials.Log.Info("COMMAND {1} - {2}: {0}", command, playerId, entity.EntityId); if (!m_processedRelays.Contains(entity.EntityId)) { m_processedRelays.Add(entity.EntityId); Essentials.Instance.HandleChatMessage(steamId, command); } else { Essentials.Log.Info("Ignoring repeat beacon: {0}"); } }
static public void RevealAll() { HashSet <IMyEntity> entities = new HashSet <IMyEntity>(); Wrapper.GameAction(() => { MyAPIGateway.Entities.GetEntities(entities); }); List <MyObjectBuilder_EntityBase> addList = new List <MyObjectBuilder_EntityBase>(); int count = 0; Wrapper.GameAction(() => { foreach (IMyEntity entity in entities) { if (entity.InScene) { continue; } if (!(entity is IMyCubeGrid)) { continue; } MyObjectBuilder_CubeGrid builder = CubeGrids.SafeGetObjectBuilder((IMyCubeGrid)entity); if (builder == null) { continue; } count++; IMyCubeGrid grid = (IMyCubeGrid)entity; long ownerId = 0; string ownerName = ""; if (CubeGrids.GetBigOwners(builder).Count > 0) { ownerId = CubeGrids.GetBigOwners(builder).First(); ownerName = PlayerMap.Instance.GetPlayerItemFromPlayerId(ownerId).Name; } //grid.PersistentFlags = (MyPersistentEntityFlags2.InScene | MyPersistentEntityFlags2.CastShadows); //grid.InScene = true; //grid.CastShadows = true; builder.PersistentFlags = (MyPersistentEntityFlags2.InScene | MyPersistentEntityFlags2.CastShadows); MyAPIGateway.Entities.RemapObjectBuilder(builder); Logging.WriteLineAndConsole("Conceal", string.Format("Force Revealing - Id: {0} -> {4} Display: {1} OwnerId: {2} OwnerName: {3}", entity.EntityId, entity.DisplayName.Replace("\r", "").Replace("\n", ""), ownerId, ownerName, builder.EntityId)); IMyEntity newEntity = MyAPIGateway.Entities.CreateFromObjectBuilder(builder); if (newEntity == null) { Logging.WriteLineAndConsole("Conceal", string.Format("Issue - CreateFromObjectBuilder failed: {0}", newEntity.EntityId)); continue; } BaseEntityNetworkManager.BroadcastRemoveEntity(entity, false); MyAPIGateway.Entities.AddEntity(newEntity, true); addList.Add(newEntity.GetObjectBuilder()); MyAPIGateway.Multiplayer.SendEntitiesCreated(addList); addList.Clear(); } }); Logging.WriteLineAndConsole(string.Format("Revealed {0} grids", count)); }
private static void RevealEntity(KeyValuePair <IMyEntity, string> item) { IMyEntity entity = item.Key; string reason = item.Value; //Wrapper.GameAction(() => //{ MyObjectBuilder_CubeGrid builder = CubeGrids.SafeGetObjectBuilder((IMyCubeGrid)entity); if (builder == null) { return; } IMyCubeGrid grid = (IMyCubeGrid)entity; long ownerId = 0; string ownerName = ""; if (CubeGrids.GetBigOwners(builder).Count > 0) { ownerId = CubeGrids.GetBigOwners(builder).First(); ownerName = PlayerMap.Instance.GetPlayerItemFromPlayerId(ownerId).Name; } /* * entity.InScene = true; * entity.CastShadows = true; * entity.Visible = true; */ builder.PersistentFlags = (MyPersistentEntityFlags2.InScene | MyPersistentEntityFlags2.CastShadows); MyAPIGateway.Entities.RemapObjectBuilder(builder); //builder.EntityId = 0; if (RemovedGrids.Contains(entity.EntityId)) { Logging.WriteLineAndConsole("Conceal", string.Format("Revealing - Id: {0} DUPE FOUND Display: {1} OwnerId: {2} OwnerName: {3} Reason: {4}", entity.EntityId, entity.DisplayName.Replace("\r", "").Replace("\n", ""), ownerId, ownerName, reason)); BaseEntityNetworkManager.BroadcastRemoveEntity(entity, false); } else { if (!PluginSettings.Instance.DynamicConcealServerOnly) { IMyEntity newEntity = MyAPIGateway.Entities.CreateFromObjectBuilder(builder); Logging.WriteLineAndConsole("Conceal", string.Format("Start Revealing - Id: {0} -> {4} Display: {1} OwnerId: {2} OwnerName: {3} Reason: {5}", entity.EntityId, entity.DisplayName.Replace("\r", "").Replace("\n", ""), ownerId, ownerName, newEntity.EntityId, reason)); if (newEntity == null) { Logging.WriteLineAndConsole("Conceal", string.Format("Issue - CreateFromObjectBuilder failed: {0}", newEntity.EntityId)); return; } RemovedGrids.Add(entity.EntityId); BaseEntityNetworkManager.BroadcastRemoveEntity(entity, false); MyAPIGateway.Entities.AddEntity(newEntity, true); /*CC * if (PluginSettings.Instance.DynamicClientConcealEnabled) * { * ClientEntityManagement.AddEntityState(newEntity.EntityId); * } */ builder.EntityId = newEntity.EntityId; List <MyObjectBuilder_EntityBase> addList = new List <MyObjectBuilder_EntityBase>(); addList.Add(newEntity.GetObjectBuilder()); MyAPIGateway.Multiplayer.SendEntitiesCreated(addList); Logging.WriteLineAndConsole("Conceal", string.Format("End Revealing - Id: {0} -> {4} Display: {1} OwnerId: {2} OwnerName: {3} Reason: {5}", entity.EntityId, entity.DisplayName.Replace("\r", "").Replace("\n", ""), ownerId, ownerName, newEntity.EntityId, reason)); } else { Logging.WriteLineAndConsole("Conceal", string.Format("Start Revealing - Id: {0} -> {4} Display: {1} OwnerId: {2} OwnerName: {3} Reason: {4}", entity.EntityId, entity.DisplayName.Replace("\r", "").Replace("\n", ""), ownerId, ownerName, reason)); entity.InScene = true; // Send to users, client will remove if doesn't need - this solves login problem /*CC * if (PluginSettings.Instance.DynamicClientConcealEnabled) * { * ClientEntityManagement.AddEntityState(entity.EntityId); * List<MyObjectBuilder_EntityBase> addList = new List<MyObjectBuilder_EntityBase>(); * addList.Add(entity.GetObjectBuilder()); * MyAPIGateway.Multiplayer.SendEntitiesCreated(addList); * } */ Logging.WriteLineAndConsole("Conceal", string.Format("End Revealing - Id: {0} -> {4} Display: {1} OwnerId: {2} OwnerName: {3} Reason: {4}", entity.EntityId, entity.DisplayName.Replace("\r", "").Replace("\n", ""), ownerId, ownerName, reason)); } } //}); }
private static void ConcealEntity(IMyEntity entity) { int pos = 0; try { if (!entity.InScene) { return; } MyObjectBuilder_CubeGrid builder = CubeGrids.SafeGetObjectBuilder((IMyCubeGrid)entity); if (builder == null) { return; } pos = 1; IMyCubeGrid grid = (IMyCubeGrid)entity; long ownerId = 0; string ownerName = ""; if (CubeGrids.GetOwner(builder, out ownerId)) { //ownerId = grid.BigOwners.First(); ownerName = PlayerMap.Instance.GetPlayerItemFromPlayerId(ownerId).Name; } pos = 2; if (entity.Physics != null) { entity.Physics.LinearVelocity = Vector3.Zero; entity.Physics.AngularVelocity = Vector3.Zero; } /* * entity.InScene = false; * entity.CastShadows = false; * entity.Visible = false; */ builder.PersistentFlags = MyPersistentEntityFlags2.None; MyAPIGateway.Entities.RemapObjectBuilder(builder); pos = 3; if (RemovedGrids.Contains(entity.EntityId)) { Logging.WriteLineAndConsole("Conceal", string.Format("Concealing - Id: {0} DUPE FOUND - Display: {1} OwnerId: {2} OwnerName: {3}", entity.EntityId, entity.DisplayName, ownerId, ownerName, builder.EntityId)); BaseEntityNetworkManager.BroadcastRemoveEntity(entity, false); } else { if (!PluginSettings.Instance.DynamicConcealServerOnly) { /* * if (PluginSettings.Instance.DynamicBlockManagementEnabled) * { * bool enable = false; * lock (BlockManagement.Instance.GridDisabled) * { * if(BlockManagement.Instance.GridDisabled.Contains(entity.EntityId)) * enable = true; * } * * if(enable) * BlockManagement.Instance.EnableGrid((IMyCubeGrid)entity); * } */ IMyEntity newEntity = MyAPIGateway.Entities.CreateFromObjectBuilder(builder); Logging.WriteLineAndConsole("Conceal", string.Format("Start Concealing - Id: {0} -> {4} Display: {1} OwnerId: {2} OwnerName: {3}", entity.EntityId, entity.DisplayName, ownerId, ownerName, newEntity.EntityId)); if (newEntity == null) { Logging.WriteLineAndConsole("Conceal", string.Format("Issue - CreateFromObjectBuilder failed: {0}", newEntity.EntityId)); return; } RemovedGrids.Add(entity.EntityId); BaseEntityNetworkManager.BroadcastRemoveEntity(entity, false); MyAPIGateway.Entities.AddEntity(newEntity, false); Logging.WriteLineAndConsole("Conceal", string.Format("End Concealing - Id: {0} -> {4} Display: {1} OwnerId: {2} OwnerName: {3}", entity.EntityId, entity.DisplayName, ownerId, ownerName, newEntity.EntityId)); } else { Logging.WriteLineAndConsole("Conceal", string.Format("Start Concealing - Id: {0} -> {4} Display: {1} OwnerId: {2} OwnerName: {3}", entity.EntityId, entity.DisplayName, ownerId, ownerName, builder.EntityId)); entity.InScene = false; Logging.WriteLineAndConsole("Conceal", string.Format("End Concealing - Id: {0} -> {4} Display: {1} OwnerId: {2} OwnerName: {3}", entity.EntityId, entity.DisplayName, ownerId, ownerName, builder.EntityId)); } } } catch (Exception ex) { Logging.WriteLineAndConsole(string.Format("ConcealEntity({1}): {0}", ex.ToString(), pos)); } }
// admin deletearea x y z radius public override bool HandleCommand(ulong userId, string command) { string[] words = command.Split(' '); if (words.Length > 3) { return(false); } if (!words.Any()) { Communication.SendPrivateInformation(userId, GetHelp()); return(true); } int days = -1; if (!int.TryParse(words[0], out days) || days < 0) { Communication.SendPrivateInformation(userId, string.Format("Invalid argument. Days argument must be an integer that is 0 or greater.")); return(true); } // Just assume that anything after the days is going to "ignorenologin" bool removeNoLoginInformation = true; bool removeOwnerless = true; if (words.Count() > 1) { foreach (string word in words) { if (word.ToLower() == "ignorenologin") { removeNoLoginInformation = false; } if (word.ToLower() == "ignoreownerless") { removeOwnerless = false; } } } Communication.SendPrivateInformation(userId, string.Format("Scanning for grids with owners that haven't logged in {0} days. (Must Have Login Info={1})", days, removeNoLoginInformation)); HashSet <IMyEntity> entities = new HashSet <IMyEntity>(); Wrapper.GameAction(() => { MyAPIGateway.Entities.GetEntities(entities, x => x is IMyCubeGrid); }); HashSet <IMyEntity> entitiesFound = new HashSet <IMyEntity>(); foreach (IMyEntity entity in entities) { if (!(entity is IMyCubeGrid)) { continue; } IMyCubeGrid grid = (IMyCubeGrid)entity; CubeGridEntity gridEntity = (CubeGridEntity)GameEntityManager.GetEntity(grid.EntityId); MyObjectBuilder_CubeGrid gridBuilder = CubeGrids.SafeGetObjectBuilder(grid); if (gridBuilder == null) { continue; } // This entity is protected by whitelist if (PluginSettings.Instance.LoginEntityWhitelist.Length > 0 && PluginSettings.Instance.LoginEntityWhitelist.Contains(grid.EntityId.ToString())) { continue; } if (CubeGrids.GetAllOwners(gridBuilder).Count < 1 && removeOwnerless) { Communication.SendPrivateInformation(userId, string.Format("Found entity '{0}' ({1}) not owned by anyone.", gridEntity.Name, entity.EntityId)); entitiesFound.Add(entity); continue; } foreach (long player in CubeGrids.GetBigOwners(gridBuilder)) { // This playerId is protected by whitelist if (PluginSettings.Instance.LoginPlayerIdWhitelist.Length > 0 && PluginSettings.Instance.LoginPlayerIdWhitelist.Contains(player.ToString())) { continue; } MyObjectBuilder_Checkpoint.PlayerItem checkItem = PlayerMap.Instance.GetPlayerItemFromPlayerId(player); if (checkItem.IsDead || checkItem.Name == "") { Communication.SendPrivateInformation(userId, string.Format("Found entity '{0}' ({1}) owned by dead player - ID: {2}", gridEntity.Name, entity.EntityId, player)); entitiesFound.Add(entity); continue; } PlayerItem item = Players.Instance.GetPlayerById(player); if (item == null) { if (removeNoLoginInformation) { Communication.SendPrivateInformation(userId, string.Format("Found entity '{0}' ({1}) owned by a player with no login info: {2}", gridEntity.Name, entity.EntityId, checkItem.Name)); entitiesFound.Add(entity); } } else if (item.LastLogin < DateTime.Now.AddDays(days * -1)) { Communication.SendPrivateInformation(userId, string.Format("Found entity '{0}' ({1}) owned by inactive player: {2}", gridEntity.Name, entity.EntityId, PlayerMap.Instance.GetPlayerItemFromPlayerId(player).Name)); entitiesFound.Add(entity); } } } Communication.SendPrivateInformation(userId, string.Format("Found {0} grids owned by inactive users", entitiesFound.Count)); foreach (IMyEntity entity in entitiesFound) { if (!(entity is IMyCubeGrid)) { continue; } CubeGridEntity gridEntity = new CubeGridEntity((MyObjectBuilder_CubeGrid)entity.GetObjectBuilder(), entity); gridEntity.Dispose(); } Communication.SendPrivateInformation(userId, string.Format("Removed {0} grids owned by inactive users", entitiesFound.Count)); return(true); }
// admin deletearea x y z radius public override bool HandleCommand(ulong userId, string[] words) { HashSet <IMyEntity> entities = new HashSet <IMyEntity>(); HashSet <IMyEntity> entitiesToConfirm = new HashSet <IMyEntity>(); HashSet <IMyEntity> entitiesConnected = new HashSet <IMyEntity>(); HashSet <IMyEntity> entitiesFound = new HashSet <IMyEntity>(); Wrapper.GameAction(() => { MyAPIGateway.Entities.GetEntities(entities, x => x is IMyCubeGrid); }); foreach (IMyEntity entity in entities) { if (!(entity is IMyCubeGrid)) { continue; } IMyCubeGrid grid = (IMyCubeGrid)entity; MyObjectBuilder_CubeGrid gridBuilder = CubeGrids.SafeGetObjectBuilder(grid); if (gridBuilder == null) { continue; } bool found = false; foreach (MyObjectBuilder_CubeBlock block in gridBuilder.CubeBlocks) { if (block.TypeId == typeof(MyObjectBuilder_Beacon)) { found = true; break; } } if (!found) { entitiesToConfirm.Add(grid); } } CubeGrids.GetGridsUnconnected(entitiesFound, entitiesToConfirm); foreach (IMyEntity entity in entitiesFound) { CubeGridEntity gridEntity = (CubeGridEntity)GameEntityManager.GetEntity(entity.EntityId); if (gridEntity == null) { Log.Info("A found entity gridEntity was null!"); continue; } Communication.SendPrivateInformation(userId, string.Format("Found entity '{0}' ({1}) at {2} with no beacon.", gridEntity.Name, entity.EntityId, General.Vector3DToString(entity.GetPosition()))); } for (int r = entitiesFound.Count - 1; r >= 0; r--) { //MyAPIGateway.Entities.RemoveEntity(entity); IMyEntity entity = entitiesFound.ElementAt(r); CubeGridEntity gridEntity = new CubeGridEntity((MyObjectBuilder_CubeGrid)entity.GetObjectBuilder(), entity); gridEntity.Dispose(); } Communication.SendPrivateInformation(userId, string.Format("Removed {0} grids with no beacons", entitiesFound.Count)); return(true); }
public override bool HandleCommand(ulong userId, string[] words) { if (!PluginSettings.Instance.DockingEnabled) { return(false); } if (words.Length < 1) { Communication.SendPrivateInformation(userId, GetHelp()); return(true); } if (m_docking) { Communication.SendPrivateInformation(userId, "Server is busy"); return(true); } m_docking = true; try { string pylonName = string.Join(" ", words); /* * int timeLeft; * if (Entity.CheckCoolDown(pylonName, out timeLeft)) * { * Communication.Message(String.Format("The docking zone '{0}' is on cooldown. Please wait a {1} seconds before trying to dock/undock again.", pylonName, Math.Max(0, timeLeft))); * return; * } */ if (PlayerMap.Instance.GetPlayerIdsFromSteamId(userId).Count < 1) { Communication.SendPrivateInformation(userId, $"Unable to find player Id: {userId}"); return(true); } long playerId = PlayerMap.Instance.GetPlayerIdsFromSteamId(userId).First(); Dictionary <string, List <IMyCubeBlock> > testList; List <IMyCubeBlock> beaconList; DockingZone.FindByName(pylonName, out testList, out beaconList, playerId); if (beaconList.Count == 4) { // Check ownership foreach (IMyCubeBlock entityBlock in beaconList) { IMyTerminalBlock terminal = (IMyTerminalBlock)entityBlock; if (!terminal.HasPlayerAccess(playerId)) { Communication.SendPrivateInformation(userId, $"You do not have permission to use '{pylonName}'. You must either own all the beacons or they must be shared with faction."); return(true); } } // Check for bounding box intsection of other docking zones int intersectElement = 0; if (Entity.CheckForIntersection(testList, beaconList, out intersectElement)) { Communication.SendPrivateInformation(userId, $"The docking zone '{pylonName}' intersects with docking zone '{testList.ElementAt( intersectElement ).Key}'. Make sure you place your docking zones so they don't overlap."); return(true); } // Check if ship already docked in this zone IMyCubeBlock e = beaconList[0]; IMyCubeGrid parent = (IMyCubeGrid)e.Parent; long[] beaconListIds = beaconList.Select(b => b.EntityId).ToArray(); long ownerId = beaconList.First().OwnerId; List <DockingItem> checkItems = Docking.Instance.Find(d => d.PlayerId == ownerId && d.TargetEntityId == parent.EntityId && d.DockingBeaconIds.Intersect(beaconListIds).Count() == 4); if (checkItems.Count >= PluginSettings.Instance.DockingShipsPerZone) { Communication.SendPrivateInformation(userId, $"Docking zone '{pylonName}' already contains the maximum capacity of ships."); return(true); } // Figure out center of docking area, and other distance information double maxDistance = 99; Vector3D vPos = new Vector3D(0, 0, 0); foreach (IMyCubeBlock b in beaconList) { Vector3D beaconPos = Entity.GetBlockEntityPosition(b); vPos += beaconPos; } vPos = vPos / 4; foreach (IMyCubeBlock b in beaconList) { Vector3D beaconPos = Entity.GetBlockEntityPosition(b); maxDistance = Math.Min(maxDistance, Vector3D.Distance(vPos, beaconPos)); } // Find ship in docking area IMyCubeGrid dockingEntity = null; HashSet <IMyEntity> cubeGrids = new HashSet <IMyEntity>(); Wrapper.GameAction(() => { MyAPIGateway.Entities.GetEntities(cubeGrids, f => f is IMyCubeGrid); }); foreach (IMyCubeGrid gridCheck in cubeGrids) { if (gridCheck.IsStatic || gridCheck == parent) { continue; } double distance = Vector3D.Distance(gridCheck.GetPosition(), vPos); if (distance < maxDistance) { dockingEntity = gridCheck; break; } } // Figure out if the ship fits in docking area, and then save ship if (dockingEntity != null) { // Get bounding box of both the docking zone and docking ship OrientedBoundingBoxD targetBounding = Entity.GetBoundingBox(beaconList); OrientedBoundingBoxD dockingBounding = Entity.GetBoundingBox(dockingEntity); // Make sure the docking zone contains the docking ship. If they intersect or are disjointed, then fail if (!Entity.GreaterThan(dockingBounding.HalfExtent * 2, targetBounding.HalfExtent * 2)) { Communication.SendPrivateInformation(userId, $"The ship '{dockingEntity.DisplayName}' is too large for it's carrier. The ship's bounding box must fit inside the docking zone bounding box!"); return(true); } if (targetBounding.Contains(ref dockingBounding) != ContainmentType.Contains) { Communication.SendPrivateInformation(userId, $"The ship '{dockingEntity.DisplayName}' is not fully inside the docking zone '{pylonName}'. Make sure the ship is fully contained inside the docking zone"); return(true); } // Calculate the mass and ensure the docking ship is less than half the mass of the dock float parentMass = Entity.CalculateMass(parent); float dockingMass = Entity.CalculateMass(dockingEntity); if (dockingMass > parentMass) { Communication.SendPrivateInformation(userId, $"The ship you're trying to dock is too heavy for it's carrier. The ship mass must be less than half the large ship / stations mass! (DM={dockingMass}kg CM={parentMass}kg)"); return(true); } // Check to see if the ship is piloted, if it is, error out. // TODO: Check to see if we can get a real time copy of this entity? List <IMySlimBlock> blocks = new List <IMySlimBlock>(); dockingEntity.GetBlocks(blocks, x => x.FatBlock is MyCockpit); foreach (IMySlimBlock slim in blocks) { //MyObjectBuilder_Cockpit c = (MyObjectBuilder_Cockpit)slim.FatBlock.GetObjectBuilderCubeBlock(); var c = (MyShipController)slim.FatBlock; if (c.Pilot != null) { Communication.SendPrivateInformation(userId, $"Ship in docking zone '{pylonName}' has a pilot! Please exit the ship before trying to dock. (Sometimes this can lag a bit. Wait 10 seconds and try again)"); return(true); } } // Save position and rotation information. Some fun stuff here. // Get our dock rotation as a quaternion Quaternion saveQuat = Quaternion.CreateFromRotationMatrix(parent.WorldMatrix.GetOrientation()); // Transform docked ship's local position by inverse of the the parent (unwinds parent) and save it for when we undock Vector3D savePos = Vector3D.Transform(dockingEntity.GetPosition() - parent.GetPosition(), Quaternion.Inverse(saveQuat)); // Get local rotation of dock ship, and save it for when we undock saveQuat = Quaternion.Inverse(saveQuat) * Quaternion.CreateFromRotationMatrix(dockingEntity.WorldMatrix.GetOrientation()); // Save ship to file and remove FileInfo info = new FileInfo(Path.Combine(Essentials.PluginPath, "Docking", $"docked_{ownerId}_{parent.EntityId}_{dockingEntity.EntityId}.sbc")); if (!Directory.Exists(info.DirectoryName)) { Directory.CreateDirectory(info.DirectoryName); } //CubeGridEntity dockingGrid = new CubeGridEntity((MyObjectBuilder_CubeGrid)dockingEntity.GetObjectBuilder(), dockingEntity); MyObjectBuilder_CubeGrid gridBuilder = CubeGrids.SafeGetObjectBuilder(dockingEntity); if (gridBuilder == null) { Communication.SendPrivateInformation(userId, $"Failed to load entity for export: {dockingEntity.DisplayName}"); return(true); } // Save item DockingItem dockItem = new DockingItem { DockedEntityId = dockingEntity.EntityId, TargetEntityId = parent.EntityId, PlayerId = ownerId, DockingBeaconIds = beaconList.Select(s => s.EntityId).ToArray( ), DockedName = dockingEntity.DisplayName, SavePos = savePos, SaveQuat = saveQuat }; Docking.Instance.Add(dockItem); // Serialize and save ship to file MyObjectBuilderSerializer.SerializeXML(info.FullName, false, gridBuilder); Wrapper.BeginGameAction(() => dockingEntity.Close( )); Communication.SendPrivateInformation(userId, $"Docked ship '{dockItem.DockedName}' in docking zone '{pylonName}'."); Log.Info("Docked ship \"{0}\" in docking zone \"{1}\". Saved to {2}", dockItem.DockedName, pylonName, info.FullName); /* * // Add a cool down * DockingCooldownItem cItem = new DockingCooldownItem(); * cItem.name = pylonName; * cItem.startTime = DateTime.Now; * PluginDocking.CooldownList.Add(cItem); */ } else { Communication.SendPrivateInformation(userId, $"No ships in docking zone '{pylonName}'."); } } else if (beaconList.Count > 4) { Communication.SendPrivateInformation(userId, $"Too many beacons with the name or another zone with the name '{pylonName}'. Place only 4 beacons to create a zone or try a different zone name."); } else { Communication.SendPrivateInformation(userId, string.Format("Can not locate docking zone '{0}'. There must be 4 beacons with the name '{0}' to create a docking zone. Beacons must be fully built!", pylonName)); } return(true); } catch (SecurityException ex) { Log.Error("Can't access docked ship file.", ex); return(false); } catch (UnauthorizedAccessException ex) { Log.Error("Can't access docked ship file.", ex); return(false); } catch (DirectoryNotFoundException ex) { Log.Error("Directory does not exist", ex); return(false); } catch (IOException ex) { Log.Error(ex); return(false); } finally { m_docking = false; } }
public override void Handle() { if (!PluginSettings.Instance.NewUserTransportEnabled) { return; } if (!m_init) { m_init = true; Init(); } if (!m_ready) { return; } if (MyAPIGateway.Players == null) { return; } List <IMyPlayer> players = new List <IMyPlayer>(); bool result = false; // Wrapper.GameAction(() => // { try { MyAPIGateway.Players.GetPlayers(players, null); result = true; } catch (Exception ex) { Logging.WriteLineAndConsole(string.Format("Transport(): Unable to get player list: {0}", ex.ToString())); } // }); if (!result) { return; } lock (m_newUserList) { for (int r = m_newUserList.Count - 1; r >= 0; r--) { ulong steamId = m_newUserList[r]; IMyPlayer player = players.FirstOrDefault(x => x.SteamUserId == steamId && x.Controller != null && x.Controller.ControlledEntity != null); if (player != null) { Logging.WriteLineAndConsole(string.Format("Player entered game, starting movement.")); m_newUserList.RemoveAt(r); // In Game IMyEntity playerEntity = player.Controller.ControlledEntity.Entity; // Player spawned in space suit, ug. if (!(playerEntity.GetTopMostParent() is IMyCubeGrid)) { continue; } IMyEntity entity = playerEntity.GetTopMostParent(); MyObjectBuilder_CubeGrid cubeGrid = CubeGrids.SafeGetObjectBuilder((IMyCubeGrid)entity); if (cubeGrid == null) { continue; } Vector3D validPosition = Vector3D.Zero; Vector3D asteroidPosition = Vector3D.Zero; if (PluginSettings.Instance.NewUserTransportSpawnType == NewUserTransportSpawnPoint.Asteroids) { FindViableAsteroid(out validPosition, out asteroidPosition); } else if (PluginSettings.Instance.NewUserTransportSpawnType == NewUserTransportSpawnPoint.Origin) { validPosition = MathUtility.RandomPositionFromPoint(Vector3D.Zero, PluginSettings.Instance.NewUserTransportDistance); } if (validPosition == Vector3D.Zero) { Logging.WriteLineAndConsole("Could not find a valid asteroid to drop off a new user."); continue; } Logging.WriteLineAndConsole(string.Format("Attempting to move user to: {0}", General.Vector3DToString(validPosition))); Wrapper.GameAction(() => { if (player.Controller != null && player.Controller.ControlledEntity != null) { player.Controller.ControlledEntity.Use(); } }); Thread.Sleep(100); cubeGrid.PositionAndOrientation = new MyPositionAndOrientation(validPosition, Vector3.Forward, Vector3.Up); List <MyObjectBuilder_EntityBase> list = new List <MyObjectBuilder_EntityBase>(); list.Add(cubeGrid); IMyEntity newEntity = null; Wrapper.GameAction(() => { BaseEntityNetworkManager.BroadcastRemoveEntity(entity); MyAPIGateway.Entities.RemapObjectBuilder(cubeGrid); newEntity = MyAPIGateway.Entities.CreateFromObjectBuilderAndAdd(cubeGrid); MyAPIGateway.Multiplayer.SendEntitiesCreated(list); }); /* * CubeGridEntity gridEntity = new CubeGridEntity(cubeGrid); * gridEntity.PositionAndOrientation = CubeGrids.CreatePositionAndOrientation(validPosition, asteroidPosition); * SectorObjectManager.Instance.AddEntity(gridEntity); */ /* * Wrapper.GameAction(() => * { * MyAPIGateway.Entities.CreateFromObjectBuilderAndAdd(cubeGrid); * }); */ //Communication.SendPrivateInformation(steamId, string.Format("Welcome {0}. We are moving you closer to an asteroid ... please stand by ...", PlayerMap.Instance.GetPlayerNameFromSteamId(steamId))); //CubeGridEntity grid = new CubeGridEntity((MyObjectBuilder_CubeGrid)entity.GetObjectBuilder(), entity); //if (!CubeGrids.WaitForLoadingEntity(grid)) // continue; /* * foreach(CubeBlockEntity block in grid.CubeBlocks) * { * if(block is CockpitEntity) * { * block.IntegrityPercent = 0.1f; * Logging.WriteLineAndConsole(string.Format("Removing User From Cockpit: {0}", steamId)); * } * } */ /* * * // Wrapper.GameAction(() => * // { * // This should boot them out of their ship: it does not, it kills them :( * // MyAPIGateway.Entities.RemoveEntity(entity); * MyAPIGateway.Entities.RemapObjectBuilder(cubeGrid); * // }); * * CubeGridEntity gridEntity = new CubeGridEntity(cubeGrid); * gridEntity.PositionAndOrientation = CubeGrids.CreatePositionAndOrientation(validPosition, asteroidPosition); * SectorObjectManager.Instance.AddEntity(gridEntity); * //Communication.SendPrivateInformation(steamId, string.Format("You have been moved! You should be within {0} meters of an asteroid.", PluginSettings.Instance.NewUserTransportDistance)); */ } } } base.Handle(); }
public override bool HandleCommand(ulong userId, string[] words) { int page = 1; bool dialog = false; if (words.Length > 0) { if (words[0] == "dialog") { dialog = true; } int.TryParse(words[0], out page); if (page < 1) { page = 1; } } if (PlayerMap.Instance.GetPlayerIdsFromSteamId(userId).Count < 1 && userId != 0) { Communication.SendPrivateInformation(userId, "Error occurred while processing this command. (1)"); return(true); } long playerId = 0; if (PlayerMap.Instance.GetPlayerIdsFromSteamId(userId).Count > 0) { playerId = PlayerMap.Instance.GetPlayerIdsFromSteamId(userId).First(); } HashSet <IMyEntity> entities = new HashSet <IMyEntity>(); List <IMyPlayer> players = new List <IMyPlayer>(); Wrapper.GameAction(() => { MyAPIGateway.Entities.GetEntities(entities, x => x is IMyCubeGrid); MyAPIGateway.Players.GetPlayers(players); }); IMyPlayer player = players.FirstOrDefault(x => x.SteamUserId == userId); string result = ""; int count = 0; foreach (IMyEntity entity in entities) { IMyCubeGrid grid = (IMyCubeGrid)entity; MyObjectBuilder_CubeGrid gridBuilder = CubeGrids.SafeGetObjectBuilder(grid); if (grid == null) { continue; } if (CubeGrids.GetAllOwners(gridBuilder).Contains(playerId)) { if (result != "") { result += "\r\n"; } if (CubeGrids.IsFullOwner(gridBuilder, playerId, player) && !dialog) { result += string.Format("Grid '{0}' at {2}", grid.DisplayName, grid.EntityId, ShowCoordinates(grid.GetPosition())); } else if (CubeGrids.IsFullOwner(gridBuilder, playerId, player) && dialog) { result += string.Format("{0} - {1} - {2}bl - {3}", grid.DisplayName, ShowCoordinates(grid.GetPosition()), gridBuilder.CubeBlocks.Count, gridBuilder.GridSizeEnum); } else { result += string.Format("Grid '{0}'", grid.DisplayName, grid.EntityId); } count++; } } if (dialog) { Communication.SendClientMessage(userId, string.Format("/dialog \"{0}\" \"{1}\" \"{2}\" \"{3}\" \"{4}\"", "User Grid List", "Ships / Stations you ", "own:", result.Replace("\r\n", "|"), "OK")); return(true); } string[] resultLines = result.Split(new string[] { "\r\n" }, StringSplitOptions.None); int pages = ((resultLines.Length - 1) / 6) + 1; if (page > pages) { page = pages; } string output = ""; for (int r = ((page - 1) * 6); r < resultLines.Length && r < ((page) * 6); r++) { string line = resultLines[r]; if (output != "") { output += "\r\n"; } output += line; } Communication.SendPrivateInformation(userId, output); Communication.SendPrivateInformation(userId, string.Format("Displaying page {0} of {1} - {2} grids", page, pages, count)); return(true); }
static public void RevealAll( ) { HashSet <IMyEntity> entities = new HashSet <IMyEntity>( ); Wrapper.GameAction(() => { MyAPIGateway.Entities.GetEntities(entities); }); List <MyObjectBuilder_EntityBase> addList = new List <MyObjectBuilder_EntityBase>( ); int count = 0; Wrapper.GameAction(() => { foreach (IMyEntity entity in entities) { if (entity.InScene) { continue; } if (!(entity is IMyCubeGrid)) { continue; } MyObjectBuilder_CubeGrid builder = CubeGrids.SafeGetObjectBuilder((IMyCubeGrid)entity); if (builder == null) { continue; } count++; IMyCubeGrid grid = (IMyCubeGrid)entity; long ownerId = 0; string ownerName = ""; if (CubeGrids.GetBigOwners(builder).Count > 0) { ownerId = CubeGrids.GetBigOwners(builder).First( ); ownerName = PlayerMap.Instance.GetPlayerItemFromPlayerId(ownerId).Name; } //grid.PersistentFlags = (MyPersistentEntityFlags2.InScene | MyPersistentEntityFlags2.CastShadows); //grid.InScene = true; //grid.CastShadows = true; builder.PersistentFlags = (MyPersistentEntityFlags2.InScene | MyPersistentEntityFlags2.CastShadows); MyAPIGateway.Entities.RemapObjectBuilder(builder); if (PluginSettings.Instance.DynamicShowMessages) { Essentials.Log.Info("Force Revealing - Id: {0} -> {4} Display: {1} OwnerId: {2} OwnerName: {3}", entity.EntityId, entity.DisplayName.Replace("\r", "").Replace("\n", ""), ownerId, ownerName, builder.EntityId); } IMyEntity newEntity = MyAPIGateway.Entities.CreateFromObjectBuilder(builder); if (newEntity == null) { Essentials.Log.Warn("CreateFromObjectBuilder failed: {0}", builder.EntityId); continue; } //these methods no longer exist. //KEEEEEEEEN! //BaseEntityNetworkManager.BroadcastRemoveEntity( entity, false ); /* * MyAPIGateway.Entities.AddEntity( newEntity ); * addList.Add( newEntity.GetObjectBuilder( ) ); * MyAPIGateway.Multiplayer.SendEntitiesCreated( addList ); * addList.Clear( ); */ MyAPIGateway.Entities.CreateFromObjectBuilderAndAdd(newEntity.GetObjectBuilder()); } }); if (PluginSettings.Instance.DynamicShowMessages) { Essentials.Log.Info("Revealed {0} grids", count); } }
// admin nobeacon scan public override bool HandleCommand(ulong userId, string[] words) { if (words.Count() != 2) { Communication.SendPrivateInformation(userId, GetHelp()); return(true); } string blockType = words[0].ToLower(); int blockCount = 0; if (!int.TryParse(words[1], out blockCount)) { Communication.SendPrivateInformation(userId, string.Format("Invalid block count: {0}", words[1])); return(true); } blockCount = Math.Max(blockCount, 1); Communication.SendPrivateInformation(userId, string.Format("Looking for grids that contain more than {0} of type {1}", blockCount, blockType)); HashSet <IMyEntity> entities = new HashSet <IMyEntity>(); Wrapper.GameAction(() => { MyAPIGateway.Entities.GetEntities(entities, x => x is IMyCubeGrid); }); HashSet <IMyEntity> entitiesToConfirm = new HashSet <IMyEntity>(); HashSet <IMyEntity> entitiesUnconnected = new HashSet <IMyEntity>(); HashSet <IMyEntity> entitiesFound = new HashSet <IMyEntity>(); foreach (IMyEntity entity in entities) { if (!(entity is IMyCubeGrid)) { continue; } IMyCubeGrid grid = (IMyCubeGrid)entity; MyObjectBuilder_CubeGrid gridBuilder = CubeGrids.SafeGetObjectBuilder(grid); if (gridBuilder == null) { continue; } if (PluginSettings.Instance.LoginEntityWhitelist.Contains(entity.EntityId.ToString())) { continue; } entitiesToConfirm.Add(entity); } CubeGrids.GetGridsUnconnected(entitiesUnconnected, entitiesToConfirm); foreach (IMyEntity entity in entitiesUnconnected) { IMyCubeGrid grid = (IMyCubeGrid)entity; MyObjectBuilder_CubeGrid gridBuilder = CubeGrids.SafeGetObjectBuilder((IMyCubeGrid)entity); if (gridBuilder == null) { continue; } int count = 0; foreach (MyObjectBuilder_CubeBlock block in gridBuilder.CubeBlocks) { if (block.GetId().SubtypeName.ToLower().Contains(blockType)) { count++; } } if (count >= blockCount) { Communication.SendPrivateInformation(userId, string.Format("Found grid '{0}' ({1}) owned by '{5}' which has more than {3} blocks of type {4}. BlockCount={2}", entity.DisplayName, entity.EntityId, ((MyObjectBuilder_CubeGrid)entity.GetObjectBuilder()).CubeBlocks.Count, blockCount, blockType, grid.BigOwners.Count > 0 ? PlayerMap.Instance.GetPlayerItemFromPlayerId(grid.BigOwners.First()).Name : "No one")); entitiesFound.Add(entity); continue; } } /* * foreach(IMyEntity entity in entitiesFound) * { * IMyCubeGrid grid = (IMyCubeGrid)entity; * } */ Communication.SendPrivateInformation(userId, string.Format("Found {0} grids considered to be overlimit", entitiesFound.Count)); return(true); }
public override bool HandleCommand(ulong userId, string[] words) { bool force = words.FirstOrDefault(x => x.ToLower() == "force") != null; HashSet <IMyEntity> entities = new HashSet <IMyEntity>(); Wrapper.GameAction(() => MyAPIGateway.Entities.GetEntities(entities)); List <MyObjectBuilder_EntityBase> addList = new List <MyObjectBuilder_EntityBase>(); int count = 0; Wrapper.GameAction(() => { foreach (IMyEntity entity in entities) { if (entity.InScene) { continue; } if (!(entity is IMyCubeGrid)) { continue; } MyObjectBuilder_CubeGrid builder = CubeGrids.SafeGetObjectBuilder((IMyCubeGrid)entity); if (builder == null) { continue; } count++; if (!force) { continue; } IMyCubeGrid grid = (IMyCubeGrid)entity; long ownerId = 0; string ownerName = ""; if (grid.BigOwners.Count > 0) { ownerId = grid.BigOwners.First(); ownerName = PlayerMap.Instance.GetPlayerItemFromPlayerId(ownerId).Name; } grid.PersistentFlags = (MyPersistentEntityFlags2.InScene | MyPersistentEntityFlags2.CastShadows); grid.InScene = true; grid.CastShadows = true; builder.PersistentFlags = (MyPersistentEntityFlags2.InScene | MyPersistentEntityFlags2.CastShadows); MyAPIGateway.Entities.RemapObjectBuilder(builder); Log.Info("Conceal", string.Format("Force Revealing - Id: {0} -> {4} Display: {1} OwnerId: {2} OwnerName: {3}", entity.EntityId, entity.DisplayName.Replace("\r", "").Replace("\n", ""), ownerId, ownerName, builder.EntityId)); /* * entity.InScene = true; * entity.CastShadows = true; * entity.Visible = true; */ //CubeGridEntity newEntity = new CubeGridEntity(builder); //SectorObjectManager.Instance.AddEntity(newEntity); BaseEntityNetworkManager.BroadcastRemoveEntity(entity); MyAPIGateway.Entities.CreateFromObjectBuilderAndAdd(builder); addList.Add(builder); MyAPIGateway.Multiplayer.SendEntitiesCreated(addList); addList.Clear(); } }); Log.Info(!force ? string.Format("Command would Reveal {0} grids. Type /admin reveal force to reveal them.", count) : string.Format("Command Revealed {0} grids", count)); return(true); }
public override bool HandleCommand(ulong userId, string[] words) { bool force = words.FirstOrDefault(x => x.ToLower( ) == "force") != null; bool now = false; if (words.Count( ) > 1 && words[1] == "now") { now = true; } if (force && !now) { EntityManagement.RevealAll( ); } else { HashSet <IMyEntity> entities = new HashSet <IMyEntity>( ); Wrapper.GameAction(() => MyAPIGateway.Entities.GetEntities(entities)); List <MyObjectBuilder_EntityBase> addList = new List <MyObjectBuilder_EntityBase>( ); int count = 0; if (!now) { Wrapper.GameAction(() => { foreach (IMyEntity entity in entities) { if (entity.InScene) { continue; } if (!(entity is IMyCubeGrid)) { continue; } MyObjectBuilder_CubeGrid builder = CubeGrids.SafeGetObjectBuilder((IMyCubeGrid)entity); if (builder == null) { continue; } //if ( now ) // EntityManagement.RevealEntity( new KeyValuePair<IMyEntity, string>( entity, "Immediate force reveal" ) ); count++; } }); } if (now) { Wrapper.GameAction(() => { foreach (IMyEntity entity in entities) { if (entity.InScene) { continue; } if (!(entity is IMyCubeGrid)) { continue; } MyObjectBuilder_CubeGrid builder = CubeGrids.SafeGetObjectBuilder((IMyCubeGrid)entity); if (builder == null) { continue; } count++; IMyCubeGrid grid = (IMyCubeGrid)entity; long ownerId = 0; string ownerName = ""; if (grid.BigOwners.Count > 0) { ownerId = grid.BigOwners.First( ); ownerName = PlayerMap.Instance.GetPlayerItemFromPlayerId(ownerId).Name; } builder.PersistentFlags = (MyPersistentEntityFlags2.InScene | MyPersistentEntityFlags2.CastShadows); MyAPIGateway.Entities.RemapObjectBuilder(builder); //Log.Info("Conceal", string.Format("Force Revealing - Id: {0} -> {4} Display: {1} OwnerId: {2} OwnerName: {3}", entity.EntityId, entity.DisplayName.Replace("\r", "").Replace("\n", ""), ownerId, ownerName, builder.EntityId)); Log.Info("Revealing"); IMyEntity newEntity = MyAPIGateway.Entities.CreateFromObjectBuilder(builder); entity.InScene = true; entity.OnAddedToScene(entity); BaseEntityNetworkManager.BroadcastRemoveEntity(entity, false); MyAPIGateway.Entities.AddEntity(newEntity); MyMultiplayer.ReplicateImmediatelly(MyExternalReplicable.FindByObject(newEntity)); entity.Physics.LinearVelocity = Vector3.Zero; entity.Physics.AngularVelocity = Vector3.Zero; } }); } if (!now) { Log.Info(string.Format("Command would reveal {0} grids. Type /admin reveal force to reveal them.", count)); } else { Log.Info(string.Format("Command revealed {0} grids.", count)); } } return(true); }