private static Dictionary <long, long> ProcessAsteroidOwnership() { Dictionary <long, long> result = new Dictionary <long, long>(); HashSet <IMyEntity> entities = new HashSet <IMyEntity>(); MyAPIGateway.Entities.GetEntities(entities); foreach (IMyEntity entity in entities) { if (!(entity is IMyVoxelMap)) { continue; } if (!entity.Save) { continue; } IMyVoxelMap voxel = (IMyVoxelMap)entity; BoundingSphereD sphere = new BoundingSphereD(entity.GetPosition(), 500); // Size of sphere around Roid List <IMyEntity> blocks = MyAPIGateway.Entities.GetEntitiesInSphere(ref sphere); Dictionary <long, int> asteroidScore = new Dictionary <long, int>(); foreach (IMyEntity block in blocks) { if (block is IMyCubeBlock) { IMyCubeBlock cube = (IMyCubeBlock)block; if (!(cube.GetTopMostParent() is IMyCubeGrid)) { continue; } IMyCubeGrid parent = (IMyCubeGrid)cube.GetTopMostParent(); if (!parent.IsStatic) { continue; } if (cube.OwnerId != 0 && TestBeacon(cube)) // Test Valid Beacon. { if (!asteroidScore.ContainsKey(cube.OwnerId)) { asteroidScore.Add(cube.OwnerId, 0); } asteroidScore[cube.OwnerId] = asteroidScore[cube.OwnerId] + 1; } } } long asteroidOwner = asteroidScore.OrderBy(x => x.Value).Where(x => x.Value > 0).Select(x => x.Key).FirstOrDefault(); if (asteroidOwner != 0) { MyObjectBuilder_Checkpoint.PlayerItem item = PlayerMap.Instance.GetPlayerItemFromPlayerId(asteroidOwner); //Console.WriteLine(string.Format("Owner of asteroid at: {0} is {1}", General.Vector3DToString(entity.GetPosition()), item.Name)); result.Add(entity.EntityId, asteroidOwner); } } return(result); }
public override bool Invoke(ulong steamId, long playerId, string messageText) { if (messageText.Equals("/detail", StringComparison.InvariantCultureIgnoreCase)) { IMyEntity entity; double distance; Vector3D hitPoint; Support.FindLookAtEntity(MyAPIGateway.Session.ControlledObject, true, false, out entity, out distance, out hitPoint, true, true, true, true, true, true); if (entity != null) { string displayType; string displayName; string description; if (entity is IMyVoxelMap) { var voxelMap = (IMyVoxelMap)entity; displayType = "asteroid"; displayName = voxelMap.StorageName; var aabb = new BoundingBoxD(voxelMap.PositionLeftBottomCorner, voxelMap.PositionLeftBottomCorner + voxelMap.Storage.Size); //float GetVoxelContentInBoundingBox(BoundingBoxD worldAabb, out float cellCount); // Do we bother with this detail? if (voxelMap.Storage.Size.RectangularLength() >= 1536) // 512x512x512 or bigger. { MyAPIGateway.Utilities.ShowMessage("Asteroid", "{0} is too big to load immediately, so processing is occurring in the background. Details will appear when finished.", displayName); // use IMyParallelTask to process in the background. MyAPIGateway.Parallel.StartBackground( delegate() { ProcessAsteroid(displayType, displayName, voxelMap, distance, aabb); }); } else { ProcessAsteroid(displayType, displayName, voxelMap, distance, aabb); } } else if (entity is Sandbox.Game.Entities.MyPlanet) { var planet = (Sandbox.Game.Entities.MyPlanet)entity; displayType = "planet"; displayName = planet.StorageName; description = string.Format("Distance: {0:N} m\r\nCenter: [X:{1:N} Y:{2:N} Z:{3:N}]\r\nMinimum Radius: {4:N} m\r\nAverage Radius: {5:N} m\r\nAtmosphere Radius: {6:N} m\r\nHas Atmosphere: {7}", distance, planet.WorldMatrix.Translation.X, planet.WorldMatrix.Translation.Y, planet.WorldMatrix.Translation.Z, planet.MinimumRadius, planet.AverageRadius, planet.AtmosphereRadius, planet.HasAtmosphere); MyAPIGateway.Utilities.ShowMissionScreen(string.Format("ID {0}:", displayType), string.Format("'{0}'", displayName), " ", description, null, "OK"); } else if (entity is IMyCubeBlock || entity is IMyCubeGrid) { IMyCubeGrid gridCube; IMyCubeBlock cubeBlock = null; if (entity is IMyCubeGrid) { gridCube = (IMyCubeGrid)entity; } else { cubeBlock = (IMyCubeBlock)entity; gridCube = (IMyCubeGrid)cubeBlock.GetTopMostParent(); } var attachedGrids = gridCube.GetAttachedGrids(AttachedGrids.Static); var blocks = new List <IMySlimBlock>(); gridCube.GetBlocks(blocks); //var cockpits = entity.FindWorkingCockpits(); // TODO: determine if any cockpits are occupied. var identities = new List <IMyIdentity>(); MyAPIGateway.Players.GetAllIdentites(identities); var ownerCounts = new Dictionary <long, long>(); foreach (var block in blocks.Where(f => f.FatBlock != null && f.FatBlock.OwnerId != 0)) { if (ownerCounts.ContainsKey(block.FatBlock.OwnerId)) { ownerCounts[block.FatBlock.OwnerId]++; } else { ownerCounts.Add(block.FatBlock.OwnerId, 1); } } var ownerList = new List <string>(); foreach (var ownerKvp in ownerCounts) { var owner = identities.FirstOrDefault(p => p.PlayerId == ownerKvp.Key); if (owner == null) { continue; } ownerList.Add(string.Format("{0} [{1}]", owner.DisplayName, ownerKvp.Value)); } //var damage = new StringBuilder(); //var buildComplete = new StringBuilder(); var incompleteBlocks = 0; foreach (var block in blocks) { //damage. cube.IntegrityPercent <= cube.BuildPercent; //complete. cube.BuildPercent; // This information does not appear to work. // Unsure if the API is broken, incomplete , or a temporary bug under 01.070. //damage.AppendFormat("D={0:N} ", block.DamageRatio); //damage.AppendFormat("A={0:N} ", block.AccumulatedDamage); if (!block.IsFullIntegrity) { incompleteBlocks++; //buildComplete.AppendFormat("B={0:N} ", block.BuildLevelRatio); //buildComplete.AppendFormat("I={0:N} ", block.BuildIntegrity); //buildComplete.AppendFormat("M={0:N} ", block.MaxIntegrity); } } displayType = gridCube.IsStatic ? "Station" : gridCube.GridSizeEnum.ToString() + " Ship"; displayName = gridCube.DisplayName; description = string.Format("Distance: {0:N} m\r\n", distance); if (gridCube.Physics == null) { description += string.Format("Projection has no physics characteristics.\r\n"); } else { description += string.Format("Mass: {0:N} kg\r\nVector: {1}\r\nVelocity: {2:N} m/s\r\nMass Center: {3}\r\n", gridCube.Physics.Mass, gridCube.Physics.LinearVelocity, gridCube.Physics.LinearVelocity.Length(), gridCube.Physics.CenterOfMassWorld); } description += string.Format("Size : {0}\r\nNumber of Blocks : {1:#,##0}\r\nAttached Grids : {2:#,##0} (including this one).\r\nOwners : {3}\r\nBuild : {4} blocks incomplete.", gridCube.LocalAABB.Size, blocks.Count, attachedGrids.Count, String.Join(", ", ownerList), incompleteBlocks); if (cubeBlock != null) { string ownerName = ""; var owner = identities.FirstOrDefault(p => p.PlayerId == cubeBlock.OwnerId); if (owner != null) { ownerName = owner.DisplayName; } description += string.Format("\r\n\r\nCube;\r\n Type : {0}\r\n Name : {1}\r\n Owner : {2}", cubeBlock.DefinitionDisplayNameText, cubeBlock.DisplayNameText, ownerName); } MyAPIGateway.Utilities.ShowMissionScreen(string.Format("ID {0}:", displayType), string.Format("'{0}'", displayName), " ", description, null, "OK"); } else if (entity is IMyCharacter) { displayType = "player"; displayName = entity.DisplayName; description = string.Format("Distance: {0:N}", distance); MyAPIGateway.Utilities.ShowMissionScreen(string.Format("ID {0}:", displayType), string.Format("'{0}'", displayName), " ", description, null, "OK"); } else if (entity is MyInventoryBagEntity) { displayType = "Unknown"; var replicable = (MyInventoryBagEntity)entity; if (replicable.DefinitionId.HasValue) { MyDefinitionBase definition; if (MyDefinitionManager.Static.TryGetDefinition(replicable.DefinitionId.Value, out definition)) { displayType = definition.Id.SubtypeName; } } displayName = entity.DisplayName; description = string.Format("Distance: {0:N} m", distance); MyAPIGateway.Utilities.ShowMissionScreen(string.Format("ID {0}:", displayType), string.Format("'{0}'", displayName), " ", description, null, "OK"); } else { displayType = "unknown"; displayName = entity.DisplayName; description = string.Format("Distance: {0:N} m", distance); MyAPIGateway.Utilities.ShowMissionScreen(string.Format("ID {0}:", displayType), string.Format("'{0}'", displayName), " ", description, null, "OK"); } return(true); } MyAPIGateway.Utilities.ShowMessage("ID", "Could not find object."); return(true); } return(false); }
public override bool Invoke(ulong steamId, long playerId, string messageText) { if (messageText.Equals("/id", StringComparison.InvariantCultureIgnoreCase)) { IMyEntity entity; double distance; Vector3D hitPoint; Support.FindLookAtEntity(MyAPIGateway.Session.ControlledObject, true, false, out entity, out distance, out hitPoint, true, true, true, true, true, true); if (entity != null) { MessageTaggedEntityStore.RegisterIdentity(playerId, entity.EntityId); string displayType; string displayName; StringBuilder description = new StringBuilder(); if (entity is IMyVoxelMap) { var voxelMap = (IMyVoxelMap)entity; displayType = "asteroid"; displayName = voxelMap.StorageName; var aabb = new BoundingBoxD(voxelMap.PositionLeftBottomCorner, voxelMap.PositionLeftBottomCorner + voxelMap.Storage.Size); description.AppendFormat("Distance: {0:N} m\r\nSize: {1}\r\nBoundingBox Center: [X:{2:N} Y:{3:N} Z:{4:N}]\r\n\r\nUse /detail for more information on asteroid content.", distance, voxelMap.Storage.Size, aabb.Center.X, aabb.Center.Y, aabb.Center.Z); MyAPIGateway.Utilities.ShowMissionScreen(string.Format("ID {0}:", displayType), string.Format("'{0}'", displayName), " ", description.ToString(), null, "OK"); } else if (entity is Sandbox.Game.Entities.MyPlanet) { var planet = (Sandbox.Game.Entities.MyPlanet)entity; displayType = "planet"; displayName = planet.StorageName; description.AppendFormat("Distance: {0:N} m\r\nCenter: [X:{1:N} Y:{2:N} Z:{3:N}]\r\nMinimum Radius: {4:N} m\r\nMaximum Radius: {5:N} m\r\nAverage Radius: {6:N} m\r\nAtmosphere Radius: {7:N} m\r\nHas Atmosphere: {8}\r\nBreathable Atmosphere: {9}", distance, planet.WorldMatrix.Translation.X, planet.WorldMatrix.Translation.Y, planet.WorldMatrix.Translation.Z, planet.MinimumRadius, planet.MaximumRadius, planet.AverageRadius, planet.AtmosphereRadius, planet.HasAtmosphere, planet.Generator.Atmosphere.Breathable); MySphericalNaturalGravityComponent naturalGravity = planet.Components.Get <MyGravityProviderComponent>() as MySphericalNaturalGravityComponent; if (naturalGravity != null) { description.AppendLine(); description.AppendLine("Gravity Limit: {0:N} m", naturalGravity.GravityLimit); } MyAPIGateway.Utilities.ShowMissionScreen(string.Format("ID {0}:", displayType), string.Format("'{0}'", displayName), " ", description.ToString(), null, "OK"); } else if (entity is IMyCubeBlock || entity is IMyCubeGrid) { IMyCubeGrid gridCube; IMyCubeBlock cubeBlock = null; if (entity is IMyCubeGrid) { gridCube = (IMyCubeGrid)entity; } else { cubeBlock = (IMyCubeBlock)entity; gridCube = (IMyCubeGrid)cubeBlock.GetTopMostParent(); } var attachedGrids = gridCube.GetAttachedGrids(AttachedGrids.Static); var blocks = new List <IMySlimBlock>(); gridCube.GetBlocks(blocks); //var cockpits = entity.FindWorkingCockpits(); // TODO: determine if any cockpits are occupied. var identities = new List <IMyIdentity>(); MyAPIGateway.Players.GetAllIdentites(identities); var ownerCounts = new Dictionary <long, long>(); foreach (var block in blocks.Where(f => f.FatBlock != null && f.FatBlock.OwnerId != 0)) { if (ownerCounts.ContainsKey(block.FatBlock.OwnerId)) { ownerCounts[block.FatBlock.OwnerId]++; } else { ownerCounts.Add(block.FatBlock.OwnerId, 1); } } var ownerList = new List <string>(); foreach (var ownerKvp in ownerCounts) { var owner = identities.FirstOrDefault(p => p.IdentityId == ownerKvp.Key); if (owner == null) { continue; } ownerList.Add(string.Format("{0} [{1}]", owner.DisplayName, ownerKvp.Value)); } // TODO: BuiltBy needs to be made available in IMySlimBlock. //var builtByCounts = new Dictionary<long, long>(); //foreach (var block in blocks.Where(f => f.FatBlock != null && ((MyCubeBlock)f).BuiltBy != 0)) //{ // if (ownerCounts.ContainsKey(block.FatBlock.OwnerId)) // ownerCounts[block.FatBlock.OwnerId]++; // else // ownerCounts.Add(block.FatBlock.OwnerId, 1); //} //var damage = new StringBuilder(); //var buildComplete = new StringBuilder(); var incompleteBlocks = 0; foreach (var block in blocks) { //damage. cube.IntegrityPercent <= cube.BuildPercent; //complete. cube.BuildPercent; // This information does not appear to work. // Unsure if the API is broken, incomplete , or a temporary bug under 01.070. //damage.AppendFormat("D={0:N} ", block.DamageRatio); //damage.AppendFormat("A={0:N} ", block.AccumulatedDamage); if (!block.IsFullIntegrity) { incompleteBlocks++; //buildComplete.AppendFormat("B={0:N} ", block.BuildLevelRatio); //buildComplete.AppendFormat("I={0:N} ", block.BuildIntegrity); //buildComplete.AppendFormat("M={0:N} ", block.MaxIntegrity); } } displayType = gridCube.IsStatic ? "Station" : gridCube.GridSizeEnum.ToString() + " Ship"; displayName = gridCube.DisplayName; description.AppendFormat("Distance: {0:N} m\r\n", distance); if (gridCube.Physics == null) { description.AppendFormat("Projection has no physics characteristics.\r\n"); } else { description.AppendFormat("Mass: {0:N} kg\r\nVector: {1}\r\nVelocity: {2:N} m/s\r\nMass Center: {3}\r\n", gridCube.Physics.Mass, gridCube.Physics.LinearVelocity, gridCube.Physics.LinearVelocity.Length(), gridCube.Physics.CenterOfMassWorld); } description.AppendFormat("Size : {0}\r\nNumber of Blocks : {1:#,##0}\r\nAttached Grids : {2:#,##0} (including this one).\r\nOwners : {3}\r\nBuild : {4} blocks incomplete.", gridCube.LocalAABB.Size, blocks.Count, attachedGrids.Count, string.Join(", ", ownerList), incompleteBlocks); if (cubeBlock != null) { string ownerName = ""; var owner = identities.FirstOrDefault(p => p.IdentityId == cubeBlock.OwnerId); if (owner != null) { ownerName = owner.DisplayName; } string builtByName = ""; var builtBy = identities.FirstOrDefault(p => p.IdentityId == ((MyCubeBlock)cubeBlock).BuiltBy); if (builtBy != null) { builtByName = builtBy.DisplayName; } description.AppendFormat("\r\n\r\nCube;\r\n Type : {1}\r\n SubType : {0}\r\n Name : {2}\r\n Owner : {3}\r\n BuiltBy : {4}", cubeBlock.BlockDefinition.SubtypeName, cubeBlock.DefinitionDisplayNameText, cubeBlock.DisplayNameText, ownerName, builtByName); } MyAPIGateway.Utilities.ShowMissionScreen(string.Format("ID {0}:", displayType), string.Format("'{0}'", displayName), " ", description.ToString(), null, "OK"); } else if (entity is IMyCharacter) { displayType = "player"; displayName = entity.DisplayName; description.AppendFormat("Distance: {0:N} m", distance); MyAPIGateway.Utilities.ShowMissionScreen(string.Format("ID {0}:", displayType), string.Format("'{0}'", displayName), " ", description.ToString(), null, "OK"); } else if (entity is MyInventoryBagEntity) { displayType = "Unknown"; var replicable = (MyInventoryBagEntity)entity; if (replicable.DefinitionId.HasValue) { MyDefinitionBase definition; if (MyDefinitionManager.Static.TryGetDefinition(replicable.DefinitionId.Value, out definition)) { displayType = definition.Id.SubtypeName; } } displayName = entity.DisplayName; description.AppendFormat("Distance: {0:N} m", distance); MyAPIGateway.Utilities.ShowMissionScreen(string.Format("ID {0}:", displayType), string.Format("'{0}'", displayName), " ", description.ToString(), null, "OK"); } else { displayType = "unknown"; displayName = entity.DisplayName; description.AppendFormat("Distance: {0:N} m", distance); MyAPIGateway.Utilities.ShowMissionScreen(string.Format("ID {0}:", displayType), string.Format("'{0}'", displayName), " ", description.ToString(), null, "OK"); } return(true); } MyAPIGateway.Utilities.ShowMessage("ID", "Could not find object."); return(true); } return(false); }