// TODO: deal with cubes that need to be rotated. // LargeBlockBeacon, SmallBlockBeacon, ConveyorTube, ConveyorTubeSmall public static bool ScaleShip(IMyCubeGrid shipEntity, MyCubeSize newScale) { if (shipEntity == null) return false; if (shipEntity.GridSizeEnum == newScale) { MyAPIGateway.Utilities.ShowMessage("scaledown", "Ship is already the right scale."); return true; } var grids = shipEntity.GetAttachedGrids(); var newGrids = new MyObjectBuilder_CubeGrid[grids.Count]; foreach (var cubeGrid in grids) { // ejects any player prior to deleting the grid. cubeGrid.EjectControllingPlayers(); cubeGrid.Physics.Enabled = false; } var tempList = new List<MyObjectBuilder_EntityBase>(); var gridIndex = 0; foreach (var cubeGrid in grids) { var blocks = new List<Sandbox.ModAPI.IMySlimBlock>(); cubeGrid.GetBlocks(blocks); var gridObjectBuilder = cubeGrid.GetObjectBuilder(true) as MyObjectBuilder_CubeGrid; gridObjectBuilder.EntityId = 0; Regex rgx = new Regex(Regex.Escape(gridObjectBuilder.GridSizeEnum.ToString())); var rgxScale = Regex.Escape(newScale.ToString()); gridObjectBuilder.GridSizeEnum = newScale; var removeList = new List<MyObjectBuilder_CubeBlock>(); foreach (var block in gridObjectBuilder.CubeBlocks) { MyCubeBlockDefinition defintion; string newSubType = null; if (newScale == MyCubeSize.Small && LargeToSmall.ContainsKey(block.SubtypeName)) newSubType = LargeToSmall[block.SubtypeName]; else if (newScale == MyCubeSize.Large && SmallToLarge.ContainsKey(block.SubtypeName)) newSubType = SmallToLarge[block.SubtypeName]; else { newSubType = rgx.Replace(block.SubtypeName, rgxScale, 1); // Match using the BlockPairName if there is a matching cube. if (MyDefinitionManager.Static.TryGetCubeBlockDefinition(new MyDefinitionId(block.GetType(), block.SubtypeName), out defintion)) { var newDef = MyDefinitionManager.Static.GetAllDefinitions().Where(d => d is MyCubeBlockDefinition && ((MyCubeBlockDefinition)d).BlockPairName == defintion.BlockPairName && ((MyCubeBlockDefinition)d).CubeSize == newScale).FirstOrDefault(); if (newDef != null) newSubType = newDef.Id.SubtypeName; } } if (MyDefinitionManager.Static.TryGetCubeBlockDefinition(new MyDefinitionId(block.GetType(), newSubType), out defintion) && defintion.CubeSize == newScale) { block.SubtypeName = newSubType; //block.EntityId = 0; } else { removeList.Add(block); } } foreach (var block in removeList) { gridObjectBuilder.CubeBlocks.Remove(block); } // This will Delete the entity and sync to all. // Using this, also works with player ejection in the same Tick. cubeGrid.SyncObject.SendCloseRequest(); var name = cubeGrid.DisplayName; MyAPIGateway.Utilities.ShowMessage("ship", "'{0}' resized.", name); tempList.Add(gridObjectBuilder); gridIndex++; } // TODO: reposition multiple grids so rotors and pistons re-attach. tempList.CreateAndSyncEntities(); return true; }
// TODO: deal with cubes that need to be rotated. // LargeBlockBeacon, SmallBlockBeacon, ConveyorTube, ConveyorTubeSmall private bool ScaleShip(ulong steamId, IMyCubeGrid shipEntity, MyCubeSize newScale) { if (shipEntity == null) { return(false); } if (shipEntity.GridSizeEnum == newScale) { MyAPIGateway.Utilities.SendMessage(steamId, "scaledown", "Ship is already the right scale."); return(true); } var grids = shipEntity.GetAttachedGrids(); var newGrids = new MyObjectBuilder_CubeGrid[grids.Count]; foreach (var cubeGrid in grids) { // ejects any player prior to deleting the grid. cubeGrid.EjectControllingPlayers(); cubeGrid.Physics.Enabled = false; } var tempList = new List <MyObjectBuilder_EntityBase>(); var gridIndex = 0; foreach (var cubeGrid in grids) { var blocks = new List <IMySlimBlock>(); cubeGrid.GetBlocks(blocks); var gridObjectBuilder = cubeGrid.GetObjectBuilder(true) as MyObjectBuilder_CubeGrid; gridObjectBuilder.EntityId = 0; Regex rgx = new Regex(Regex.Escape(gridObjectBuilder.GridSizeEnum.ToString())); var rgxScale = Regex.Escape(newScale.ToString()); gridObjectBuilder.GridSizeEnum = newScale; var removeList = new List <MyObjectBuilder_CubeBlock>(); foreach (var block in gridObjectBuilder.CubeBlocks) { MyCubeBlockDefinition definition; string newSubType = null; if (newScale == MyCubeSize.Small && LargeToSmall.ContainsKey(block.SubtypeName)) { newSubType = LargeToSmall[block.SubtypeName]; } else if (newScale == MyCubeSize.Large && SmallToLarge.ContainsKey(block.SubtypeName)) { newSubType = SmallToLarge[block.SubtypeName]; } else { newSubType = rgx.Replace(block.SubtypeName, rgxScale, 1); // Match using the BlockPairName if there is a matching cube. if (MyDefinitionManager.Static.TryGetCubeBlockDefinition(new MyDefinitionId(block.GetType(), block.SubtypeName), out definition)) { var newDef = MyDefinitionManager.Static.GetAllDefinitions().Where(d => d is MyCubeBlockDefinition && ((MyCubeBlockDefinition)d).BlockPairName == definition.BlockPairName && ((MyCubeBlockDefinition)d).CubeSize == newScale).FirstOrDefault(); if (newDef != null) { newSubType = newDef.Id.SubtypeName; } } } if (MyDefinitionManager.Static.TryGetCubeBlockDefinition(new MyDefinitionId(block.GetType(), newSubType), out definition) && definition.CubeSize == newScale) { block.SubtypeName = newSubType; //block.EntityId = 0; } else { removeList.Add(block); } } foreach (var block in removeList) { gridObjectBuilder.CubeBlocks.Remove(block); } // This will Delete the entity and sync to all. // Using this, also works with player ejection in the same Tick. cubeGrid.SyncObject.SendCloseRequest(); var name = cubeGrid.DisplayName; MyAPIGateway.Utilities.SendMessage(steamId, "ship", "'{0}' resized.", name); tempList.Add(gridObjectBuilder); gridIndex++; } // TODO: reposition multiple grids so rotors and pistons re-attach. tempList.CreateAndSyncEntities(); return(true); }
public override string ToString() { return($"MountPoints:\t{string.Join(", ", MountPoints)}\tCubeSize:\t{MyCubeSize.ToString()}\tSizeX:\t{SizeX.ToString()}\tSizeY:\t{SizeY.ToString()}\tSizeZ:\t{SizeZ.ToString()}\tSubtypeId:\t{SubtypeId.ToString()}\tSubtypeName:\t{SubtypeName}\tModName:\t{ModName}\tID:\t{Id}"); }