diff --git a/src/main/java/carpet/CarpetServer.java b/src/main/java/carpet/CarpetServer.java index 846f4773..ae9e4dce 100644 --- a/src/main/java/carpet/CarpetServer.java +++ b/src/main/java/carpet/CarpetServer.java @@ -112,7 +112,7 @@ public class CarpetServer implements ClientModInitializer,DedicatedServerModInit public static void tick(MinecraftServer server) { TickSpeed.tick(); - HUDController.update_hud(server, false); + HUDController.update_hud(server, null); scriptServer.tick(); //in case something happens diff --git a/src/main/java/carpet/logging/HUDController.java b/src/main/java/carpet/logging/HUDController.java index fa0882d9..b3e3937a 100644 --- a/src/main/java/carpet/logging/HUDController.java +++ b/src/main/java/carpet/logging/HUDController.java @@ -19,10 +19,13 @@ import net.minecraft.world.World; import java.util.ArrayList; import java.util.Arrays; +import java.util.Collections; import java.util.HashMap; +import java.util.HashSet; import java.util.List; import java.util.Locale; import java.util.Map; +import java.util.Set; import java.util.function.Consumer; public class HUDController @@ -38,18 +41,18 @@ public class HUDController HUDListeners.add(listener); } - public static Map> player_huds = new HashMap<>(); + public static Map> player_huds = new HashMap<>(); - public static final Map scarpet_headers = new HashMap<>(); + public static final Map scarpet_headers = new HashMap<>(); - public static final Map scarpet_footers = new HashMap<>(); + public static final Map scarpet_footers = new HashMap<>(); public static void resetScarpetHUDs() { scarpet_headers.clear(); scarpet_footers.clear(); } - public static void addMessage(PlayerEntity player, BaseText hudMessage) + public static void addMessage(ServerPlayerEntity player, BaseText hudMessage) { if (!player_huds.containsKey(player)) { @@ -70,9 +73,9 @@ public class HUDController } - public static void update_hud(MinecraftServer server, boolean force) + public static void update_hud(MinecraftServer server, List force) { - if ((server.getTicks() % 20 != 0 && !force) || CarpetServer.minecraft_server == null) + if (((server.getTicks() % 20 != 0) && force == null) || CarpetServer.minecraft_server == null) return; player_huds.clear(); @@ -109,12 +112,14 @@ public class HUDController // extensions have time to pitch in. HUDListeners.forEach(l -> l.accept(server)); - for (PlayerEntity player: player_huds.keySet()) + Set targets = new HashSet<>(player_huds.keySet()); + if (force!= null) targets.addAll(force); + for (ServerPlayerEntity player: targets) { PlayerListHeaderS2CPacket packet = new PlayerListHeaderS2CPacket(); ((PlayerListHeaderS2CPacketMixin)packet).setHeader(scarpet_headers.getOrDefault(player, new LiteralText(""))); - ((PlayerListHeaderS2CPacketMixin)packet).setFooter(Messenger.c(player_huds.get(player).toArray(new Object[0]))); - ((ServerPlayerEntity)player).networkHandler.sendPacket(packet); + ((PlayerListHeaderS2CPacketMixin)packet).setFooter(Messenger.c(player_huds.getOrDefault(player, Collections.emptyList()).toArray(new Object[0]))); + player.networkHandler.sendPacket(packet); } } private static BaseText [] send_tps_display(MinecraftServer server) diff --git a/src/main/java/carpet/script/api/Auxiliary.java b/src/main/java/carpet/script/api/Auxiliary.java index c2d96cc0..0288f0aa 100644 --- a/src/main/java/carpet/script/api/Auxiliary.java +++ b/src/main/java/carpet/script/api/Auxiliary.java @@ -571,35 +571,43 @@ public class Auxiliary { if (action != Action.CLEAR && lv.size() < 3) throw new InternalExpressionException("Third argument of 'display_title' must be present except for 'clear' type"); Text title; + boolean soundsTrue = false; if (lv.size() > 2) { pVal = lv.get(2).evalValue(c); if (pVal instanceof FormattedTextValue) + { title = ((FormattedTextValue) pVal).getText(); + soundsTrue = !title.asString().isEmpty(); + } else + { title = new LiteralText(pVal.getString()); + soundsTrue = pVal.getBoolean(); + } } else title = null; // Will never happen, just to make lambda happy if (action == null) { - Map map; + Map map; if (actionString.equals("player_list_header")) map = HUDController.scarpet_headers; else map = HUDController.scarpet_footers; AtomicInteger total = new AtomicInteger(0); - if (!lv.get(2).evalValue(c).getBoolean()) // null or empty string - targets.forEach(target -> { + List targetList = targets.collect(Collectors.toList()); + if (!soundsTrue) // null or empty string + targetList.forEach(target -> { map.remove(target); total.getAndIncrement(); }); else - targets.forEach(target -> { + targetList.forEach(target -> { map.put(target, (BaseText) title); total.getAndIncrement(); }); - HUDController.update_hud(((CarpetContext)c).s.getMinecraftServer(), true); + HUDController.update_hud(((CarpetContext)c).s.getMinecraftServer(), targetList); Value ret = NumericValue.of(total.get()); return (cc, tt) -> ret; }