Skip to content

Instantly share code, notes, and snippets.

@HSGamer
Last active April 30, 2023 11:34
Show Gist options
  • Save HSGamer/1f624ef36ee5221222ac60c5241cef3c to your computer and use it in GitHub Desktop.
Save HSGamer/1f624ef36ee5221222ac60c5241cef3c to your computer and use it in GitHub Desktop.
Minestom - Per-Instance Tablist
import net.minestom.server.MinecraftServer;
import net.minestom.server.entity.Player;
import net.minestom.server.entity.PlayerSkin;
import net.minestom.server.event.Event;
import net.minestom.server.event.EventNode;
import net.minestom.server.event.instance.RemoveEntityFromInstanceEvent;
import net.minestom.server.event.player.PlayerSpawnEvent;
import net.minestom.server.instance.Instance;
import net.minestom.server.network.packet.server.play.PlayerInfoPacket;
import net.minestom.server.tag.Tag;
import net.minestom.server.utils.PacketUtils;
import java.util.List;
public class PerInstanceInstanceViewHook {
private static final Tag<Boolean> firstSpawnTag = Tag.Boolean("InstanceViewHook:FirstSpawn").defaultValue(true);
public static void hook(EventNode<Event> node) {
node.addListener(PlayerSpawnEvent.class, event -> {
var player = event.getPlayer();
var instance = event.getSpawnInstance();
PacketUtils.sendGroupedPacket(instance.getPlayers(), getAddPlayerPacket(player), player1 -> player1 != player);
if (Boolean.TRUE.equals(player.getTag(firstSpawnTag))) { // On First Spawn
for (Player onlinePlayer : MinecraftServer.getConnectionManager().getOnlinePlayers()) {
if (onlinePlayer == player || onlinePlayer.getInstance() == instance) continue;
PacketUtils.sendPacket(player, getRemovePlayerPacket(onlinePlayer));
PacketUtils.sendPacket(onlinePlayer, getAddPlayerPacket(player));
}
player.setTag(firstSpawnTag, false);
} else { // On Switch Instance
for (Player instancePlayer : instance.getPlayers()) {
if (instancePlayer == player) continue;
PacketUtils.sendPacket(player, getAddPlayerPacket(instancePlayer));
}
}
}).addListener(RemoveEntityFromInstanceEvent.class, event -> {
if (!(event.getEntity() instanceof Player player)) return;
Instance instance = event.getInstance();
PacketUtils.sendGroupedPacket(instance.getPlayers(), getRemovePlayerPacket(player), player1 -> player1 != player);
for (Player instancePlayer : instance.getPlayers()) {
if (instancePlayer == player) continue;
PacketUtils.sendPacket(player, getRemovePlayerPacket(instancePlayer));
}
});
}
private static PlayerInfoPacket getAddPlayerPacket(Player player) {
final PlayerSkin skin = player.getSkin();
List<PlayerInfoPacket.AddPlayer.Property> prop = skin != null ?
List.of(new PlayerInfoPacket.AddPlayer.Property("textures", skin.textures(), skin.signature())) :
List.of();
return new PlayerInfoPacket(PlayerInfoPacket.Action.ADD_PLAYER,
new PlayerInfoPacket.AddPlayer(player.getUuid(), player.getUsername(), prop, player.getGameMode(), player.getLatency(), player.getDisplayName(), null));
}
private static PlayerInfoPacket getRemovePlayerPacket(Player player) {
return new PlayerInfoPacket(PlayerInfoPacket.Action.REMOVE_PLAYER, new PlayerInfoPacket.RemovePlayer(player.getUuid()));
}
}
@HSGamer
Copy link
Author

HSGamer commented Oct 18, 2022

Update to the latest Minestom & use PlayerSpawnEvent for more consistency.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment