Merge branch 'master' into 1.17

# Conflicts:
#	src/main/java/carpet/logging/HUDController.java
#	src/main/java/carpet/script/api/Auxiliary.java
This commit is contained in:
gnembon committed 2021-04-19 03:51:32 -03:00
commit d636965f59
4 files changed
+72 -55

No files matched your search

+6 -7
View File
@@ -265,7 +265,7 @@ Example usages:
// not a problem in apps // not a problem in apps
</pre> </pre>
### `display_title(players, type, title?, fadeInTicks?, stayTicks?, fadeOutTicks),` ### `display_title(players, type, text?, fadeInTicks?, stayTicks?, fadeOutTicks),`
Sends the player (or players if `players` is a list) a title of a specific type, with optionally some times. Sends the player (or players if `players` is a list) a title of a specific type, with optionally some times.
* `players` is either an online player or a list of players. When sending a single player, it will throw if the player is invalid or offline. * `players` is either an online player or a list of players. When sending a single player, it will throw if the player is invalid or offline.
@@ -277,13 +277,12 @@ Sends the player (or players if `players` is a list) a title of a specific type,
Executing with those will set the times to the specified ones. Executing with those will set the times to the specified ones.
Note that `actionbar` type doesn't support changing times (vanilla bug, see [MC-106167](https://bugs.mojang.com/browse/MC-106167)). Note that `actionbar` type doesn't support changing times (vanilla bug, see [MC-106167](https://bugs.mojang.com/browse/MC-106167)).
### `display_title(players, 'player_list')` ### `display_title(players, 'player_list_header', text)`
### `display_title(players, 'player_list', footer)` ### `display_title(players, 'player_list_footer', text)`
### `display_title(players, 'player_list', header, footer)`
Changes the header and footer of the player list. Changes the header or footer of the player list for the specified targets.
When no `header` and `footer` is specified, they will be reset. If `text` is `null` or an empty string it will remove the header or footer for the specified targets.
Keep in mind this would interfere with carpet's loggers, so if you are using this, you need to keep them off. In case the player has Carpet loggers running, the footer specified by Scarpet will appear above the loggers.
### `logger(msg), logger(type, msg)` ### `logger(msg), logger(type, msg)`
+2 -1
View File
@@ -112,7 +112,7 @@ public class CarpetServer implements ClientModInitializer,DedicatedServerModInit
public static void tick(MinecraftServer server) public static void tick(MinecraftServer server)
{ {
TickSpeed.tick(); TickSpeed.tick();
HUDController.update_hud(server); HUDController.update_hud(server, null);
scriptServer.tick(); scriptServer.tick();
//in case something happens //in case something happens
@@ -180,6 +180,7 @@ public class CarpetServer implements ClientModInitializer,DedicatedServerModInit
currentCommandDispatcher = null; currentCommandDispatcher = null;
LoggerRegistry.stopLoggers(); LoggerRegistry.stopLoggers();
HUDController.resetScarpetHUDs();
extensions.forEach(e -> e.onServerClosed(server)); extensions.forEach(e -> e.onServerClosed(server));
minecraft_server = null; minecraft_server = null;
} }
@@ -21,10 +21,13 @@ import net.minecraft.world.World;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap; import java.util.HashMap;
import java.util.HashSet;
import java.util.List; import java.util.List;
import java.util.Locale; import java.util.Locale;
import java.util.Map; import java.util.Map;
import java.util.Set;
import java.util.function.Consumer; import java.util.function.Consumer;
public class HUDController public class HUDController
@@ -40,9 +43,18 @@ public class HUDController
HUDListeners.add(listener); HUDListeners.add(listener);
} }
public static Map<PlayerEntity, List<BaseText>> player_huds = new HashMap<>(); public static Map<ServerPlayerEntity, List<BaseText>> player_huds = new HashMap<>();
public static void addMessage(PlayerEntity player, BaseText hudMessage) public static final Map<ServerPlayerEntity, BaseText> scarpet_headers = new HashMap<>();
public static final Map<ServerPlayerEntity, BaseText> scarpet_footers = new HashMap<>();
public static void resetScarpetHUDs() {
scarpet_headers.clear();
scarpet_footers.clear();
}
public static void addMessage(ServerPlayerEntity player, BaseText hudMessage)
{ {
if (!player_huds.containsKey(player)) if (!player_huds.containsKey(player))
{ {
@@ -64,13 +76,15 @@ public class HUDController
} }
public static void update_hud(MinecraftServer server) public static void update_hud(MinecraftServer server, List<ServerPlayerEntity> force)
{ {
if(server.getTicks() % 20 != 0 || CarpetServer.minecraft_server == null) if (((server.getTicks() % 20 != 0) && force == null) || CarpetServer.minecraft_server == null)
return; return;
player_huds.clear(); player_huds.clear();
scarpet_footers.forEach(HUDController::addMessage);
if (LoggerRegistry.__tps) if (LoggerRegistry.__tps)
LoggerRegistry.getLogger("tps").log(()-> send_tps_display(server)); LoggerRegistry.getLogger("tps").log(()-> send_tps_display(server));
@@ -101,7 +115,9 @@ public class HUDController
// extensions have time to pitch in. // extensions have time to pitch in.
HUDListeners.forEach(l -> l.accept(server)); HUDListeners.forEach(l -> l.accept(server));
for (PlayerEntity player: player_huds.keySet()) Set<ServerPlayerEntity> targets = new HashSet<>(player_huds.keySet());
if (force!= null) targets.addAll(force);
for (ServerPlayerEntity player: targets)
{ {
PacketByteBuf packetData = new PacketByteBuf(Unpooled.buffer()). PacketByteBuf packetData = new PacketByteBuf(Unpooled.buffer()).
writeText(new LiteralText("")). writeText(new LiteralText("")).
@@ -109,9 +125,9 @@ public class HUDController
PlayerListHeaderS2CPacket packet = new PlayerListHeaderS2CPacket(packetData); PlayerListHeaderS2CPacket packet = new PlayerListHeaderS2CPacket(packetData);
//PlayerListHeaderS2CPacket packet = new PlayerListHeaderS2CPacket(); //PlayerListHeaderS2CPacket packet = new PlayerListHeaderS2CPacket();
//((PlayerListHeaderS2CPacketMixin)packet).setHeader(new LiteralText("")); //((PlayerListHeaderS2CPacketMixin)packet).setHeader(scarpet_headers.getOrDefault(player, new LiteralText("")));
//((PlayerListHeaderS2CPacketMixin)packet).setFooter(Messenger.c(player_huds.get(player).toArray(new Object[0]))); //((PlayerListHeaderS2CPacketMixin)packet).setFooter(Messenger.c(player_huds.getOrDefault(player, Collections.emptyList()).toArray(new Object[0])));
((ServerPlayerEntity)player).networkHandler.sendPacket(packet); player.networkHandler.sendPacket(packet);
} }
} }
private static BaseText [] send_tps_display(MinecraftServer server) private static BaseText [] send_tps_display(MinecraftServer server)
+40 -39
View File
@@ -7,6 +7,7 @@ import carpet.fakes.ServerWorldInterface;
import carpet.fakes.StatTypeInterface; import carpet.fakes.StatTypeInterface;
import carpet.fakes.ThreadedAnvilChunkStorageInterface; import carpet.fakes.ThreadedAnvilChunkStorageInterface;
import carpet.helpers.FeatureGenerator; import carpet.helpers.FeatureGenerator;
import carpet.logging.HUDController;
import carpet.script.argument.FileArgument; import carpet.script.argument.FileArgument;
import carpet.script.CarpetContext; import carpet.script.CarpetContext;
import carpet.script.CarpetEventServer; import carpet.script.CarpetEventServer;
@@ -79,6 +80,7 @@ import net.minecraft.server.world.ServerWorld;
import net.minecraft.sound.SoundCategory; import net.minecraft.sound.SoundCategory;
import net.minecraft.stat.Stat; import net.minecraft.stat.Stat;
import net.minecraft.stat.StatType; import net.minecraft.stat.StatType;
import net.minecraft.text.BaseText;
import net.minecraft.text.LiteralText; import net.minecraft.text.LiteralText;
import net.minecraft.text.Text; import net.minecraft.text.Text;
import net.minecraft.util.Identifier; import net.minecraft.util.Identifier;
@@ -580,56 +582,55 @@ public class Auxiliary {
packetGetter = (x) -> new ClearTitleS2CPacket(true); // resetting default fade packetGetter = (x) -> new ClearTitleS2CPacket(true); // resetting default fade
//action = Action.CLEAR; //action = Action.CLEAR;
break; break;
case "player_list": case "player_list_header":
Text footer; case "player_list_footer":
Text header; action = null;
break;
if(lv.size() == 2) {
footer = new LiteralText("");
header = new LiteralText("");
} else if(lv.size() == 3) {
pVal = lv.get(2).evalValue(c);
if (pVal instanceof FormattedTextValue)
footer = ((FormattedTextValue) pVal).getText();
else
footer = new LiteralText(pVal.getString());
header = new LiteralText("");
} else {
pVal = lv.get(2).evalValue(c);
if (pVal instanceof FormattedTextValue)
header = ((FormattedTextValue) pVal).getText();
else
header = new LiteralText(pVal.getString());
pVal = lv.get(3).evalValue(c);
if (pVal instanceof FormattedTextValue)
footer = ((FormattedTextValue) pVal).getText();
else
footer = new LiteralText(pVal.getString());
}
PlayerListHeaderS2CPacket packet = new PlayerListHeaderS2CPacket(header, footer);
AtomicInteger total = new AtomicInteger(0);
targets.forEach(p -> {
p.networkHandler.sendPacket(packet);
total.getAndIncrement();
});
Value ret = NumericValue.of(total.get());
return (cc, tt) -> ret;
default: default:
throw new InternalExpressionException("'display_title' requires 'title', 'subtitle', 'actionbar', 'player_list' or 'clear' as second argument"); throw new InternalExpressionException("'display_title' requires 'title', 'subtitle', 'actionbar', 'player_list_header', 'player_list_footer' or 'clear' as second argument");
} }
//if (action != Action.CLEAR && lv.size() < 3) //if (action != Action.CLEAR && lv.size() < 3)
// throw new InternalExpressionException("Third argument of 'display_title' must be present except for 'clear' type"); // throw new InternalExpressionException("Third argument of 'display_title' must be present except for 'clear' type");
Text title = null; Text title;
boolean soundsTrue = false;
if (lv.size() > 2) if (lv.size() > 2)
{ {
pVal = lv.get(2).evalValue(c); pVal = lv.get(2).evalValue(c);
if (pVal instanceof FormattedTextValue) if (pVal instanceof FormattedTextValue)
{
title = ((FormattedTextValue) pVal).getText(); title = ((FormattedTextValue) pVal).getText();
soundsTrue = !title.asString().isEmpty();
}
else else
{
title = new LiteralText(pVal.getString()); title = new LiteralText(pVal.getString());
soundsTrue = pVal.getBoolean();
}
}
else title = null; // Will never happen, just to make lambda happy
if (action == null)
{
Map<ServerPlayerEntity, BaseText> map;
if (actionString.equals("player_list_header"))
map = HUDController.scarpet_headers;
else
map = HUDController.scarpet_footers;
AtomicInteger total = new AtomicInteger(0);
List<ServerPlayerEntity> targetList = targets.collect(Collectors.toList());
if (!soundsTrue) // null or empty string
targetList.forEach(target -> {
map.remove(target);
total.getAndIncrement();
});
else
targetList.forEach(target -> {
map.put(target, (BaseText) title);
total.getAndIncrement();
});
HUDController.update_hud(((CarpetContext)c).s.getMinecraftServer(), targetList);
Value ret = NumericValue.of(total.get());
return (cc, tt) -> ret;
} }
TitleFadeS2CPacket timesPacket; // TimesPacket TitleFadeS2CPacket timesPacket; // TimesPacket
if (lv.size() > 3) if (lv.size() > 3)