diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/scoreboard/ServerScoreboardMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/scoreboard/ServerScoreboardMixin.java new file mode 100644 index 000000000..3d8445f23 --- /dev/null +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/scoreboard/ServerScoreboardMixin.java @@ -0,0 +1,40 @@ +package io.izzel.arclight.common.mixin.core.scoreboard; + +import io.izzel.arclight.common.bridge.entity.player.ServerPlayerEntityBridge; +import net.minecraft.entity.player.ServerPlayerEntity; +import net.minecraft.network.IPacket; +import net.minecraft.scoreboard.ServerScoreboard; +import net.minecraft.server.management.PlayerList; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Redirect; + +import java.util.List; +import java.util.stream.Collectors; + +@Mixin(ServerScoreboard.class) +public class ServerScoreboardMixin { + + @Redirect(method = "addObjective", at = @At(value = "INVOKE", target = "Lnet/minecraft/server/management/PlayerList;getPlayers()Ljava/util/List;")) + private List arclight$filterAdd(PlayerList playerList) { + return filterPlayer(playerList.getPlayers()); + } + + @Redirect(method = "sendDisplaySlotRemovalPackets", at = @At(value = "INVOKE", target = "Lnet/minecraft/server/management/PlayerList;getPlayers()Ljava/util/List;")) + private List arclight$filterRemove(PlayerList playerList) { + return filterPlayer(playerList.getPlayers()); + } + + @Redirect(method = "*", require = 11, at = @At(value = "INVOKE", target = "Lnet/minecraft/server/management/PlayerList;sendPacketToAllPlayers(Lnet/minecraft/network/IPacket;)V")) + private void arclight$sendToOwner(PlayerList playerList, IPacket packetIn) { + for (ServerPlayerEntity entity : filterPlayer(playerList.getPlayers())) { + entity.connection.sendPacket(packetIn); + } + } + + private List filterPlayer(List list) { + return list.stream() + .filter(it -> ((ServerPlayerEntityBridge) it).bridge$getBukkitEntity().getScoreboard().getHandle() == (Object) this) + .collect(Collectors.toList()); + } +} diff --git a/arclight-common/src/main/resources/mixins.arclight.core.json b/arclight-common/src/main/resources/mixins.arclight.core.json index 622329807..383d74f85 100644 --- a/arclight-common/src/main/resources/mixins.arclight.core.json +++ b/arclight-common/src/main/resources/mixins.arclight.core.json @@ -334,6 +334,7 @@ "network.rcon.RConConsoleSourceMixin", "network.status.ServerStatusNetHandlerMixin", "potion.EffectMixin", + "scoreboard.ServerScoreboardMixin", "server.CustomServerBossInfoMixin", "server.MinecraftServerMixin", "server.dedicated.DedicatedServerMixin",