From 67ac9f6efae0df4744f2a63b1f83bc2179e8c456 Mon Sep 17 00:00:00 2001 From: XxFran10xX <318299142+XxFran10xX@users.noreply.github.com> Date: Fri, 23 Oct 2026 16:33:14 +0200 Subject: [PATCH] fix: keep players in the faction when they leave or are kicked from a guild /guild leave and /guild kick removed the player from their guild, and since faction membership is the members of its guilds, from the whole faction too. They now return the player to the faction's main guild. In the main guild, /guild leave points to /faction leave, and /faction leave tells guild members to leave their guild first. Co-Authored-By: Claude Opus 5.5 --- .../simplefactions/managers/CommandManager.java | 15 ++++++++++++--- .../guild/GuildKickCommandTest.java | 9 +++++++-- .../managers/CommandManagerCoverageTest.java | 14 ++++++++++++-- 3 files changed, 31 insertions(+), 7 deletions(-) diff --git a/src/main/java/net/tfminecraft/simplefactions/managers/CommandManager.java b/src/main/java/net/tfminecraft/simplefactions/managers/CommandManager.java index 652c3d0b..ba486f40 100644 --- a/src/main/java/net/tfminecraft/simplefactions/managers/CommandManager.java +++ b/src/main/java/net/tfminecraft/simplefactions/managers/CommandManager.java @@ -293,8 +293,14 @@ private boolean dispatchCommand(CommandSender sender, Command cmd, String label, return true; } Guild g = FactionManager.getGuildByMember(Members.key(p)); + if(g.isBase()) { + p.sendMessage("§cYou are in the main guild of your faction. Use /faction leave to leave the faction."); + return true; + } + // Leaving a guild keeps you in the faction, back in its main guild. g.kick(Members.key(p)); - p.sendMessage("§aLeft "+g.getName()); + g.getFaction().addMember(Members.key(p)); + p.sendMessage("§aLeft "+g.getName()+" §aand returned to the main guild of "+g.getFaction().getName()); return true; } else if(cmd.getName().equalsIgnoreCase(cmd2) && args[0].equalsIgnoreCase("kick") && args.length >= 2) { Guild guild = FactionManager.getGuildByLeader(Members.key(p)); @@ -315,9 +321,12 @@ private boolean dispatchCommand(CommandSender sender, Command cmd, String label, p.sendMessage("§cYou cannot dismiss the leader!"); return true; } + // A guild leader can only remove someone from the guild; they stay in the faction's main guild. guild.kick(kicked); + guild.getFaction().addMember(kicked); p.sendMessage("§aKicked "+Members.display(kicked)); - Members.online(kicked).ifPresent(pl -> pl.sendMessage("§a"+Members.name(p)+ " kicked you from "+guild.getName())); + Members.online(kicked).ifPresent(pl -> pl.sendMessage("§a"+Members.name(p)+ " kicked you from "+guild.getName() + + "§a. You are back in the main guild of "+guild.getFaction().getName())); return true; } else if(cmd.getName().equalsIgnoreCase(cmd2) && args[0].equalsIgnoreCase("setbank") && args.length == 1) { if(FactionManager.getGuildByLeader(Members.key(p)) != null) { @@ -1070,7 +1079,7 @@ private boolean dispatchCommand(CommandSender sender, Command cmd, String label, } Faction f = FactionManager.getByMember(Members.key(p)); if(f.isInGuild(Members.key(p))) { - p.sendMessage("§cYou are in a guild, use /guild leave instead"); + p.sendMessage("§cYou are in a guild. Use /guild leave first, then /faction leave"); return true; } f.forceRemoveMember(Members.key(p)); diff --git a/src/test/java/net/tfminecraft/simplefactions/guild/GuildKickCommandTest.java b/src/test/java/net/tfminecraft/simplefactions/guild/GuildKickCommandTest.java index 082149cd..aa257ef3 100644 --- a/src/test/java/net/tfminecraft/simplefactions/guild/GuildKickCommandTest.java +++ b/src/test/java/net/tfminecraft/simplefactions/guild/GuildKickCommandTest.java @@ -18,16 +18,20 @@ import org.mockito.MockedStatic; import net.tfminecraft.simplefactions.managers.CommandManager; +import net.tfminecraft.simplefactions.objects.Faction; import net.tfminecraft.simplefactions.managers.FactionManager; import net.tfminecraft.simplefactions.utils.TabCompletion; class GuildKickCommandTest { @Test - void leaderRemovesAMemberAndNotifiesThem() { + void leaderRemovesAMemberFromTheGuildButKeepsThemInTheFaction() { Player leader = player("Leader"); Player member = player("Steve"); Guild guild = guild(false, "Smiths", "Leader", "Leader", "Steve"); + Faction realm = mock(Faction.class); + when(realm.getName()).thenReturn("Avalon"); + when(guild.getFaction()).thenReturn(realm); Command command = guildCommand(); try (MockedStatic factions = mockStatic(FactionManager.class); @@ -39,8 +43,9 @@ void leaderRemovesAMemberAndNotifiesThem() { // The typed name finds the member by character name; the stored key is what leaves. verify(guild).kick("Steve"); + verify(realm).addMember("Steve"); verify(leader).sendMessage("§aKicked Steve"); - verify(member).sendMessage("§aLeader kicked you from Smiths"); + verify(member).sendMessage("§aLeader kicked you from Smiths§a. You are back in the main guild of Avalon"); } } diff --git a/src/test/java/net/tfminecraft/simplefactions/managers/CommandManagerCoverageTest.java b/src/test/java/net/tfminecraft/simplefactions/managers/CommandManagerCoverageTest.java index 39a67cd7..15ae09f0 100644 --- a/src/test/java/net/tfminecraft/simplefactions/managers/CommandManagerCoverageTest.java +++ b/src/test/java/net/tfminecraft/simplefactions/managers/CommandManagerCoverageTest.java @@ -895,14 +895,24 @@ void leavingRequiresMembershipAndNonLeadership(String name) { if (name.equals("faction")) { when(faction.isInGuild("Leader")).thenReturn(true); assertTrue(run(name, "leave")); - verify(player).sendMessage(contains("use /guild leave")); + verify(player).sendMessage(contains("Use /guild leave first")); when(faction.isInGuild("Leader")).thenReturn(false); + } else { + when(guild.isBase()).thenReturn(true); + assertTrue(run(name, "leave")); + verify(player).sendMessage(contains("Use /faction leave")); + verify(guild, never()).kick("Leader"); + when(guild.isBase()).thenReturn(false); + when(guild.getFaction()).thenReturn(faction); } assertTrue(run(name, "leave")); if (name.equals("faction")) { verify(faction).forceRemoveMember("Leader"); verify(faction).updatePrestige(); - } else verify(guild).kick("Leader"); + } else { + verify(guild).kick("Leader"); + verify(faction).addMember("Leader"); + } verify(player).sendMessage(contains("Left ")); }