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 )); } ); }