public MyBlockGroup AddUpdateGroup(MyBlockGroup group) { //Can happen on split //Debug.Assert(group.Blocks.Count > 0, "Empty group should not be added to system."); if (group.Blocks.Count == 0) { return(null); } bool modified = false; for (int index = 0; index < BlockGroups.Count; index++) { var g = BlockGroups[index]; if (g.Name.CompareTo(group.Name) == 0) { if (group.CubeGrid != null) //change came from grid i.e. destroyed block that was in group { for (int i = 0; i < g.Blocks.Count; i++) { if (g.Blocks[i].CubeGrid == group.CubeGrid) { g.Blocks.RemoveAt(i); i--; } } } else //change came from gui, we clear group and add all blocks that came in { g.Blocks.Clear(); } foreach (var b in group.Blocks) { if (g.Blocks.Contains(b)) { continue; } g.Blocks.Add(b); } group = g; modified = true; break; } } if (!modified) //new group { var g = new MyBlockGroup(null); g.Name.Clear().AppendStringBuilder(group.Name); g.Blocks.AddList(group.Blocks); BlockGroups.Add(g); group = g; } if (GroupAdded != null) { GroupAdded(group); } return(group); }
internal bool UpdateState(Menu oldMenu, Item item, Update update, bool reset = true) { if (reset) { oldMenu.CleanUp(); GroupNames.Clear(); foreach (var group in BlockGroups) { group.Clear(); MembersPool.Return(group); } BlockGroups.Clear(); foreach (var group in Ai.BlockGroups) { var groupName = group.Key; GroupNames.Add(groupName); var membersList = MembersPool.Get(); foreach (var comp in group.Value.Comps) { var groupMember = new GroupMember { Comp = comp, Name = groupName }; membersList.Add(groupMember); } BlockGroups.Add(membersList); } } var groupReady = BlockGroups.Count > 0; if (groupReady) { switch (update) { case Update.Parent: _currentMenu = item.ParentName; break; case Update.Sub: _currentMenu = item.SubName; break; default: break; } var menu = Menus[_currentMenu]; if (menu.ItemCount <= 1) { menu.LoadInfo(reset); } } return(groupReady); }
internal void CleanUp() { RegisterMyGridEvents(false); foreach (var grid in SubGrids) { if (grid == MyGrid) { continue; } RemSubGrids.Add(grid); } AddSubGrids.Clear(); SubGridChanges(); SubGrids.Clear(); Obstructions.Clear(); TargetAis.Clear(); EntitiesInRange.Clear(); Batteries.Clear(); Targets.Clear(); SortedTargets.Clear(); BlockGroups.Clear(); Weapons.Clear(); WeaponsIdx.Clear(); WeaponBase.Clear(); AmmoInventories.Clear(); Inventories.Clear(); LiveProjectile.Clear(); DeadProjectiles.Clear(); ControllingPlayers.Clear(); SourceCount = 0; BlockCount = 0; MyOwner = 0; PointDefense = false; FadeOut = false; SupressMouseShoot = false; OverPowered = false; UpdatePowerSources = false; AvailablePowerChanged = false; PowerIncrease = false; RequestedPowerChanged = false; RequestIncrease = false; DbReady = false; Focus.Clean(); MyShieldTmp = null; MyShield = null; MyPlanetTmp = null; MyPlanet = null; TerminalSystem = null; LastWeaponTerminal = null; LastTerminal = null; PowerDistributor = null; }
} //创建时间; public virtual Stream GetStream(bool isReadOnly = true) { var part = this.GetParent <Partition>(); if (part == null) { Logger.WriteCallerLine($"{nameof(part)} can't be null!"); } //若块组不为空,则取所有的块字段流; if (BlockGroups != null) { if (part != null) { var blockSize = part.ClusterSize; var partStream = part.GetStream(); //若块组不为空,则遍历块组组成虚拟流; var ranges = BlockGroups.Select(p => ValueTuple.Create( p.BlockAddress * blockSize, p.Count * blockSize)).ToArray(); var blockSub = ranges.Sum(p => p.Item2) - Size; if (ranges?.Count() > 0 && 0 < blockSub && blockSub < blockSize) { ranges[ranges.Count() - 1].Item2 -= blockSub; } var multiStream = MulPeriodsStream.CreateFromStream(partStream, ranges); return(multiStream); } } //否则直接取连续的流; else { var blockSize = part.ClusterSize; var partStream = part.GetStream(); if (partStream != null) { var fiStream = InterceptStream.CreateFromStream(partStream, StartLBA, Size); //var buffer = new byte[128]; //var read = fiStream.Read(buffer, 0, buffer.Length); return(fiStream); } } return(null); }
public void RemoveGroup(MyBlockGroup group) { bool removed = false; if (!BlockGroups.Contains(group)) // if you delete from terminal group matches and you delete whole group { for (int index = 0; index < BlockGroups.Count; index++) { var g = BlockGroups[index]; if (g.Name.CompareTo(group.Name) == 0) { for (int i = 0; i < g.Blocks.Count; i++) { var b = g.Blocks[i]; if (b.CubeGrid == group.CubeGrid) //remove only blocks of that grid from group { g.Blocks.Remove(b); i--; } } if (g.Blocks.Count == 0) { group = g; //group to remove } else { removed = true; } break; } } } if (!removed) { BlockGroups.Remove(group); } if (GroupRemoved != null && group.CubeGrid == null) { GroupRemoved(group); } }
public void RemoveGroup(MyBlockGroup group) { bool removed = false; if (!BlockGroups.Contains(group)) // if you delete from terminal group matches and you delete whole group { foreach (var g in BlockGroups) //removing group from grid side (grid disconnected, or last block from that grid group removed) { if (g.Name.CompareTo(group.Name) == 0) { for (int i = 0; i < g.Blocks.Count; i++) { var b = g.Blocks[i]; if (b.CubeGrid == group.CubeGrid) //remove only blocks of that grid from group { g.Blocks.Remove(b); i--; } } if (g.Blocks.Count == 0) { group = g; //group to remove } else { removed = true; } break; } } } if (!removed) { BlockGroups.Remove(group); } if (GroupRemoved != null) { GroupRemoved(group); } }
internal void ReScanBlockGroups() { if (TerminalSystem == null) { TerminalSystem = MyAPIGateway.TerminalActionsHelper.GetTerminalSystemForGrid(MyGrid); } if (TerminalSystem != null) { TerminalSystem.GetBlockGroups(null, group => { GroupInfo groupInfo = null; if (BlockGroups.TryGetValue(group.Name, out groupInfo)) { groupInfo.ChangeState = GroupInfo.ChangeStates.None; groupInfo.Name = group.Name; } group.GetBlocks(null, block => { var cube = (MyCubeBlock)block; WeaponComponent comp; if (cube.Components.TryGet(out comp) && SubGrids.Contains(cube.CubeGrid)) { if (groupInfo == null) { groupInfo = Session.GroupInfoPool.Get(); groupInfo.Name = group.Name; groupInfo.ChangeState = GroupInfo.ChangeStates.Add; BlockGroups.Add(group.Name, groupInfo); } groupInfo.Comps.Add(comp); if (groupInfo.ChangeState == GroupInfo.ChangeStates.None) { groupInfo.ChangeState = GroupInfo.ChangeStates.Modify; } } return(false); }); return(false); }); BlockGroups.ApplyAdditionsAndModifications(); foreach (var group in BlockGroups) { if (group.Value.ChangeState == GroupInfo.ChangeStates.None) { group.Value.Comps.Clear(); Session.GroupInfoPool.Return(group.Value); BlockGroups.Remove(group.Key); } else { group.Value.ChangeState = GroupInfo.ChangeStates.None; } if (Session.MpActive && group.Value.Comps != null) { foreach (var comp in group.Value.Comps) { if (comp.Set?.Value?.Overrides != null) { SyncGridOverrides(this, group.Key, comp.Set.Value.Overrides); } break; } } } BlockGroups.ApplyRemovals(); ScanBlockGroups = false; } }