Make player_list take arguments one at a time and make it compatible with loggers (#819)

* Make `player_list` take arguments one at a time and make it compatible with loggers

* Update docs for `player_list` modification
This commit is contained in:
altrisi authored and GitHub committed 2021-04-19 02:31:54 -03:00
1 parent b7b7667484
commit 1819694d19
4 files changed
+54 -55

No files matched your search

+2 -1
View File
@@ -112,7 +112,7 @@ public class CarpetServer implements ClientModInitializer,DedicatedServerModInit
public static void tick(MinecraftServer server)
{
TickSpeed.tick();
HUDController.update_hud(server);
HUDController.update_hud(server, false);
scriptServer.tick();
//in case something happens
@@ -180,6 +180,7 @@ public class CarpetServer implements ClientModInitializer,DedicatedServerModInit
currentCommandDispatcher = null;
LoggerRegistry.stopLoggers();
HUDController.resetScarpetHUDs();
extensions.forEach(e -> e.onServerClosed(server));
minecraft_server = null;
}
@@ -39,6 +39,15 @@ public class HUDController
}
public static Map<PlayerEntity, List<BaseText>> player_huds = new HashMap<>();
public static final Map<PlayerEntity, BaseText> scarpet_headers = new HashMap<>();
public static final Map<PlayerEntity, BaseText> scarpet_footers = new HashMap<>();
public static void resetScarpetHUDs() {
scarpet_headers.clear();
scarpet_footers.clear();
}
public static void addMessage(PlayerEntity player, BaseText hudMessage)
{
@@ -61,13 +70,15 @@ public class HUDController
}
public static void update_hud(MinecraftServer server)
public static void update_hud(MinecraftServer server, boolean force)
{
if(server.getTicks() % 20 != 0 || CarpetServer.minecraft_server == null)
if ((server.getTicks() % 20 != 0 && !force) || CarpetServer.minecraft_server == null)
return;
player_huds.clear();
scarpet_footers.forEach((p, m) -> addMessage(p, m));
if (LoggerRegistry.__tps)
LoggerRegistry.getLogger("tps").log(()-> send_tps_display(server));
@@ -101,7 +112,7 @@ public class HUDController
for (PlayerEntity player: player_huds.keySet())
{
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])));
((ServerPlayerEntity)player).networkHandler.sendPacket(packet);
}
+32 -44
View File
@@ -7,8 +7,7 @@ import carpet.fakes.ServerWorldInterface;
import carpet.fakes.StatTypeInterface;
import carpet.fakes.ThreadedAnvilChunkStorageInterface;
import carpet.helpers.FeatureGenerator;
import carpet.mixins.PlayerListHeaderS2CPacketMixin;
import carpet.script.bundled.Module;
import carpet.logging.HUDController;
import carpet.script.argument.FileArgument;
import carpet.script.CarpetContext;
import carpet.script.CarpetEventServer;
@@ -59,7 +58,6 @@ import net.minecraft.nbt.NbtOps;
import net.minecraft.nbt.StringTag;
import net.minecraft.nbt.Tag;
import net.minecraft.network.packet.s2c.play.PlaySoundIdS2CPacket;
import net.minecraft.network.packet.s2c.play.PlayerListHeaderS2CPacket;
import net.minecraft.network.packet.s2c.play.TitleS2CPacket;
import net.minecraft.network.packet.s2c.play.TitleS2CPacket.Action;
import net.minecraft.particle.ParticleEffect;
@@ -75,6 +73,7 @@ import net.minecraft.server.world.ServerWorld;
import net.minecraft.sound.SoundCategory;
import net.minecraft.stat.Stat;
import net.minecraft.stat.StatType;
import net.minecraft.text.BaseText;
import net.minecraft.text.LiteralText;
import net.minecraft.text.Text;
import net.minecraft.util.Identifier;
@@ -562,51 +561,16 @@ public class Auxiliary {
case "clear":
action = Action.CLEAR;
break;
case "player_list":
Text footer;
Text header;
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();
((PlayerListHeaderS2CPacketMixin) packet).setFooter(footer);
((PlayerListHeaderS2CPacketMixin) packet).setHeader(header);
AtomicInteger total = new AtomicInteger(0);
targets.forEach(p -> {
p.networkHandler.sendPacket(packet);
total.getAndIncrement();
});
Value ret = NumericValue.of(total.get());
return (cc, tt) -> ret;
case "player_list_header":
case "player_list_footer":
action = null;
break;
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)
throw new InternalExpressionException("Third argument of 'display_title' must be present except for 'clear' type");
Text title = null;
Text title;
if (lv.size() > 2)
{
pVal = lv.get(2).evalValue(c);
@@ -615,6 +579,30 @@ public class Auxiliary {
else
title = new LiteralText(pVal.getString());
}
else title = null; // Will never happen, just to make lambda happy
if (action == null)
{
Map<PlayerEntity, BaseText> 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 -> {
map.remove(target);
total.getAndIncrement();
});
else
targets.forEach(target -> {
map.put(target, (BaseText) title);
total.getAndIncrement();
});
HUDController.update_hud(((CarpetContext)c).s.getMinecraftServer(), true);
Value ret = NumericValue.of(total.get());
return (cc, tt) -> ret;
}
TitleS2CPacket timesPacket;
if (lv.size() > 3)
{