diff --git a/ClaimLink/ClaimLinkChatCommand.cs b/ClaimLink/ClaimLinkChatCommand.cs index 951825b..d6a09bf 100644 --- a/ClaimLink/ClaimLinkChatCommand.cs +++ b/ClaimLink/ClaimLinkChatCommand.cs @@ -324,7 +324,55 @@ public static class ClaimLinkChatCommand return TextCommandResult.Success($"'{groupName}' is no longer a claim link."); }); } - public static TextCommandResult TransferOwnership(TextCommandCallingArgs args) => TextCommandResult.Success("stub: claimlink transferownership"); + public static TextCommandResult TransferOwnership(TextCommandCallingArgs args) + { + string groupName = (string)args[0]; + IPlayer target = (IPlayer)args[1]; + IPlayer player = args.Caller.Player; + + TextCommandResult? err = TryResolveGroup(groupName, out PlayerGroup group); + if (err != null) return err; + + err = TryResolveClaimLink(group, out _); + if (err != null) return err; + + err = RequireOwner(player, group); + if (err != null) return err; + + err = RequireMember(target, group); + if (err != null) return err; + + if (target.PlayerUID == player.PlayerUID) + return TextCommandResult.Error($"You already own '{groupName}'."); + + string playerUid = player.PlayerUID; + string targetName = target.PlayerName; + string targetUid = target.PlayerUID; + + EnumPlayerGroupMemberShip oldOwnerLevel = player.GetGroup(group.Uid)!.Level; + EnumPlayerGroupMemberShip targetLevel = target.GetGroup(group.Uid)!.Level; + + return Stage(playerUid, $"Ownership of '{groupName}' will be transferred to {targetName}.", () => + { + string beforeOwnerUid = group.OwnerUID; + + // TODO remove debug logging once transfer ownership persistence is confirmed tested + ClaimLinkModSystem.Logger.Notification( + $"claimlink: transferownership '{groupName}' (uid {group.Uid}) BEFORE OwnerUID={beforeOwnerUid} " + + $"(old owner {player.PlayerName}/{playerUid} level={oldOwnerLevel}, new owner {targetName}/{targetUid} level={targetLevel})"); + + group.OwnerUID = targetUid; + + EnumPlayerGroupMemberShip afterOldOwnerLevel = player.GetGroup(group.Uid)!.Level; + EnumPlayerGroupMemberShip afterTargetLevel = target.GetGroup(group.Uid)!.Level; + + ClaimLinkModSystem.Logger.Notification( + $"claimlink: transferownership '{groupName}' (uid {group.Uid}) AFTER OwnerUID={group.OwnerUID} " + + $"(old owner {player.PlayerName}/{playerUid} level={afterOldOwnerLevel}, new owner {targetName}/{targetUid} level={afterTargetLevel})"); + + return TextCommandResult.Success($"'{groupName}' is now owned by {targetName}."); + }); + } public static TextCommandResult Info(TextCommandCallingArgs args) { diff --git a/ClaimLink/ClaimLinkModSystem.cs b/ClaimLink/ClaimLinkModSystem.cs index 33957bc..0a3bde5 100644 --- a/ClaimLink/ClaimLinkModSystem.cs +++ b/ClaimLink/ClaimLinkModSystem.cs @@ -29,6 +29,13 @@ public class ClaimLinkModSystem : ModSystem ClaimLinkChatCommand.Register(api); api.Event.PlayerDisconnect += ClaimLinkCommandListener.OnPlayerDisconnect; + + // TODO remove debug logging once transfer ownership persistence is confirmed tested + foreach (ClaimLink link in Registry.All) + { + PlayerGroup group = Groups.PlayerGroupsById[link.GroupId]; + Logger.Notification($"claimlink: startup state '{group.Name}' (uid {group.Uid}) OwnerUID={group.OwnerUID}"); + } } public override void Dispose()