unlimited admin access

This commit is contained in:
2025-06-19 01:18:14 +02:00
parent 8f5a96dc31
commit b6c298cec3
6 changed files with 77 additions and 16 deletions

View File

@ -30,7 +30,9 @@ class ChatMessagesListener extends ApplianceListener<ChatMessages> {
@EventHandler(priority = EventPriority.HIGH) @EventHandler(priority = EventPriority.HIGH)
public void onPlayerJoin(PlayerJoinEvent event) { public void onPlayerJoin(PlayerJoinEvent event) {
boolean wasHidden = event.joinMessage() == null;
event.joinMessage(null); event.joinMessage(null);
if(wasHidden) return;
IteratorUtil.onlinePlayers(player -> { IteratorUtil.onlinePlayers(player -> {
if(!Settings.instance().getSetting(player, Settings.Key.ShowJoinAndLeaveMessages, Boolean.class)) return; if(!Settings.instance().getSetting(player, Settings.Key.ShowJoinAndLeaveMessages, Boolean.class)) return;
player.sendMessage( player.sendMessage(
@ -43,7 +45,9 @@ class ChatMessagesListener extends ApplianceListener<ChatMessages> {
@EventHandler @EventHandler
public void onPlayerLeave(PlayerQuitEvent event) { public void onPlayerLeave(PlayerQuitEvent event) {
boolean wasHidden = event.quitMessage() == null;
event.quitMessage(null); event.quitMessage(null);
if(wasHidden) return;
IteratorUtil.onlinePlayers(player -> { IteratorUtil.onlinePlayers(player -> {
if(!Settings.instance().getSetting(player, Settings.Key.ShowJoinAndLeaveMessages, Boolean.class)) return; if(!Settings.instance().getSetting(player, Settings.Key.ShowJoinAndLeaveMessages, Boolean.class)) return;
player.sendMessage( player.sendMessage(

View File

@ -27,6 +27,8 @@ public class JoinProtection extends Appliance {
private final Map<UUID, Options> protectedPlayers = new HashMap<>(); private final Map<UUID, Options> protectedPlayers = new HashMap<>();
public void addProtection(Player player) { public void addProtection(Player player) {
if(player.isOp()) return;
this.protectedPlayers.put(player.getUniqueId(), new Options()); this.protectedPlayers.put(player.getUniqueId(), new Options());
PotionEffect resistance = new PotionEffect(PotionEffectType.RESISTANCE, Ticks.TICKS_PER_SECOND * resistanceDuration, 1); PotionEffect resistance = new PotionEffect(PotionEffectType.RESISTANCE, Ticks.TICKS_PER_SECOND * resistanceDuration, 1);
PotionEffect blindness = new PotionEffect(PotionEffectType.DARKNESS, Ticks.TICKS_PER_SECOND * 3, 1); PotionEffect blindness = new PotionEffect(PotionEffectType.DARKNESS, Ticks.TICKS_PER_SECOND * 3, 1);

View File

@ -13,7 +13,6 @@ import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import java.util.List; import java.util.List;
import java.util.NoSuchElementException;
import java.util.stream.Stream; import java.util.stream.Stream;
public class PlayTimerCommand extends ApplianceCommand<PlayTimer> { public class PlayTimerCommand extends ApplianceCommand<PlayTimer> {
@ -33,20 +32,18 @@ public class PlayTimerCommand extends ApplianceCommand<PlayTimer> {
VaroTeam team = switch (mode) { VaroTeam team = switch (mode) {
case "user" -> { case "user" -> {
OfflinePlayer player = Bukkit.getOfflinePlayer(identifier); OfflinePlayer player = Bukkit.getOfflinePlayer(identifier);
try {
yield teamAppliance.getTeamFromPlayer(player.getUniqueId()); yield teamAppliance.getTeamFromPlayer(player.getUniqueId());
} catch(NoSuchElementException e) {
throw new Error("Dieser Spieler konnte keinem Team zugeordnet werden!");
} }
} case "team" -> teamAppliance.findTeamByName(identifier);
case "team" -> { case "incallbyone" -> {
VaroTeam targetTeam = teamAppliance.findTeamByName(identifier); this.getAppliance().incrementAll();
if (targetTeam == null) throw new Error("Team nicht gefunden."); throw new Error("Incremented all Teams by one!");
yield targetTeam;
} }
default -> throw new Error("Ungültiger Modus: " + mode + ". Erlaubt: user | team"); default -> throw new Error("Ungültiger Modus: " + mode + ". Erlaubt: user | team");
}; };
if(team == null) throw new Error("Team nicht gefunden.");
switch (action) { switch (action) {
case "get" -> { case "get" -> {
int ticketCount = this.getAppliance().getTickets(team); int ticketCount = this.getAppliance().getTickets(team);
@ -67,7 +64,7 @@ public class PlayTimerCommand extends ApplianceCommand<PlayTimer> {
List<VaroTeam> teams = Main.instance().getAppliance(Teams.class).getAllTeams(); List<VaroTeam> teams = Main.instance().getAppliance(Teams.class).getAllTeams();
return switch (args.length) { return switch (args.length) {
case 1 -> Stream.of("user", "team") case 1 -> Stream.of("user", "team", "incAllByOne")
.filter(opt -> opt.startsWith(args[0].toLowerCase())) .filter(opt -> opt.startsWith(args[0].toLowerCase()))
.toList(); .toList();

View File

@ -12,6 +12,7 @@ import net.kyori.adventure.text.format.NamedTextColor;
import net.kyori.adventure.text.format.TextColor; import net.kyori.adventure.text.format.TextColor;
import net.kyori.adventure.util.Ticks; import net.kyori.adventure.util.Ticks;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.OfflinePlayer;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.event.Listener; import org.bukkit.event.Listener;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
@ -65,15 +66,18 @@ public class Teams extends Appliance implements DisplayName.Prefixed, DisplayNam
} }
public boolean canLogin(UUID playerId) { public boolean canLogin(UUID playerId) {
OfflinePlayer offlinePlayer = Bukkit.getOfflinePlayer(playerId);
if(offlinePlayer.isOp()) return true;
return this.teams.stream() return this.teams.stream()
.anyMatch(varoTeam -> varoTeam.hasMember(playerId) && !Objects.requireNonNull(varoTeam.getMemberById(playerId)).isDead); .anyMatch(varoTeam -> varoTeam.hasMember(playerId) && !Objects.requireNonNull(varoTeam.getMemberById(playerId)).isDead);
} }
public VaroTeam getTeamFromPlayer(UUID playerId) { public @Nullable VaroTeam getTeamFromPlayer(UUID playerId) {
return this.teams.stream() return this.teams.stream()
.filter(varoTeam -> varoTeam.hasMember(playerId)) .filter(varoTeam -> varoTeam.hasMember(playerId))
.findFirst() .findFirst()
.orElseThrow(); .orElse(null);
} }
public List<VaroTeam> getAllTeams() { public List<VaroTeam> getAllTeams() {
@ -81,6 +85,8 @@ public class Teams extends Appliance implements DisplayName.Prefixed, DisplayNam
} }
public void enforceTeamJoin(Player joinedPlayer) { public void enforceTeamJoin(Player joinedPlayer) {
if(joinedPlayer.isOp()) return;
DisconnectInfo teamNotCompleteInfo = new DisconnectInfo( DisconnectInfo teamNotCompleteInfo = new DisconnectInfo(
"Teampartner nicht beigetreten", "Teampartner nicht beigetreten",
"Deine Verbindung wurde getrennt, da dein Teampartner keine Verbindung zum Server hergestellt hat!", "Deine Verbindung wurde getrennt, da dein Teampartner keine Verbindung zum Server hergestellt hat!",
@ -96,6 +102,7 @@ public class Teams extends Appliance implements DisplayName.Prefixed, DisplayNam
); );
VaroTeam team = this.getTeamFromPlayer(joinedPlayer.getUniqueId()); VaroTeam team = this.getTeamFromPlayer(joinedPlayer.getUniqueId());
if(team == null) throw new IllegalStateException("Player must be in a Team");
PlayTimer playTimer = Main.instance().getAppliance(PlayTimer.class); PlayTimer playTimer = Main.instance().getAppliance(PlayTimer.class);
boolean isAllowed = playTimer.tryConsumeTicket(team); boolean isAllowed = playTimer.tryConsumeTicket(team);
@ -150,7 +157,7 @@ public class Teams extends Appliance implements DisplayName.Prefixed, DisplayNam
leftPlayer.getUniqueId() leftPlayer.getUniqueId()
); );
VaroTeam team = this.getTeamFromPlayer(leftPlayer.getUniqueId()); VaroTeam team = this.getTeamFromPlayer(leftPlayer.getUniqueId());
team.kickTeam(disconnectInfo); if(team != null) team.kickTeam(disconnectInfo);
} }
@Override @Override
@ -162,8 +169,8 @@ public class Teams extends Appliance implements DisplayName.Prefixed, DisplayNam
public @Nullable Component getNamePrefix(Player player) { public @Nullable Component getNamePrefix(Player player) {
VaroTeam team = this.getTeamFromPlayer(player.getUniqueId()); VaroTeam team = this.getTeamFromPlayer(player.getUniqueId());
return Component.text( return Component.text(
String.format("[%s]", team.name), String.format("[%s]", team != null ? team.name : "?"),
TextColor.fromCSSHexString(team.color) TextColor.fromCSSHexString(team != null ? team.color : "#ffffff")
); );
} }

View File

@ -0,0 +1,39 @@
package eu.mhsl.craftattack.spawn.varo.appliances.tooling.adminInvisibility;
import eu.mhsl.craftattack.spawn.core.Main;
import eu.mhsl.craftattack.spawn.core.appliance.Appliance;
import net.kyori.adventure.text.Component;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerJoinEvent;
import org.jetbrains.annotations.NotNull;
import java.util.List;
public class AdminInvisibility extends Appliance {
public void updateVisibility(PlayerJoinEvent event) {
Player target = event.getPlayer();
boolean shouldBeHidden = target.isOp();
for (Player viewer : Bukkit.getOnlinePlayers()) {
if (viewer.equals(target)) continue;
if (shouldBeHidden) {
viewer.hidePlayer(Main.instance(), target);
} else {
viewer.showPlayer(Main.instance(), target);
}
}
if(shouldBeHidden) {
target.playerListName(Component.empty());
event.joinMessage(null);
}
}
@Override
protected @NotNull List<Listener> listeners() {
return List.of(new OnAdminJoinListener());
}
}

View File

@ -0,0 +1,12 @@
package eu.mhsl.craftattack.spawn.varo.appliances.tooling.adminInvisibility;
import eu.mhsl.craftattack.spawn.core.appliance.ApplianceListener;
import org.bukkit.event.EventHandler;
import org.bukkit.event.player.PlayerJoinEvent;
class OnAdminJoinListener extends ApplianceListener<AdminInvisibility> {
@EventHandler
public void onJoin(PlayerJoinEvent event) {
this.getAppliance().updateVisibility(event);
}
}