Skip to content

Commit ea9c3dd

Browse files
committed
prevent nation leader from leaving the nation
1 parent 240d7a4 commit ea9c3dd

File tree

4 files changed

+30
-7
lines changed

4 files changed

+30
-7
lines changed

src/main/java/pro/cloudnode/smp/smpcore/Messages.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -423,6 +423,10 @@ public Messages() {
423423
return MiniMessage.miniMessage().deserialize(Objects.requireNonNull(config.getString("error.kick-leadership")));
424424
}
425425

426+
public @NotNull Component errorLeaderLeave() {
427+
return MiniMessage.miniMessage().deserialize(Objects.requireNonNull(config.getString("error.leader-leave")));
428+
}
429+
426430
public @NotNull Component errorNationNotFound(final @NotNull String nation) {
427431
return MiniMessage.miniMessage().deserialize(Objects.requireNonNull(config.getString("error.nation-not-found")), Placeholder.unparsed("nation", nation));
428432
}

src/main/java/pro/cloudnode/smp/smpcore/Nation.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,18 @@ public void add(final @NotNull Member member) {
139139
}
140140

141141
public void remove(final @NotNull Member member) {
142+
if (!id.equals(member.nationID))
143+
throw new IllegalStateException("Member " + member.uuid + " is not in nation " + id);
144+
if (member.uuid.equals(leaderUUID))
145+
throw new IllegalStateException("Cannot remove leader " + member.uuid + " from nation " + id);
146+
147+
Audience.audience(onlinePlayers()).sendMessage(SMPCore.messages().nationJoinLeft(member));
148+
149+
if (member.uuid.equals(viceLeaderUUID)) {
150+
this.viceLeaderUUID = this.leaderUUID;
151+
save();
152+
}
153+
142154
member.nationID = null;
143155
member.save();
144156
getTeam().removePlayer(member.player());

src/main/java/pro/cloudnode/smp/smpcore/command/NationCommand.java

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -215,13 +215,19 @@ public boolean join(
215215
if (member == null)
216216
return sendMessage(sender, SMPCore.messages().errorNotMember());
217217

218-
if (!hasAnyPermission(sender, Permission.NATION_JOIN_REQUEST, Permission.NATION_INVITE_ACCEPT) || (
219-
member.nationID != null && !hasAnyPermission(
220-
sender,
221-
Permission.NATION_JOIN_REQUEST_SWITCH,
222-
Permission.NATION_INVITE_ACCEPT_SWITCH
223-
)
224-
))
218+
if (member.nationID != null) {
219+
if (!hasAnyPermission(
220+
sender,
221+
Permission.NATION_JOIN_REQUEST_SWITCH,
222+
Permission.NATION_INVITE_ACCEPT_SWITCH
223+
))
224+
return sendMessage(sender, SMPCore.messages().errorAlreadyCitizen());
225+
final @NotNull Nation nation = member.nation().orElseThrow(() -> new IllegalStateException("Could not find nation " + member.nationID + " of member " + member.uuid));
226+
if (member.uuid.equals(nation.leaderUUID))
227+
return sendMessage(sender, SMPCore.messages().errorLeaderLeave());
228+
}
229+
230+
if (!hasAnyPermission(sender, Permission.NATION_JOIN_REQUEST, Permission.NATION_INVITE_ACCEPT))
225231
return sendMessage(sender, SMPCore.messages().errorNoPermission());
226232

227233
if (args.length < 1)

src/main/resources/messages.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,7 @@ error:
8686
not-citizen: <red>(!) Member <gray><player></gray> is not a citizen of the nation.</red>
8787
not-player: <red>(!) You must be a player to use this command.</red>
8888
kick-leadership: <red>(!) You cannot kick a member of the nation's leadership.</red>
89+
leader-leave: <red>(!) You cannot leave your nation because you are the leader!</red>
8990
nation-not-found: <red>(!) Nation <gray><nation></gray> not found.</red>
9091
already-citizen: <red>(!) You are already a citizen of a nation.</red>
9192
already-citizen-nation: <red>(!) You are already a citizen of <gray><nation></gray>.</red>

0 commit comments

Comments
 (0)