[QS]faces is a minimal fork of stock [AV]faces that takes the sitter count from QSALIVE (90096/90097) instead of walking [AV]sitA N script names, and publishes the QS presence flag qs:alive:faces so [QS]sitB and [QS]adjuster can gate the [FACES] / [FACE] menu items without an inventory probe.
Behavior is otherwise identical to stock: drop [QS]faces into a stock-AVsitter prim and it works too. The reverse is degraded: a stock [AV]faces in a QS prim finds no [AV]sitA N scripts to count (faces play for sitter 0 at best, nothing on the other slots), and without the qs:alive:faces flag the [FACES] / [FACE] menu entries never appear.
Notecard syntax (unchanged from stock)
Face animations are declared with ANIM directives in AVpos, one per line. The format is:
ANIM <trigger>|<expression>|<duration>|<expression>|<duration>|...
Where <trigger> is a pose name (the face animation plays when that pose is selected), and each <expression>|<duration> pair specifies an SL face animation plus how long to hold it (in seconds). You can chain as many <expression>|<duration> pairs on one line as you like; the parser walks the whole list.
Examples:
ANIM Happy|express_laugh_emote|5|express_smile|1|express_wink_emote|2
ANIM Sleep|express_disdain|1|express_smile|1
You can also reference an existing ANIM line by trigger name to reuse it:
ANIM pose1|express_laugh_emote|5|express_smile|1
ANIM pose2|pose1
Full reference in the upstream AVfaces page.
QS addition: presence via qs:alive:faces
[QS]faces advertises its presence by writing the LSD flag qs:alive:faces early in state_entry (the offset uses the inverted qs:offset:alive; faces uses the plain qs:alive:faces). It re-stamps the flag whenever boot broadcasts QS_ALIVE_CENSUS (90079), and removes nothing on its own, because boot wipes all qs:alive:* on a census and only the survivors re-write, so a removed faces script simply stops re-stamping.
[QS]sitB and [QS]adjuster read the flag on demand at menu-build time (never cached) and gate menu items on it:
// at menu build, on demand:
integer faces_present = (llLinksetDataRead("qs:alive:faces") != "");
If qs:alive:faces is unset when the menu is built, the [FACES] entry (in [QS]sitB’s pose menu) and the [FACE] entry (in the [QS]adjuster picker) don’t appear. There is no [EXPRESSION] button. No inventory probe and no script-name binding, so the gating works regardless of whether the script is named [QS]faces, [FOO]faces, or anything else.
The HELLO presence broadcasts (the retired 90088–90092 band, which once included a QS_FACES_HELLO) were removed in 0.9951 in favour of the qs:alive:* flags.
Stock-diff summary
Total changes from stock [AV]faces:
- Sitter count via QSALIVE (90096/90097): the primary fork change. It replaces stock’s
string main_script = "[AV]sitA"inventory-walk for counting sitters (defaulting to 7 until the first 90097 reply lands, then the real count), and adds the project-wideOut()/qs:cfg:verboseverbose ladder. - Presence via the
qs:alive:facesLSD flag: written instate_entry, re-stamped onQS_ALIVE_CENSUS(90079), read on demand. Same pattern as[QS]prop. - QSDUMP integration: announces on 90095 so face entries are included in
[DUMP]output. - Version string + header comment block.
See also
- Upstream AVfaces documentation:
ANIMsection syntax. - QSALIVE Discovery: sibling presence broadcasts.
- LinkMessage Numbers: fork-specific number map.
