made displayName independent of other appliances

This commit is contained in:
Elias Müller 2025-04-11 19:16:13 +02:00
parent d1b5d81fa7
commit 32cbbe6c51
8 changed files with 43 additions and 26 deletions

View File

@ -1,12 +1,7 @@
package eu.mhsl.craftattack.spawn.craftattack.appliances.metaGameplay.displayName; package eu.mhsl.craftattack.spawn.common.appliances.metaGameplay.displayName;
import eu.mhsl.craftattack.core.Main; import eu.mhsl.craftattack.core.Main;
import eu.mhsl.craftattack.core.appliance.Appliance; import eu.mhsl.craftattack.core.appliance.Appliance;
import eu.mhsl.craftattack.spawn.craftattack.appliances.gameplay.outlawed.Outlawed;
import eu.mhsl.craftattack.spawn.craftattack.appliances.metaGameplay.adminMarker.AdminMarker;
import eu.mhsl.craftattack.spawn.craftattack.appliances.metaGameplay.afkTag.AfkTag;
import eu.mhsl.craftattack.spawn.craftattack.appliances.metaGameplay.sleepTag.SleepTag;
import eu.mhsl.craftattack.spawn.craftattack.appliances.metaGameplay.yearRank.YearRank;
import eu.mhsl.craftattack.core.util.server.Floodgate; import eu.mhsl.craftattack.core.util.server.Floodgate;
import eu.mhsl.craftattack.core.util.text.ComponentUtil; import eu.mhsl.craftattack.core.util.text.ComponentUtil;
import net.kyori.adventure.text.Component; import net.kyori.adventure.text.Component;
@ -20,7 +15,6 @@ import org.jetbrains.annotations.Nullable;
import java.util.List; import java.util.List;
import java.util.Objects; import java.util.Objects;
import java.util.function.Supplier;
import java.util.logging.Level; import java.util.logging.Level;
public class DisplayName extends Appliance { public class DisplayName extends Appliance {
@ -29,18 +23,33 @@ public class DisplayName extends Appliance {
Component getNamePrefix(Player player); Component getNamePrefix(Player player);
} }
public interface Colored {
@Nullable
TextColor getNameColor(Player player);
}
public void update(Player player) { public void update(Player player) {
TextColor playerColor = this.queryAppliance(AdminMarker.class).getPlayerColor(player); List<Colored> coloring = Main.instance().getAppliances().stream()
List<Supplier<Prefixed>> prefixes = List.of( .filter(appliance -> appliance instanceof Colored)
() -> this.queryAppliance(Outlawed.class), .map(appliance -> (Colored) appliance)
() -> this.queryAppliance(YearRank.class), .toList();
() -> this.queryAppliance(AfkTag.class),
() -> this.queryAppliance(SleepTag.class) if(coloring.size() > 1) throw new IllegalStateException(
"There are two or more appliances which provide coloring for player names. This is currently not supported!"
); );
TextColor playerColor = coloring.isEmpty()
? NamedTextColor.WHITE
: coloring.getFirst().getNameColor(player);
List<Prefixed> prefixes = Main.instance().getAppliances().stream()
.filter(appliance -> appliance instanceof Prefixed)
.map(appliance -> (Prefixed) appliance)
.toList();
ComponentBuilder<TextComponent, TextComponent.Builder> playerName = Component.text(); ComponentBuilder<TextComponent, TextComponent.Builder> playerName = Component.text();
prefixes.stream() prefixes.stream()
.map(prefixed -> prefixed.get().getNamePrefix(player)) .map(prefixed -> prefixed.getNamePrefix(player))
.filter(Objects::nonNull) .filter(Objects::nonNull)
.forEach(prefix -> playerName .forEach(prefix -> playerName
.append(prefix) .append(prefix)

View File

@ -1,4 +1,4 @@
package eu.mhsl.craftattack.spawn.craftattack.appliances.metaGameplay.displayName; package eu.mhsl.craftattack.spawn.common.appliances.metaGameplay.displayName;
import eu.mhsl.craftattack.core.appliance.ApplianceListener; import eu.mhsl.craftattack.core.appliance.ApplianceListener;
import org.bukkit.event.EventHandler; import org.bukkit.event.EventHandler;

View File

@ -21,6 +21,7 @@ public final class Main extends JavaPlugin {
private List<Appliance> appliances; private List<Appliance> appliances;
private RepositoryLoader repositoryLoader; private RepositoryLoader repositoryLoader;
private Reflections reflections;
@Override @Override
public void onEnable() { public void onEnable() {
@ -39,15 +40,15 @@ public final class Main extends JavaPlugin {
Configuration.readConfig(); Configuration.readConfig();
List<String> disabledAppliances = Configuration.pluginConfig.getStringList("disabledAppliances"); List<String> disabledAppliances = Configuration.pluginConfig.getStringList("disabledAppliances");
Main.logger().info("Initializing reflections...");
this.reflections = new Reflections("eu.mhsl.craftattack.spawn");
Main.logger().info("Loading Repositories..."); Main.logger().info("Loading Repositories...");
this.repositoryLoader = new RepositoryLoader(); this.repositoryLoader = new RepositoryLoader();
Main.logger().info(String.format("Loaded %d repositories!", this.repositoryLoader.getRepositories().size())); Main.logger().info(String.format("Loaded %d repositories!", this.repositoryLoader.getRepositories().size()));
Main.logger().info("Loading appliances..."); Main.logger().info("Loading appliances...");
Reflections reflections = new Reflections("eu.mhsl.craftattack.spawn"); this.appliances = this.findSubtypesOf(Appliance.class).stream()
Set<Class<? extends Appliance>> applianceClasses = reflections.getSubTypesOf(Appliance.class);
this.appliances = applianceClasses.stream()
.filter(applianceClass -> !disabledAppliances.contains(applianceClass.getSimpleName())) .filter(applianceClass -> !disabledAppliances.contains(applianceClass.getSimpleName()))
.map(applianceClass -> { .map(applianceClass -> {
try { try {
@ -97,6 +98,10 @@ public final class Main extends JavaPlugin {
.orElseThrow(() -> new RuntimeException(String.format("Appliance %s not loaded or instantiated!", clazz))); .orElseThrow(() -> new RuntimeException(String.format("Appliance %s not loaded or instantiated!", clazz)));
} }
public <T> Set<Class<? extends T>> findSubtypesOf(Class<T> type) {
return this.reflections.getSubTypesOf(type);
}
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
public static <T> Class<T> getApplianceType(Class<?> clazz) { public static <T> Class<T> getApplianceType(Class<?> clazz) {
return (Class<T>) ((ParameterizedType) clazz.getGenericSuperclass()).getActualTypeArguments()[0]; return (Class<T>) ((ParameterizedType) clazz.getGenericSuperclass()).getActualTypeArguments()[0];

View File

@ -3,7 +3,7 @@ package eu.mhsl.craftattack.spawn.craftattack.appliances.gameplay.outlawed;
import eu.mhsl.craftattack.core.Main; import eu.mhsl.craftattack.core.Main;
import eu.mhsl.craftattack.core.appliance.Appliance; import eu.mhsl.craftattack.core.appliance.Appliance;
import eu.mhsl.craftattack.core.appliance.ApplianceCommand; import eu.mhsl.craftattack.core.appliance.ApplianceCommand;
import eu.mhsl.craftattack.spawn.craftattack.appliances.metaGameplay.displayName.DisplayName; import eu.mhsl.craftattack.spawn.common.appliances.metaGameplay.displayName.DisplayName;
import eu.mhsl.craftattack.spawn.craftattack.appliances.tooling.whitelist.Whitelist; import eu.mhsl.craftattack.spawn.craftattack.appliances.tooling.whitelist.Whitelist;
import eu.mhsl.craftattack.core.config.Configuration; import eu.mhsl.craftattack.core.config.Configuration;
import eu.mhsl.craftattack.core.util.text.DisconnectInfo; import eu.mhsl.craftattack.core.util.text.DisconnectInfo;
@ -48,7 +48,7 @@ public class Outlawed extends Appliance implements DisplayName.Prefixed {
); );
} }
public void switchLawStatus(Player player) throws OutlawChangeNotPermitted { void switchLawStatus(Player player) throws OutlawChangeNotPermitted {
if(this.getLawStatus(player).equals(Status.FORCED)) { if(this.getLawStatus(player).equals(Status.FORCED)) {
throw new OutlawChangeNotPermitted("Dein Vogelfreistatus wurde als Strafe auferlegt und kann daher nicht verändert werden."); throw new OutlawChangeNotPermitted("Dein Vogelfreistatus wurde als Strafe auferlegt und kann daher nicht verändert werden.");
} }

View File

@ -1,12 +1,15 @@
package eu.mhsl.craftattack.spawn.craftattack.appliances.metaGameplay.adminMarker; package eu.mhsl.craftattack.spawn.craftattack.appliances.metaGameplay.adminMarker;
import eu.mhsl.craftattack.core.appliance.Appliance; import eu.mhsl.craftattack.core.appliance.Appliance;
import eu.mhsl.craftattack.spawn.common.appliances.metaGameplay.displayName.DisplayName;
import net.kyori.adventure.text.format.TextColor; import net.kyori.adventure.text.format.TextColor;
import org.bukkit.Color; import org.bukkit.Color;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.jetbrains.annotations.Nullable;
public class AdminMarker extends Appliance { public class AdminMarker extends Appliance implements DisplayName.Colored {
public TextColor getPlayerColor(Player player) { @Override
public @Nullable TextColor getNameColor(Player player) {
if(player.hasPermission("chatcolor")) if(player.hasPermission("chatcolor"))
return TextColor.color(Color.AQUA.asRGB()); // TODO read permission from config return TextColor.color(Color.AQUA.asRGB()); // TODO read permission from config
return TextColor.color(Color.WHITE.asRGB()); return TextColor.color(Color.WHITE.asRGB());

View File

@ -2,7 +2,7 @@ package eu.mhsl.craftattack.spawn.craftattack.appliances.metaGameplay.afkTag;
import eu.mhsl.craftattack.core.Main; import eu.mhsl.craftattack.core.Main;
import eu.mhsl.craftattack.core.appliance.Appliance; import eu.mhsl.craftattack.core.appliance.Appliance;
import eu.mhsl.craftattack.spawn.craftattack.appliances.metaGameplay.displayName.DisplayName; import eu.mhsl.craftattack.spawn.common.appliances.metaGameplay.displayName.DisplayName;
import net.kyori.adventure.text.Component; import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.event.HoverEvent; import net.kyori.adventure.text.event.HoverEvent;
import net.kyori.adventure.text.format.NamedTextColor; import net.kyori.adventure.text.format.NamedTextColor;

View File

@ -2,7 +2,7 @@ package eu.mhsl.craftattack.spawn.craftattack.appliances.metaGameplay.sleepTag;
import eu.mhsl.craftattack.core.Main; import eu.mhsl.craftattack.core.Main;
import eu.mhsl.craftattack.core.appliance.Appliance; import eu.mhsl.craftattack.core.appliance.Appliance;
import eu.mhsl.craftattack.spawn.craftattack.appliances.metaGameplay.displayName.DisplayName; import eu.mhsl.craftattack.spawn.common.appliances.metaGameplay.displayName.DisplayName;
import net.kyori.adventure.text.Component; import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.event.HoverEvent; import net.kyori.adventure.text.event.HoverEvent;
import net.kyori.adventure.text.format.NamedTextColor; import net.kyori.adventure.text.format.NamedTextColor;

View File

@ -3,7 +3,7 @@ package eu.mhsl.craftattack.spawn.craftattack.appliances.metaGameplay.yearRank;
import eu.mhsl.craftattack.core.Main; import eu.mhsl.craftattack.core.Main;
import eu.mhsl.craftattack.core.appliance.Appliance; import eu.mhsl.craftattack.core.appliance.Appliance;
import eu.mhsl.craftattack.core.appliance.ApplianceCommand; import eu.mhsl.craftattack.core.appliance.ApplianceCommand;
import eu.mhsl.craftattack.spawn.craftattack.appliances.metaGameplay.displayName.DisplayName; import eu.mhsl.craftattack.spawn.common.appliances.metaGameplay.displayName.DisplayName;
import net.kyori.adventure.text.Component; import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.TextComponent; import net.kyori.adventure.text.TextComponent;
import net.kyori.adventure.text.event.ClickEvent; import net.kyori.adventure.text.event.ClickEvent;