private void RootRefChanged(MyHierarchyComponent target, MyHierarchyComponent oldParent, MyHierarchyComponent newParent) { if (!IsAuthority) { return; } using (PoolManager.Get(out List <MyTuple <MyEntity, RailwayPhysicsLinkData> > moving)) { var oldRoot = oldParent?.Entity; if (oldRoot != null) { var oldGroup = _target.Scene.GetGroup <RailwayPhysicsGroup, MyEntity>(oldRoot); if (oldGroup != null) { foreach (var neighbor in oldGroup.GetNeighbors(oldRoot)) { foreach (var link in oldGroup.GetLinks(oldRoot, neighbor)) { moving.Add(MyTuple.Create(neighbor, link)); } } foreach (var link in moving) { _target.Scene.RemoveLink <RailwayPhysicsGroup, MyEntity, RailwayPhysicsLinkData>(oldRoot, link.Item1, link.Item2); } } } var newRoot = newParent?.Entity; if (newRoot == null) { return; } foreach (var link in moving) { _target.Scene.AddLink <RailwayPhysicsGroup, MyEntity, RailwayPhysicsLinkData>(newRoot, link.Item1, link.Item2); } } }
private void LinkNeighbors() { using (PoolManager.Get(out HashSet <RailPhysicsNode> neighborsForRemoval)) { PhysicsNode.GetNeighbors(neighborsForRemoval); if (_controllerJunction != null) { foreach (var edge in _controllerJunction.Edges) { var neighbor = edge.Owner?.Container?.Get <IRailPhysicsComponent>()?.PhysicsNode; if (neighbor != null && !neighborsForRemoval.Remove(neighbor)) { PhysicsNode.Link(neighbor); } } } foreach (var neighbor in neighborsForRemoval) { PhysicsNode.Unlink(neighbor); } } }