private static void FatBlock_OwnershipChanged(MyTerminalBlock block)
        {
            if ( block?.CubeGrid?.Physics == null || block.Closed )
            {
                //idfk
                Thread.Sleep( 500 );
                if ( block?.CubeGrid?.Physics == null || block.Closed )
                    return;
            }

            Task.Run( () =>
                      {
                          if ( block.OwnerId != 0 )
                          {
                              var owner = MySession.Static.Players.GetPlayerById( new MyPlayer.PlayerId( PlayerMap.Instance.GetSteamIdFromPlayerId( block.OwnerId ) ) );
                              if ( owner != null && MySession.Static.Players.IdentityIsNpc( block.OwnerId ) )
                              {
                                  if ( owner.DisplayName != "Space Pirates" )
                                  {
                                      lock ( BlockOwners )
                                          BlockOwners[block] = block.OwnerId;
                                      return;
                                  }
                              }
                          }

                          lock ( BlockOwners )
                          {
                              if ( BlockOwners.ContainsKey( block ) )
                                  MyAPIGateway.Utilities.InvokeOnGameThread( () => block.ChangeBlockOwnerRequest( BlockOwners[block], MyOwnershipShareModeEnum.Faction ) );
                              else if ( PluginSettings.Instance.PlayerBlockEnforcementChangeOwner )
                              {
                                  ChangeOwnershipToNearestPlayer( block );
                                  if ( block.OwnerId == 0 && block.CubeGrid.BigOwners.Count > 0 )
                                      MyAPIGateway.Utilities.InvokeOnGameThread(()=>block.ChangeBlockOwnerRequest( block.CubeGrid.BigOwners[0], MyOwnershipShareModeEnum.Faction ));

                                  if ( block.OwnerId != 0 )
                                      BlockOwners[block] = block.OwnerId;
                              }
                          }
                      } );

            ProcessEnforcement();
        }
        private static void ChangeOwnershipToNearestPlayer( MyTerminalBlock block )
        {
            Wrapper.GameAction( () =>
                                {
                                    double minDist = 0;
                                    MyPlayer nearest = null;

                                    foreach ( var player in MySession.Static.Players.GetOnlinePlayers() )
                                    {
                                        var dist = Vector3D.DistanceSquared( player.GetPosition(), block.PositionComp.GetPosition() );

                                        if ( nearest == null )
                                        {
                                            nearest = player;
                                            minDist = dist;
                                        }
                                        else if ( dist < minDist )
                                            nearest = player;
                                    }

                                    if ( nearest == null )
                                        return;
                                    MyAPIGateway.Utilities.InvokeOnGameThread(()=>block.ChangeBlockOwnerRequest( nearest.Identity.IdentityId, MyOwnershipShareModeEnum.Faction ));
                                } );
        }