Here is the (stripped down)code for spawning the players:
public static boolean createFake(String username, MinecraftServer server, Vec3d pos, double yaw, double pitch, RegistryKey<World> dimensionId, GameMode gamemode, boolean flying)
{
String name = gameprofile.getName();
spawning.add(name);
fetchGameProfile(name).whenCompleteAsync((p, t) -> { spawning.remove(name);
if (t != null)
{
return;
}
GameProfile current = finalGP;
if (p.isPresent())
{
current = p.get();
}
EntityPlayerMPFake instance = new EntityPlayerMPFake(server, worldIn, current, SyncedClientOptions.createDefault(), false);
instance.fixStartingPosition = () -> instance.refreshPositionAndAngles(pos.x, pos.y, pos.z, (float) yaw, (float) pitch);
server.getPlayerManager().onPlayerConnect(new FakeClientConnection(NetworkSide.SERVERBOUND), instance, new ConnectedClientData(current, 0, instance.getClientOptions(), false));
instance.teleport(worldIn, pos.x, pos.y, pos.z, Set.of(), (float) yaw, (float) pitch, true);
instance.setHealth(20.0F);
instance.unsetRemoved();
instance.getAttributeInstance(EntityAttributes.STEP_HEIGHT).setBaseValue(0.6F);
instance.interactionManager.changeGameMode(gamemode);
server.getPlayerManager().sendToDimension(new EntitySetHeadYawS2CPacket(instance, (byte) (instance.headYaw * 256 / 360)), dimensionId);
server.getPlayerManager().sendToDimension(EntityPositionSyncS2CPacket.create(instance), dimensionId);
instance.dataTracker.set(PLAYER_MODEL_PARTS, (byte) 0x7f);
instance.getAbilities().flying = flying;
}, server);
return true;
}