public static bool ServerHasAccess( IStaticWorldObject worldObject, ICharacter character, WorldObjectAccessMode currentAccessMode, bool writeToLog) { if (CreativeModeSystem.SharedIsInCreativeMode(character)) { return(true); } switch (currentAccessMode) { case WorldObjectAccessMode.Closed: default: if (writeToLog) { Logger.Warning( $"Character cannot interact with {worldObject} - no access.", character); Instance.CallClient( character, _ => _.ClientRemote_OnCannotInteractNoAccess(worldObject)); } return(false); case WorldObjectAccessMode.OpensToEveryone: return(true); case WorldObjectAccessMode.OpensToObjectOwners: case WorldObjectAccessMode.OpensToObjectOwnersOrAreaOwners: { if (WorldObjectOwnersSystem.SharedIsOwner(character, worldObject)) { // an object owner return(true); } // not an object owner if (currentAccessMode == WorldObjectAccessMode.OpensToObjectOwnersOrAreaOwners) { if (LandClaimSystem.SharedIsOwnedLand(worldObject.TilePosition, character, out _)) { // an area owner return(true); } } // not an object owner and not an area owner if (writeToLog) { WorldObjectOwnersSystem.ServerNotifyNotOwner(character, worldObject); } return(false); } } }
public static bool ServerHasAccess( IWorldObject worldObject, ICharacter character, WorldObjectDirectAccessMode directAccessMode, WorldObjectFactionAccessModes factionAccessModes, bool writeToLog) { if (worldObject is IStaticWorldObject staticWorldObject) { if (LandClaimSystem.SharedIsWorldObjectOwnedByFaction(staticWorldObject, out var clanTag)) { if (ServerHasFactionAccess(character, clanTag, factionAccessModes)) { return(true); } if (writeToLog) { Logger.Warning( $"Character cannot interact with {worldObject} - no access.", character); Instance.CallClient( character, _ => _.ClientRemote_OnCannotInteractNoAccess(worldObject)); } return(false); } } else if (worldObject.ProtoGameObject is IProtoVehicle) { var clanTag = worldObject.GetPublicState <VehiclePublicState>().ClanTag; if (string.IsNullOrEmpty(clanTag)) { // the vehicles don't have direct access mode, any owner has access return(false); } return(ServerHasFactionAccess(character, clanTag, factionAccessModes)); } switch (directAccessMode) { case WorldObjectDirectAccessMode.Closed: default: if (writeToLog) { Logger.Warning( $"Character cannot interact with {worldObject} - no access.", character); Instance.CallClient( character, _ => _.ClientRemote_OnCannotInteractNoAccess(worldObject)); } return(false); case WorldObjectDirectAccessMode.OpensToEveryone: return(true); case WorldObjectDirectAccessMode.OpensToObjectOwners: case WorldObjectDirectAccessMode.OpensToObjectOwnersOrAreaOwners: { if (WorldObjectOwnersSystem.SharedIsOwner(character, worldObject)) { // an object owner return(true); } // not an object owner if (directAccessMode == WorldObjectDirectAccessMode.OpensToObjectOwnersOrAreaOwners) { if (LandClaimSystem.SharedIsOwnedLand(worldObject.TilePosition, character, requireFactionPermission: false, out _)) { // an area owner return(true); } } if (CreativeModeSystem.SharedIsInCreativeMode(character)) { return(true); } // not an object owner and not an area owner if (writeToLog) { WorldObjectOwnersSystem.ServerNotifyNotOwner(character, worldObject, isFactionAccess: false); } return(false); } } }