Implement per player scoreboard

This commit is contained in:
IzzelAliz 2021-01-22 13:46:34 +08:00
parent f10254f9ea
commit 26f9fd0cb0
2 changed files with 41 additions and 0 deletions

View File

@ -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<ServerPlayerEntity> 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<ServerPlayerEntity> 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<ServerPlayerEntity> filterPlayer(List<ServerPlayerEntity> list) {
return list.stream()
.filter(it -> ((ServerPlayerEntityBridge) it).bridge$getBukkitEntity().getScoreboard().getHandle() == (Object) this)
.collect(Collectors.toList());
}
}

View File

@ -358,6 +358,7 @@
"network.rcon.RConConsoleSourceMixin", "network.rcon.RConConsoleSourceMixin",
"network.status.ServerStatusNetHandlerMixin", "network.status.ServerStatusNetHandlerMixin",
"potion.EffectMixin", "potion.EffectMixin",
"scoreboard.ServerScoreboardMixin",
"server.CustomServerBossInfoMixin", "server.CustomServerBossInfoMixin",
"server.MainMixin", "server.MainMixin",
"server.MinecraftServerMixin", "server.MinecraftServerMixin",