QuickySitter is open-source under MPL 2.0. Contributions are welcome via pull requests against QuickyProducts/QuickySitter.
This page covers practical conventions specific to QS. For LSL coding norms in general, the Second Life LSL Portal is the canonical reference.
Workflow
- Fork the repo on GitHub, or create a feature branch if you have push access.
- Make your changes, following the conventions below.
- Bump each touched script’s version: default
+0.0001, or round up to the next hundredth for a feature or blocker fix. Numbers are per-script and drift independently between releases (see Version Bump Convention). - Test in-world: at minimum, follow the relevant scenarios in
qs/test/TESTPLAN.md. - Open a PR with a description of what changed and why.
- Update
qs/PROTOCOL.mdand/orqs/STORAGE.mdin the same PR if protocol behavior or state layout changes.
Coding conventions
LSL gotchas to follow
These are project-wide conventions worth re-stating because they’ve each caused regressions in the past:
llParseString2ListoverllParseStringKeepNulls. KeepNulls keeps trailing empty fields, which several QS handlers misinterpret as valid (empty) data and crash on. Trim empties unless you have a clear reason not to.- No
llOwnerSayin hot paths. A passivellOwnerSaylog on a script that runs in N sitter slots multiplies by N on furniture-heavy regions and floods the owner’s chat. Use on-demand dialog reports or gate behind abDebugflag. - Reserved identifiers.
stateis a keyword. So are all type names (integer,string,list,vector,rotation,float). Use Hungarian prefixes (sKey,iState) or descriptive names (lsd_key). - LSL has no sequence point in
&&.(var = f()) != "" && other(var)reads a stalevarin the second operand. Read, then check; don’t assign in conditions. - LSD return-code literals.
LINKSETDATA_MEMFULLand friends are viewer-dependent constants; not portable. Use literal int values with an inline comment. OnlyLINKSETDATA_OKandLINKSETDATA_RESETare guaranteed. - No script-name inventory probes. Don’t add
llGetInventoryType("[QS]sitA")checks. Use QSALIVE (90096/90097) instead, because names are not stable across forks. - AVpos
MENUvsTOMENU.MENUis a section marker only;TOMENUis the clickable button that opens the submenu. A top-level menu without a matchingTOMENUdoesn’t render.
Language for written output
Code, comments, file content, commit messages, PR descriptions: all English. The repo’s working language is English regardless of where contributors live. Touch-as-you-migrate; no sweep PRs converting in-place comments.
Comments
Default to writing no comments. The exception is hidden constraints, subtle invariants, workarounds for specific bugs, or behavior that would surprise a reader. Don’t explain WHAT the code does, because well-named identifiers handle that. Don’t reference the current task (“used by X”, “added for the Y flow”, “handles issue #123”). That belongs in the PR description and rots as the code evolves.
A comment that would still be true and useful in 2 years is the bar.
Update announcements in PRs
When a PR touches script versions, the PR description starts with the file + bump list, each with its own number:
**Update:** [QS]sitA 1.04 → 1.0401, [QS]boot 1.04 → 1.0401
This makes review queues easy to skim for “which scripts changed, and to what.”
Documentation
Documentation lives in two places:
qs/PROTOCOL.mdandqs/STORAGE.mdin the script repo, canonical for protocol and state details. Same PR as the code.- This site (QuickyProducts/QuickySitter-docs): user-facing reference, derived from the in-repo design docs.
If your PR changes a link-message contract, update PROTOCOL.md in the same PR. Updating this docs site can come in a follow-up; the in-repo doc is what reviewers and other contributors read first.
Licensing
By contributing you agree your contributions are licensed under MPL 2.0 (code) or CC-BY-SA 4.0 (documentation), matching the rest of the project. The boilerplate license header at the top of each [QS]*.lsl carries the AVsitter Contributors copyright notice, so keep it intact when forking a stock script.
See also
- Repo Structure: what lives where in the source tree.
- Version Bump Convention: the per-script +0.0001 default and feature round-up rule.
- Debug Flags: how to instrument new code temporarily.
