private static void ServerOnRemoveLandOwner(ILogicObject area, ICharacter removedPlayer) { InteractableStaticWorldObjectHelper.ServerTryAbortInteraction( removedPlayer, LandClaimArea.GetPrivateState(area).ServerLandClaimWorldObject); ServerWorld.ExitPrivateScope(removedPlayer, area); Instance.CallClient(removedPlayer, _ => _.ClientRemote_OnLandOwnerStateChanged(area, false)); }
public static string ServerSetOwners( IStaticWorldObject worldObject, List <string> newOwners, NetworkSyncList <string> currentOwners, ICharacter byOwner) { if (!InteractionCheckerSystem.HasInteraction(ServerRemoteContext.Character, worldObject, requirePrivateScope: true)) { throw new Exception("The player character is not interacting with " + worldObject); } if (!currentOwners.Contains(byOwner.Name)) { return(DialogCannotSetOwners_MessageNotOwner); } if (!((IProtoObjectWithOwnersList)worldObject.ProtoStaticWorldObject) .SharedCanEditOwners(worldObject, byOwner)) { return(DialogCannotSetOwners_MessageCannotEdit); } currentOwners.GetDiff(newOwners, out var ownersToAdd, out var ownersToRemove); if (currentOwners.Count - ownersToRemove.Count <= 0) { return(DialogCannotSetOwners_MessageCannotRemoveLastOwner); } if (ownersToRemove.Contains(byOwner.Name)) { return(DialogCannotSetOwners_MessageCannotRemoveSelf); } if (ownersToAdd.Count == 0 && ownersToRemove.Count == 0) { Logger.Warning( "No need to change the owners - the new owners list is the same as the current owners list: " + worldObject, characterRelated: byOwner); return(null); } foreach (var n in ownersToAdd) { var name = n; var playerToAdd = Api.Server.Characters.GetPlayerCharacter(name); if (playerToAdd == null) { return(string.Format(DialogCannotSetOwners_MessageFormatPlayerNotFound, name)); } // get proper player name name = playerToAdd.Name; if (currentOwners.AddIfNotContains(name)) { Api.Logger.Important($"Added owner: {name}; {worldObject}", characterRelated: byOwner); } } foreach (var name in ownersToRemove) { if (!currentOwners.Remove(name)) { continue; } Api.Logger.Important($"Removed owner: {name}; {worldObject}", characterRelated: byOwner); var removedPlayer = Api.Server.Characters.GetPlayerCharacter(name); if (removedPlayer == null) { continue; } InteractableStaticWorldObjectHelper.ServerTryAbortInteraction(removedPlayer, worldObject); } ServerInvokeOwnersChangedEvent(worldObject); return(null); }