public override bool SharedCanInteract(ICharacter character, IStaticWorldObject worldObject, bool writeToLog) { if (!base.SharedCanInteract(character, worldObject, writeToLog)) { return(false); } if (IsClient) { // cannot perform further checks on client side return(true); } if (PlayerCharacterSpectator.SharedIsSpectator(character) || CreativeModeSystem.SharedIsInCreativeMode(character)) { return(true); } var publicState = GetPublicState(worldObject); var areasGroup = LandClaimSystem.SharedGetLandClaimAreasGroup(worldObject); if (areasGroup is not null && LandClaimAreasGroup.GetPublicState(areasGroup).FactionClanTag is var claimFactionClanTag && !string.IsNullOrEmpty(claimFactionClanTag)) { // the land claim is owned by faction - verify permission if (claimFactionClanTag == FactionSystem.SharedGetClanTag(character) && FactionSystem.SharedHasAccessRight(character, FactionMemberAccessRights.LandClaimManagement)) { return(true); } }
public string Execute(bool isEnabled, [CurrentCharacterIfNull] ICharacter character) { if (isEnabled) { PlayerCharacterSpectator.ServerSwitchToSpectatorMode(character); } else { PlayerCharacterSpectator.ServerSwitchToPlayerMode(character); } return(null); }
public override bool SharedCanInteract(ICharacter character, IStaticWorldObject worldObject, bool writeToLog) { if (!base.SharedCanInteract(character, worldObject, writeToLog)) { return(false); } if (IsClient) { // cannot perform further checks on client side return(true); } var publicState = GetPublicState(worldObject); if (LandClaimSystem.ServerIsOwnedArea(publicState.LandClaimAreaObject, character)) { return(true); } if (PlayerCharacterSpectator.SharedIsSpectator(character) || CreativeModeSystem.SharedIsInCreativeMode(character)) { return(true); } // not the land owner if (writeToLog) { Logger.Warning( $"Character cannot interact with {worldObject} - not the land owner.", character); this.CallClient( character, _ => _.ClientRemote_OnCannotInteract( worldObject, LandClaimMenuOpenResult.FailPlayerIsNotOwner)); } return(false); }
void IInteractableProtoWorldObject.ServerOnMenuClosed(ICharacter who, IWorldObject worldObject) { var area = LandClaimSystem.ServerGetLandClaimArea((IStaticWorldObject)worldObject); if (area == null) { // area could be null in the Editor for the land claim without owners return; } var areasGroup = LandClaimArea.GetPublicState(area).LandClaimAreasGroup; if (!LandClaimSystem.ServerIsOwnedArea(area, who) && (PlayerCharacterSpectator.SharedIsSpectator(who) || CreativeModeSystem.SharedIsInCreativeMode(who))) { Server.World.ExitPrivateScope(who, area); } Server.World.ExitPrivateScope(who, areasGroup); }